使用Eigen C++ Library将每个矩阵列乘以每个向量元素

Ser*_*ABP 9 c++ matrix eigen

我需要使用Eigen C++库将每个矩阵列乘以每个向量元素.我没有成功地尝试了.

样本数据:

Eigen::Matrix3Xf A(3,2); //3x2
A << 1 2,
     2 2,
     3 5;

Eigen::Vector3f V = Eigen::Vector3f(2, 3);

//Expected result
C = A.colwise()*V;

//C
//2 6,
//4 6,
//6 15
//this means C 1st col by V first element and C 2nd col by V 2nd element.
Run Code Online (Sandbox Code Playgroud)

矩阵A可以具有3xN和V Nx1.含义(cols x rowls).

Jac*_*lam 20

这就是我要做的:

Eigen::Matrix3Xf A(3, 2);  // 3x2
A << 1, 2, 2, 2, 3, 5;

Eigen::Vector3f V = Eigen::Vector3f(1, 2, 3);

const Eigen::Matrix3Xf C = A.array().colwise() * V.array();
std::cout << C << std::endl;
Run Code Online (Sandbox Code Playgroud)

示例输出:

 1  2
 4  4
 9 15
Run Code Online (Sandbox Code Playgroud)

说明

你很接近,诀窍是.array()用来做广播乘法.

colwiseReturnType没有.array()方法,所以我们必须在A的数组视图上做我们的colwise shenanigans.

如果你想计算两个向量的元素乘积(最酷的酷猫称之为Hadamard产品),你可以做

Eigen::Vector3f a = ...;
Eigen::Vector3f b = ...;
Eigen::Vector3f elementwise_product = a.array() * b.array();
Run Code Online (Sandbox Code Playgroud)

这是上述代码正在以列方式进行的操作.

编辑:

要解决行案例,您可以使用.rowwise(),并且您需要一个额外的transpose()东西来使事情适合

Eigen::Matrix<float, 3, 2> A;  // 3x2
A << 1, 2, 2, 2, 3, 5;

Eigen::Vector2f V = Eigen::Vector2f(2, 3);

// Expected result
Eigen::Matrix<float, 3, 2> C = A.array().rowwise() * V.transpose().array();
std::cout << C << std::endl;
Run Code Online (Sandbox Code Playgroud)

示例输出:

 2  6
 4  6
 6 15
Run Code Online (Sandbox Code Playgroud)


gga*_*ael 8

换句话说,您希望按不同的因子缩放每列,即应用非均匀缩放.缩放最好表示为对角矩阵,因此:

C = A * V.asDiagonal();
Run Code Online (Sandbox Code Playgroud)

由于Eigen基于表达式模板,因此这不会产生任何临时性和相当于雅各布答案的代码:

C = A.array().rowwise() * V.transpose().array();
Run Code Online (Sandbox Code Playgroud)