gpt4 book ai didi

c++ - Eigen C++;就地矩阵乘法

转载 作者:太空宇宙 更新时间:2023-11-03 10:39:11 25 4
gpt4 key购买 nike

使用 Eigen C++ Matrix 库,如何高效地将 n x n 矩阵 An x m 矩阵 B 相乘并将结果存储在 A 中?也就是说,我怎样才能避免生成一个临时的 n x m 矩阵并存储结果直接在 B 中?

对于 m 非常大的应用程序(例如 100000)比 n(例如 3),这绝对有意义,因为它避免了超大数组的应用。

下面的代码,我无法开始工作:

     B.noalias() = A * B;

我认为,内部必须发生的是下列。 B 的每一列都应该分开处理。正在考虑的列 column_i 必须复制到备份列 column_tmp。然后,

     B(row_i, column_i) = A.row(row_i) * column_tmp; // dot-product

对于所有 column_i = 0 到 mEigen 有没有办法做到这一点高效并从其优化中获利?

最佳答案

告诉 Eigen 您希望产品“就地”发生的最明确方式可能是:

B.transpose() *= A.transpose();
// or B.applyOnTheLeft(A);

就是说,不能保证这不会在任何临时发生,您必须为此相信内部 Eigen 成本逻辑(Eigen 设计者可能更了解 :) ... 或检查自己通过调试器进行调试,经过适当的分析表明这是一个真正的问题,而不仅仅是过早的优化)。

在我的 Eigen 拷贝 (3.2.7) 上,上面的代码直接在 Transpose 表达式上调用了 MatrixBase::applyThisOnTheRight,这反过来可悲地减少到 B =A*B 内部; applyOnTheLeft 会发生同样的情况,所以在这种情况下你运气不好。

如果你真的需要避免任何 nxm 临时,你可以手动 vector 方式执行乘积,比如:

for(auto i=0;i<B.cols();++i)
B.col(i) = A * B.col(i);

假设 B.rows()<<B.cols(),这将消耗更少的额外内存,但是你可能会在这里错过一些重要的优化;确实,我想在这里临时使用仍然是最好的权衡。

关于c++ - Eigen C++;就地矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48296384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com