特征:通过引用访问矩阵的列

时间:2012-12-08 23:13:58

标签: c++ eigen

我正在使用Eigen C ++矩阵库,我想获得对矩阵列的引用。文档说使用matrix_object.col(index),但这似乎是返回一个表示列的对象,而不是简单地引用原始矩阵对象内的列。我担心这涉及不必要地复制该列中的元素,因为更改列对象中的值不会影响原始矩阵。

如果有人比我更熟悉Eigen,使用此函数访问矩阵列是否仍然有效?如果没有,我怎样才能获得对矩阵内原始列的引用?

2 个答案:

答案 0 :(得分:7)

mat.col(i)返回一个引用mat列的轻量级读写代理对象。根本没有副本。所以你可以这样做:

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

相当于mat(j,i)= 2;你也可以这样做:

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

没有任何额外的副本。也许在您的代码中,您明确地(或隐式地)将代理列对象复制到Vector对象中?像这样:

VectorXd col_of_mat = mat.col(j);

答案 1 :(得分:1)

首先,这显然只适用于列主矩阵。这就是Eigen的默认值,但是当你依赖它时你应该明确它。

然后,为了确保不会有额外的代理对象成本,您可以使用data()获取指向整个矩阵存储的普通指针,并将其增加适当的数量。例如,要访问j矩阵n×n中的m列,

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

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