You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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行乘积和]

咨询两个问题:

  1. 该运算是否有对应的数学名称?
  2. 如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 04:45:26