C++如何进行矩阵运算?Eigen库入门示例

来源:编程学习作者:本地能跑头衔:程序员
导读:本期聚焦于小伙伴创作的《C++如何进行矩阵运算?Eigen库入门示例》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++如何进行矩阵运算?Eigen库入门示例》有用,将其分享出去将是对创作者最好的鼓励。

在C++中进行矩阵运算时,手动实现矩阵类和相关运算逻辑会消耗大量时间,还容易出现边界错误、性能问题。Eigen库作为开源的线性代数库,仅需包含头文件即可使用,支持稠密矩阵和稀疏矩阵运算,涵盖了大部分常用线性代数操作,是C++中处理矩阵运算的常用选择。

C++如何进行矩阵运算?Eigen库入门示例

Eigen库环境配置

Eigen库是纯头文件库,不需要编译安装,只需要把下载的Eigen源码文件夹放到项目包含目录中,在代码中通过#include <Eigen/Dense>即可引入所有稠密矩阵相关功能。如果是使用CMake构建项目,可以通过find_package(Eigen3 REQUIRED)指令查找库,再通过target_link_libraries(项目名 Eigen3::Eigen)关联依赖。

矩阵定义与初始化

Eigen中矩阵类型通过Eigen::Matrix<数据类型, 行数, 列数>模板定义,动态大小的矩阵可以用Eigen::MatrixXd(双精度动态矩阵)、Eigen::MatrixXi(整型动态矩阵)等别名。下面是矩阵初始化的示例代码:

#include <iostream>
#include <Eigen/Dense>

int main() {
    // 定义2行3列的静态双精度矩阵
    Eigen::Matrix<double, 2, 3> mat1;
    // 使用逗号初始化赋值
    mat1 << 1.0, 2.0, 3.0,
           4.0, 5.0, 6.0;
    std::cout << "静态矩阵mat1内容:" << std::endl;
    std::cout << mat1 << std::endl;

    // 定义3行2列的动态双精度矩阵
    Eigen::MatrixXd mat2(3, 2);
    mat2 << 1.0, 2.0,
           3.0, 4.0,
           5.0, 6.0;
    std::cout << "动态矩阵mat2内容:" << std::endl;
    std::cout << mat2 << std::endl;

    return 0;
}

基础矩阵运算

Eigen重载了大部分运算符,矩阵加减、数乘、乘法都可以直接用运算符完成,下面是常见运算的示例:

#include <iostream>
#include <Eigen/Dense>

int main() {
    Eigen::Matrix2d a;
    a << 1, 2,
         3, 4;
    Eigen::Matrix2d b;
    b << 5, 6,
         7, 8;

    // 矩阵加法
    Eigen::Matrix2d addResult = a + b;
    std::cout << "a + b结果:" << std::endl;
    std::cout << addResult << std::endl;

    // 矩阵减法
    Eigen::Matrix2d subResult = a - b;
    std::cout << "a - b结果:" << std::endl;
    std::cout << subResult << std::endl;

    // 矩阵数乘
    Eigen::Matrix2d mulNumResult = a * 2.0;
    std::cout << "a * 2结果:" << std::endl;
    std::cout << mulNumResult << std::endl;

    // 矩阵乘法
    Eigen::Matrix2d mulMatResult = a * b;
    std::cout << "a * b结果:" << std::endl;
    std::cout << mulMatResult << std::endl;

    return 0;
}

常用矩阵操作

Eigen还提供了转置、求逆、求迹、求特征值等常用操作,下面是相关示例:

#include <iostream>
#include <Eigen/Dense>

int main() {
    Eigen::Matrix2d mat;
    mat << 1, 2,
         3, 4;

    // 矩阵转置
    Eigen::Matrix2d transposeMat = mat.transpose();
    std::cout << "矩阵转置结果:" << std::endl;
    std::cout << transposeMat << std::endl;

    // 矩阵求逆
    Eigen::Matrix2d inverseMat = mat.inverse();
    std::cout << "矩阵求逆结果:" << std::endl;
    std::cout << inverseMat << std::endl;

    // 矩阵求迹(对角线元素之和)
    double traceVal = mat.trace();
    std::cout << "矩阵迹为:" << traceVal << std::endl;

    // 求矩阵特征值
    Eigen::SelfAdjointEigenSolver<Eigen::Matrix2d> solver(mat);
    if (solver.info() == Eigen::Success) {
        std::cout << "矩阵特征值:" << std::endl;
        std::cout << solver.eigenvalues() << std::endl;
    }

    return 0;
}

注意事项

  • 进行矩阵乘法时,要确认前一个矩阵的列数等于后一个矩阵的行数,否则会编译报错或者运行结果异常。
  • 动态大小矩阵在定义时需要指定行数和列数,静态大小矩阵在模板参数中已经固定了维度,不需要额外指定。
  • 如果需要频繁进行矩阵运算,尽量使用固定大小的矩阵类型,性能会比动态大小矩阵更好。
  • 矩阵转置操作transpose()返回的是转置的临时对象,如果需要修改原矩阵,要使用mat.transposeInPlace()方法。

C++Eigen库矩阵运算矩阵乘法修改时间:2026-06-24 04:24:36

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。