本征中没有复制乘法

Art*_*hur 3 c++ performance eigen

我正在将 Eigen 与大矩阵一起使用,并且正在考虑优化代码的方法,重点是减少动态内存分配。

我正在尝试将两个矩阵相乘。这些矩阵时不时会发生一些变化,但它们的大小保持不变。

我想看到乘法的输出进入一个预定义的矩阵(已经为它分配了内存)。

所以这是我正在做的一个例子:

Eigen::MatrixXd   left, right,result;
// ... 
result = left * right;
// ... left and right values change a little
result = left * right;
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个类似的解决方案:

  void Multiply(
    Eigen::MatrixXd const&  left,
    Eigen::MatrixXd const&  right,
    Eigen::MatrixXd&        result);

  void Example()
  {
    Eigen::MatrixXd   left, right, result;
    // ... 
    Multiply(left, right, result);
    // ... 
    Multiply(left, right, result);
  }
Run Code Online (Sandbox Code Playgroud)

目的基本上是重用result矩阵内存,因为理论上它不应该改变维度。我正在考虑使用,operator*=但我有点意识到它仍然需要一个中间矩阵来进行计算。

Jit*_*sen 5

result = left * right分配一个临时矩阵来保存乘法的结果,将乘积计算到临时矩阵中,然后将结果从临时矩阵复制到result。这是为了处理诸如A = A * B需要临时矩阵之类的语句。

如果您知道结果与乘积中的矩阵不同,那么您可以编写result.noalias() = left * right. 在这种情况下,Eigen 不会使用临时矩阵。

有关 Eigen 中别名的更多解释,请访问http://eigen.tuxfamily.org/dox/group__TopicAliasing.html

  • `operator*()` 返回一个表达式对象,作为产品的代理,但它不评估产品。当乘积表达式对象分配给矩阵时,评估步骤仅在 `operator=()` 内完成。在 C++ 中搜索“表达式模板”或“惰性求值”以获取更多信息。 (4认同)