Fra*_*fer 2 c++ performance matrix eigen3
使用本征C ++库矩阵,如何才能有效地一个一个乘法n×n个矩阵甲用n×m的矩阵乙 并且将结果存储在一个?也就是说,如何避免生成临时nxm矩阵,而是将结果直接存储在B 中?
对于m远大于n(例如 3)的应用程序(例如 100000),这绝对是有意义的,因为它避免了非常大的数组的应用程序。
以下代码,我无法开始工作:
B.noalias() = A * B;
Run Code Online (Sandbox Code Playgroud)
我认为,内部必须发生的事情如下。B 的每一列都应单独处理。考虑中的列column_i必须复制到备份列column_tmp。然后,
B(row_i, column_i) = A.row(row_i) * column_tmp; // dot-product
Run Code Online (Sandbox Code Playgroud)
对于所有column_i= 0 到 m。Eigen有没有办法有效地做到这一点并从其优化中获利?
告诉 Eigen 您希望产品“就地”发生的最明确方式可能是:
B.transpose() *= A.transpose();
// or B.applyOnTheLeft(A);
Run Code Online (Sandbox Code Playgroud)
也就是说,不能保证这不会在任何临时发生,您必须为此相信内部特征成本逻辑(特征设计人员可能更了解 :) ...或在建议进行适当的分析后通过调试器自行检查这是一个真正的问题,而不仅仅是过早的优化)。
在我的 Eigen 副本(3.2.7)上,上面MatrixBase::applyThisOnTheRight直接调用了Transpose表达式,这反过来又可悲地减少到B=A*B内部;发生的情况与 相同applyOnTheLeft,因此在这种情况下您不走运。
如果您确实需要避免任何nxm 临时,您可以手动执行矢量化的产品,例如:
for(auto i=0;i<B.cols();++i)
B.col(i) = A * B.col(i);
Run Code Online (Sandbox Code Playgroud)
假设B.rows()<< B.cols(),这将消耗更少的额外内存,但您可能会错过一些重要的优化;确实,我想暂时还是可以在这里做出最好的权衡。
| 归档时间: |
|
| 查看次数: |
1733 次 |
| 最近记录: |