C++ 本征函数中的无拷贝乘法
我正在使用大矩阵的Eigen,我正在考虑优化代码的方法,重点是减少动态内存分配 我想把两个矩阵相乘。这些矩阵偶尔会有一些变化,但它们的大小保持不变 我希望看到乘法的输出进入一个预定义的矩阵(已经为它分配了内存) 下面是我正在做的一个例子: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::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++中搜索“表达式模板”或“懒惰评估”以获取更多信息。