我正在使用Eigen C ++矩阵库,我想获得对矩阵列的引用。文档说使用matrix_object.col(index),但这似乎是返回一个表示列的对象,而不是简单地引用原始矩阵对象内的列。我担心这涉及不必要地复制该列中的元素,因为更改列对象中的值不会影响原始矩阵。
如果有人比我更熟悉Eigen,使用此函数访问矩阵列是否仍然有效?如果没有,我怎样才能获得对矩阵内原始列的引用?
答案 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;