2015-04-06 170 views
3

我想從一個矩陣類中提取一列,其中的變量A實現爲<vector<vector<T> >,像這樣my_matrix(,2)並且應該提取我的第二列。此外,我不想要一個函數名稱get_col,因爲我已經使用operator()重載來提取行。我試過了:在C++中從矩陣中提取列

template<class T> 
vector<T> & operator()(void, const int& col){ 
    vector<T> Result(rows,0); 
    for(int i=0;i<rows;++i) 
     Result[i]=this->A[i][col]; 
    return Result; 
} 

有什麼建議嗎?

類包括:

template <class T> class QMatrix{ 
public: 
    int rows; 
    int cols; 
    vector<vector<T> > A; 
+1

這個語法在C++中是不可能的。 –

+0

也許我們可以使用一個把戲:) – moldovean

回答

3

func(,2)是不是在C++的法律,有沒有辦法來實現這一目標。

您可以使用operator()來訪問矩陣中的一個單元格,並且具有一個檢索整行的row函數和一個檢索列的函數。

或者你可以重載operator[]獲得一個列,但我懷疑這會混淆你的用戶相當多。我懷疑超載operator()得到單行也會混淆你的用戶,這不是很C++ - y。

+0

我去重載運算符()。 (int,int)用於矩陣的元素,(int)用於行 – moldovean

0

由於內存中數組的佈局,遍歷數組的列與線訪問相比非常昂貴。這使得在C++中逐列訪問數組很糟糕。

定義成員函數或重載操作符只是隱藏實現它的唯一方法:轉到每一行並轉到您想要訪問的列。

你可以怎麼定義一個函數返回一個vector,該函數持有指針或引用(你將需要使用像std::reference_wrapper這樣的包裝)到特定列的元素。要創建該向量,您需要再次訪問每個子向量並將參考/ ptr獲取到第n個元素。

+0

我已經做了 – moldovean

+0

不在您的代碼上面 – Otomo

1

快速執行此操作的一種方法(可能適用於非 - 大型矩陣)是將2個佈局存儲在內存中:一個用於矩陣,另一個用於其轉置。通過這種方式,您可以順序訪問,並且訪問速度相當快(即,訪問第k列將等於從k*col_num(k+1)*col_num的指針*row訪問,而訪問第k列將訪問其他指針*colk*row_num(k+1)*row_num

你失去了在存儲空間(即,需要複製的元素)的訪問時間,但收益。如果你對付比較小的矩陣,但頻繁的讀數,這可能是一種方式

否則,您可以將您的矩陣存儲爲一維向量,並通過二維索引訪問它,如M[i][j] = vec[i*col_num + j]

只要做一些基準測試,看看什麼最適合您的使用情況。

+0

這是一個有趣的想法..做一個轉置,然後獲取行的A(int) 。每次更改矩陣時,都必須轉置每個矩陣,並更新其轉置(甚至更糟糕的是計算新的轉置)。 – moldovean

+0

如果您經常或順序更改元素,這會帶來很大的不便 – Otomo

+0

@Otto確實是 – vsoftco