如何将x列向量与x列矩阵执行逐行元素乘求和?含Eigen实现疑问
问题描述
给定如下向量和矩阵:
v = [0] [1] [2] [3] [4] [5] m = [0, 0] [0, 1] [0, 2] [0, 3] [0, 4] [0, 5] [0, 0] [0, 1] [0, 2] [0, 3] [0, 4] [0, 5] [0, 0] [0, 1] [0, 2] [0, 3] [0, 4] [0, 5] [0, 0] [0, 1] [0, 2] [0, 3] [0, 4] [0, 5]
需要实现的运算为:将向量v与矩阵m的每一行做元素级乘法,再对每行的乘积结果求和,最终得到一个4行1列的结果:
[第0行乘积和] [第1行乘积和] [第2行乘积和] [第3行乘积和]
咨询两个问题:
- 该运算是否有对应的数学名称?
- 如何用Eigen库实现该运算?是否有专用函数,还是需要手动逐行处理?
解答
1. 运算的数学名称
这个运算本质就是矩阵与列向量的标准矩阵乘法:当矩阵m为4×6维度,向量v为6×1列向量时,m * v的结果就是4×1向量,每个元素恰好是m的对应行与v的点积(即元素级乘法后求和)。如果将v视为行向量,也可以描述为m与v转置的矩阵乘法,或直白地称为矩阵每行与向量的点积运算。
2. Eigen库的实现方式
不需要手动逐行处理,Eigen原生支持该运算,且矩阵乘法会自动优化,效率更高,具体实现分两种情况:
情况1:向量v为列向量(6×1)
直接执行矩阵乘法即可:
#include <Eigen/Dense> using namespace Eigen; int main() { // 初始化4×6矩阵m MatrixXd m(4, 6); m << 0, 0, 0, 1, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 1, 0, 2; // 初始化6×1列向量v VectorXd v(6); v << 0, 1, 2, 3, 4, 5; // 执行矩阵乘法,得到目标结果 VectorXd result = m * v; // 输出结果 std::cout << result << std::endl; return 0; }
情况2:向量v为行向量(1×6)
只需将v转置为列向量后做矩阵乘法,或用逐行点积的方式:
#include <Eigen/Dense> using namespace Eigen; int main() { MatrixXd m(4, 6); m << 0, 0, 0, 1, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 1, 0, 2; // 初始化1×6行向量v RowVectorXd v(6); v << 0, 1, 2, 3, 4, 5; // 方式1:转置后执行矩阵乘法(推荐) VectorXd result1 = m * v.transpose(); // 方式2:逐行计算点积(逻辑直观,但效率略低) VectorXd result2(4); for (int i = 0; i < 4; ++i) { result2(i) = m.row(i).dot(v); } std::cout << result1 << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者user1311627
相关产品推荐
相关产品推荐

