问题描述
我有两个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;
解决方法
本征提供了在这种情况下使用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类型将生成具有动态的行数和列数的数组。
- 使用固定大小的操作版本。通常,这应该可以提供更快的代码。