将 Matlab 的 bsxfun 转换为 Eigen

ben*_*der 3 c++ matlab eigen eigen3

假设我们有一个维度为 MxN 的矩阵 A 和一个维度为 Mx1 的向量 a。在Matlab中,要将“a”与“A”的所有列相乘,我们可以这样做

bsxfun(@times, a, A)
Run Code Online (Sandbox Code Playgroud)

Eigen 中是否有等效的方法,而无需遍历矩阵的列?

我正在尝试做

M = bsxfun(@times, a, A) + bsxfun(@times, a2, A2)
Run Code Online (Sandbox Code Playgroud)

并希望 Eigen 的惰性求值能够使其更加高效。

谢谢!

gga*_*ael 5

你可以做:

M = A.array().colwise()*a.array();
Run Code Online (Sandbox Code Playgroud)

需要.array()将运算符 * 的语义重新定义为系数乘积(如果 A 和 a 是不需要的,则不需要Array<>对象则不需要)。

在这种特殊情况下,最好将其编写为缩放操作:

M = a.asDiagonal() * A;
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,由于惰性求值,您都不会得到任何临时的结果。