请看这段摘录:
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 );
}
在上面的代码中,x
,y
,z
是MatrixXd
中Eigen
类的对象,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();
}
进行编译。