初始化larga,非const Eigen Matrix的有效方法

时间:2018-03-23 12:16:26

标签: eigen eigen3

我有一个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)

是否有更多编译时和运行时效率的方法?

1 个答案:

答案 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);