2012-12-08 31 views
0

我正在使用Eigen C++矩陣庫,並且想要獲取對矩陣列的引用。該文檔說使用matrix_object.col(index),但這似乎是返回表示該列的對象,而不是簡單地引用原始矩陣對象內的列。我擔心這會涉及不必要地複製該列中的元素,因爲更改列對象中的值不會影響原始矩陣。Eigen:通過引用訪問矩陣的列

如果有人比我更熟悉Eigen,使用此函數訪問矩陣的列仍然有效嗎?如果不是,我怎麼才能得到矩陣內原始列的引用?

回答

1

首先,這顯然只適用於列主矩陣。這就是Eigen所默認的,但是你依賴它的時候應該明確它。

然後,爲了確保不會有額外的代理對象成本,您可以使用data()來獲得一個指向整個矩陣存儲的普通指針,並將其增加適當的量。例如,以訪問在n×n矩陣mj列,第

auto jth_column = m.data() + n*j; 

http://eigen.tuxfamily.org/dox/TopicStorageOrders.html

+0

好的,我會試試看。謝謝:) – user1871183

7

mat.col(i)返回一個輕量級,讀寫代理對象引用墊的第i列。根本沒有副本。所以可以這樣做:

mat.col(i)(j) = 2; 

其等同於墊(J,I)= 2;你也可以這樣做:

mat.col(i).swap(mat.col(j)); 

沒有任何額外的副本。也許在你的代碼中明確(或隱式)將代理列對象複製到Vector對象中?像這樣:

VectorXd col_of_mat = mat.col(j); 
+0

是的,我正在將它複製到矢量對象中。但我需要能夠將其視爲單獨的VectorXd對象,因爲(afaik)視圖對象不支持VectorXd對象的許多操作和功能。我試着對VectorXd進行轉換,但那沒有奏效。 – user1871183