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