我试图维护一个变量,该变量在保守的调整大小范围内引用Eigen :: MatrixXf的第一列。
调整ColXpr c
的大小且无法重新分配时,MatrixXf m
似乎无效。我可以看到这如何保护我免受错误的侵害,但是我不明白应该怎么做,以使c
给出新的m
的第一列?
#include <iostream>
#include <Eigen/Dense>
int main()
{
Eigen::MatrixXf m = Eigen::MatrixXf::Random(4,2);
Eigen::MatrixXf::ColXpr c = m.col(0);
std::cout << m << std::endl;
// 0.680375 0.823295
// -0.211234 -0.604897
// 0.566198 -0.329554
// 0.59688 0.536459
std::cout << c << std::endl;
// 0.680375
// -0.211234
// 0.566198
// 0.59688
m.conservativeResize(3, Eigen::NoChange);
std::cout << m << std::endl;
// 0.680375 0.823295
// -0.211234 -0.604897
// 0.566198 -0.329554
std::cout << c << std::endl;
// 1.4013e-45
// 0
// 1.4013e-45
// 0
c = m.col(0); // <<<<< This cores with the Eigen Warning
// Assertion `rows() == other.rows() && cols() == other.cols()' failed.
std::cout << c << std::endl;
return EXIT_SUCCESS;
}
最佳答案
像ColXpr
这样的本征表达式类型旨在用作临时变量,在一行中构造和销毁。它们的主要目的是为了避免不必要的复制-在ColXpr
情况下,通过对原始数组中的数据进行别名来实现。
别名是实现细节,而不是面向用户的功能。即使您只是修改原始矩阵,也不应依靠更新ColXpr
,更不用说调整其大小了。
如果您希望始终得到矩阵第一列的内容,则该内容为m.col(0)
。如果愿意,可以将其包装在函数中。