【问题标题】:No copy multiplication in Eigen本征中没有复制乘法
【发布时间】:2014-08-07 05:46:38
【问题描述】:

我正在将 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 矩阵内存,因为理论上它不应该改变维度。我在考虑使用operator*=,但我意识到它仍然需要一个中间矩阵来进行计算。

【问题讨论】:

  • 您是否检查了result=left*right 在结果已经具有正确大小时实际上重新分配?

标签: c++ performance eigen


【解决方案1】:

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

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

更多关于 Eigen 中别名的解释在 http://eigen.tuxfamily.org/dox/group__TopicAliasing.html

【讨论】:

  • 这是否意味着operator*( ) 有不同的返回类型?这怎么可能?
  • operator*() 返回一个代表产品代理的表达式对象,但它不评估产品。评估步骤仅在 operator=() 内部完成,此时产品表达式对象被分配给矩阵。在 C++ 中搜索“表达式模板”或“惰性求值”以获取更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
相关资源
最近更新 更多