将 1xn Eigen::Array 与 2xn Eigen::Array 相乘,1xn 数组中的每一列表现得像一个标量

Multiplying 1xn Eigen::Array with 2xn Eigen::Array, with each column in the 1xn array behaving like a scalar

我有两个 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;

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

我已经向您的 发布了相同的解决方案,但这里再次给出我的回答:

  • 使用固定行数和动态列数定义数组,而 ArrayXXd 类型生成的数组具有动态行数和列数。
  • 使用fixed-size版本的操作。这通常会提供更快的代码。

Eigen 提供了在这种情况下使用 broadcasting 的可能性。但是,one-dimensional 数组应首先转换为 Vector:

broadcasting operations can only be applied with an object of type Vector

这适用于您的情况:

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

编辑

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

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