C++ 本征函数中的无拷贝乘法

C++ 本征函数中的无拷贝乘法,c++,performance,eigen,C++,Performance,Eigen,我正在使用大矩阵的Eigen,我正在考虑优化代码的方法,重点是减少动态内存分配 我想把两个矩阵相乘。这些矩阵偶尔会有一些变化,但它们的大小保持不变 我希望看到乘法的输出进入一个预定义的矩阵(已经为它分配了内存) 下面是我正在做的一个例子: Eigen::MatrixXd left, right,result; // ... result = left * right; // ... left and right values change a little result = left *

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

我想把两个矩阵相乘。这些矩阵偶尔会有一些变化,但它们的大小保持不变

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

下面是我正在做的一个例子:

Eigen::MatrixXd   left, right,result;
// ... 
result = left * right;
// ... left and right values change a little
result = left * right;
我正在寻找一个解决方案,就像这样:

  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);
  }

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

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

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


关于Eigen中混叠的更多解释见

您是否检查了
result=left*right
在结果已经具有正确大小时是否实际重新分配?这是否意味着
运算符*()
具有不同的返回类型?这是怎么可能的?
操作符*()
返回一个表达式对象,它代表产品的代理,但不计算产品。当产品表达式对象被分配到矩阵时,计算步骤仅在
操作符=()
内完成。在C++中搜索“表达式模板”或“懒惰评估”以获取更多信息。