1

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

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

4

2 回答 2

9

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

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

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

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

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

VectorXd col_of_mat = mat.col(j);
于 2012-12-09T08:03:29.970 回答
2

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

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

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

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

于 2012-12-08T23:52:34.893 回答