Eigen Cookbook
Matrix
Section titled “Matrix”Matrix<float, Dynamic, 1> // n行1列的float矩阵refs: eigen官网
VectorXd v; v << 1, 2, 3;
这种写法是cpp98的糟粕,因为当时没有initializer_list。
通过内部类CommaInitializer和重载operator,来实现
// 一个简单的例子struct VectorXd { explicit VectorXd(int n) : size(n), current_idx(0) { data = new double[n]; }
~VectorXd() { delete[] data; }
double &operator[](int i) const { return *(data + i); }
double *data; int size; int current_idx;
struct CommaInitializer { explicit CommaInitializer(VectorXd &v) : vec(v) {}
CommaInitializer& operator,(double val){ assert(vec.current_idx < vec.size); vec.data[vec.current_idx] = val; vec.current_idx++; return *this; };
VectorXd &vec; };
CommaInitializer operator<<(double val){ CommaInitializer init(*this); init, val; return init; }};不必要的内存申请和拷贝赋值
Section titled “不必要的内存申请和拷贝赋值”// 一般的实现下u = v + w;//实际会执行,发生了一次额外的拷贝VectorXf tmp = v + w;VectorXf u = tmp;