C ++和Eigen:我如何处理这个1x1矩阵?

时间:2017-10-12 19:54:36

标签: c++ eigen

请看这段摘录:

for(int i = 0; i < 600*100*100; i++) {
    ( 1 / 2 * (1 - a) / a *   x.transpose() * y * (z + (1 - a) *
     z.transpose() * y(i) / z.sum() ) * x.transpose() * z );
}

在上面的代码中,xyzMatrixXdEigen类的对象,a是{ {1}}。通过这些乘法,最终结果是标量。整个forloop花了不到一秒钟。

但是,如果我更改了我的代码:

double

然后forloop需要6秒钟。 for(int i = 0; i < 600*100*100; i++) { F(i) = F(i) + ( 1 / 2 * (1 - a) / a * x.transpose() * y * (z + (1 - a) * z.transpose() * y(i) / z.sum() ) * x.transpose() * z ); } F。我试图通过循环更新ArrayXd的每个元素,并且在每次迭代中我将进行一系列简单的矩阵乘法(这将导致标量)。

我不确定是什么问题。我怎样才能加快速度?我尝试使用F,但这没有帮助。这可能与以下事实有关:一系列矩阵乘法结果导致1x1 .noalias()MatrixXd在向数字添加Eigen时出现问题。

更新 根据@mars,我尝试了MatrixXd

eval()

它也需要约6秒钟。这是否意味着无法优化?

另外,我使用for(int i = 0; i < 600*100*100; i++) { ( 1 / 2 * (1 - a) / a * x.transpose() * y * (z + (1 - a) * z.transpose() * y(i) / z.sum() ) * x.transpose() * z ).eval(); } 进行编译。

0 个答案:

没有答案