前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 矩阵运算库 Eigen

C++ 矩阵运算库 Eigen

作者头像
为为为什么
发布2023-01-16 13:55:37
1.3K0
发布2023-01-16 13:55:37
举报
文章被收录于专栏:又见苍岚

Eigen是可以用来进行线性代数、矩阵、向量操作等运算的C++库,它里面包含了很多算法。。

简介

  • Eigen 是可以用来进行线性代数、矩阵、向量操作等运算的C++库,它里面包含了很多算法。当前(2023.1)最高 release 版本: 3.4.0
  • Eigen 采用源码的方式提供给用户使用,在使用时只需要包含Eigen的头文件即可进行使用。之所以采用这种方式,是因为Eigen采用模板方式实现,由于模板函数不支持分离编译,所以只能提供源码而不是动态库的方式供用户使用
  • Eigen 的定位是矩阵运算,已经被 OpenCV 官方支持,在 C++ 中二者经常协同工作,就像Python 中的 Numpy 和 OpenCV 库的关系一样
  • 官网链接:https://eigen.tuxfamily.org/index.php?title=Main_Page
  • 仓库链接:https://gitlab.com/libeigen/eigen

获取代码

代码语言:javascript
复制
git clone git@gitlab.com:libeigen/eigen.git

  • 当前的代码是 master 分支,代码一直在更新,但没有发布稳定的版本,建议切换到 3.4.0 的当前最高版本,而且经过我测试 3.4.0 在一些任务上效率也更高
代码语言:javascript
复制
git checkout 3.4.0

  • 源码准备完毕了,建议将 eigen 本地仓库文件夹加入环境变量 我将该路径设置为环境变量 : EIGEN_PATH 键下的值
  • 创建 C++ 工程,建议在 Release 下配置环境、运行代码,因为 Debug 模式下运行实在是太慢了
  • EIGEN_PATH 添加到附加包含目录就算配置好环境了
  • 使用时引入头文件

模块和头文件

模块

引入头文件

内容

Core

#include<Eigen/Core>

包含Matrix和Array类,基础的线性代数运算和数组操作

Geometry

#include<Eigen/Geometry>

包含旋转,平移,缩放,2维和3维的各种变换

LU

#include<Eigen/LU>

包含求逆,行列式,LU分解

Cholesky

\#include<Eigen/Cholesky>

包含LLT和LDLT Cholesky分解

SVD

#include<Eigen/SVD>

包含SVD分解

QR

#include<Eigen/QR>

包含QR分解

Sparse

#include<Eigen/Sparse>

包含稀疏矩阵的存储和运算

Dense

`#include<Eigen/Dense>`

包含了Core/Geometry/LU/Cholesky/SVD/QR/Eigenvalues模块

Eigen

#include<Eigen/Eigen>

包含Dense和Sparse。

demo

  • 粘贴如下代码,应该就可以运行了
代码语言:javascript
复制
#include <iostream>
#include <Eigen/Core>
#include <ctime>

using namespace Eigen;
using namespace std;

#define MATRIX_SIZE 2000

int main()
{
    int n_a_rows = 4000;
    int n_a_cols = 3000;
    int n_b_rows = n_a_cols;
    int n_b_cols = 200;

    MatrixXi a(n_a_rows, n_a_cols);

    for (int i = 0; i < n_a_rows; ++i)
        for (int j = 0; j < n_a_cols; ++j) {
            a(i, j) = n_a_cols * i + j;
        }

    MatrixXi b(n_b_rows, n_b_cols);
    for (int i = 0; i < n_b_rows; ++i)
        for (int j = 0; j < n_b_cols; ++j) {
            b(i, j) = n_b_cols * i + j;
        }

    MatrixXi d(n_a_rows, n_b_cols);

    clock_t begin = clock();

    d = a * b;

    clock_t end = clock();
    double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
    std::cout << "* Time taken : " << elapsed_secs << std::endl;
}

  • 我的输出:
代码语言:javascript
复制
* Time taken : 0.782

参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023年1月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 获取代码
  • 模块和头文件
  • demo
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档