将1xn Eigen :: Array与2xn Eigen :: Array相乘,而1xn数组中的每一列的行为都像标量一样

问题描述

我有两个Eigen::Array,它们的列数相同。其中一个a有一行,而另一b有两行。 我想做的是将b的每一列乘以a的相应列中的条目,以使其表现如下:

ArrayXXd result;
result.resizeLike(b);
for (int i=0; i<a.cols(); ++i)
    result.col(i) = a.col(i)[0] * b.col(i);

但是,它是包含多个这样的乘法的相当长的表达式的一部分,我不想在临时对象中评估中间结果。因此,我宁愿得到上述的本征表达式,例如

auto expr = a * b;

这当然会触发一个断言,因为a.rows() != b.rows()

我尝试过的有效的方法是:

auto expr = a.replicate(2,1) * b;

但是,生成代码非常慢,所以我希望有一个更好的选择。

Possibly related.

解决方法

本征提供了在这种情况下使用broadcasting的可能性。但是,一维数组应首先转换为Vector:

广播操作只能应用于Vector类型的对象

这将在您的情况下起作用:

RowVectorXd av = a;  
ArrayXXd expr = b.rowwise() * av.array();

修改

要避免将数据复制到新向量中,可以使用Map

ArrayXXd expr = b.rowwise() * RowVectorXd::Map(&a(0),a.cols()).array();  
,

我已经向您的previous question发布了相同的解决方案,但这还是我的答案:

  • 使用固定的行数和动态的列数定义数组,而ArrayXXd类型将生成具有动态的行数和列数的数组。
  • 使用固定大小的操作版本。通常,这应该可以提供更快的代码。