如何解决将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;
但是,生成的代码非常慢,所以我希望有一个更好的选择。
解决方法
本征提供了在这种情况下使用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类型将生成具有动态的行数和列数的数组。
- 使用固定大小的操作版本。通常,这应该可以提供更快的代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。