使用 Eigen C++ 库将每个矩阵列乘以每个向量元素
Multiplication of each matrix column by each vector element using Eigen C++ Library
我需要使用 Eigen C++ library 将每个矩阵列乘以每个向量元素。我尝试了 colwise 没有成功。
示例数据:
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.
矩阵A可以有3xN和V Nx1。含义(列 x 行)。
这就是我要做的:
代码
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;
示例输出:
1 2
4 4
9 15
说明
你很接近,诀窍是使用 .array()
进行广播乘法。
colwiseReturnType
没有 .array()
方法,所以我们必须在 A.
的数组视图上做我们的 colwise 恶作剧
如果你想计算两个向量的元素乘积(最酷的酷猫称之为 Hadamard Product),你可以这样做
Eigen::Vector3f a = ...;
Eigen::Vector3f b = ...;
Eigen::Vector3f elementwise_product = a.array() * b.array();
这就是上面的代码以列方式执行的操作。
编辑:
要解决行大小写问题,您可以使用 .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;
示例输出:
2 6
4 6
6 15
换句话说,您想按不同的系数缩放每列,即应用非均匀缩放。缩放最好表示为对角矩阵,因此:
C = A * V.asDiagonal();
由于 Eigen 是基于表达式模板的,因此这不会创建任何临时的,相当于类似于 Jacob 的答案的代码:
C = A.array().rowwise() * V.transpose().array();
我需要使用 Eigen C++ library 将每个矩阵列乘以每个向量元素。我尝试了 colwise 没有成功。
示例数据:
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.
矩阵A可以有3xN和V Nx1。含义(列 x 行)。
这就是我要做的:
代码
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;
示例输出:
1 2
4 4
9 15
说明
你很接近,诀窍是使用 .array()
进行广播乘法。
colwiseReturnType
没有 .array()
方法,所以我们必须在 A.
如果你想计算两个向量的元素乘积(最酷的酷猫称之为 Hadamard Product),你可以这样做
Eigen::Vector3f a = ...;
Eigen::Vector3f b = ...;
Eigen::Vector3f elementwise_product = a.array() * b.array();
这就是上面的代码以列方式执行的操作。
编辑:
要解决行大小写问题,您可以使用 .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;
示例输出:
2 6
4 6
6 15
换句话说,您想按不同的系数缩放每列,即应用非均匀缩放。缩放最好表示为对角矩阵,因此:
C = A * V.asDiagonal();
由于 Eigen 是基于表达式模板的,因此这不会创建任何临时的,相当于类似于 Jacob 的答案的代码:
C = A.array().rowwise() * V.transpose().array();