我有一个4000乘4的矩阵,需要使用不同的值进行初始化。
我注意到以下内容在GCC中占用了大量时间,它实际上挂起了编译器:
Eigen::Matrix<double,1000,500> mat;
mat.setZero();
mat << 1,2,3,4,
10,2,3,1,
(etc)
所以,我想我也可以这样做:
int i=0;
mat.row(i++) << 1,2,3,4;
mat.row(i++) << 10,2,3,1;
(etc)
是否有更多编译时和运行时效率的方法?
答案 0 :(得分:1)
只需将值存储在POD阵列中(可能已对齐)并在其上使用Eigen::Map
:
EIGEN_ALIGN_TO_BOUNDARY(32) // align if you want to use SIMD
static const // leave the const, if you want to modify the data
double data[4*4] = { // 4000*4 in your case
0, 1, 2, 3,
4, 5, 6, 7,
8, 9,10,11,
12,13,14,15,
// ...
};
// again, leave the const, if you want to modify `mat`:
// RowMajor is easier to read when defining `data`
const static Eigen::Map<const Eigen::Matrix<double, 4, 4, Eigen::RowMajor>, Eigen::Aligned32> mat(data);