【高性能】Eigen VS Matlab

5 篇文章 1 订阅

Eigen是经典的C++开源模板矩阵库,很多大型库都包含对Eigen的支持,对矩阵计算有良好的优化。Matlab是科学计算领域的佼佼者,对矩阵计算有得天独厚的优势。将Matlab算法改编为C++程序,使用Eigen库会方便很多。

以下内容转载自Eigen官网,我进行了翻译:

// Basic usage

// Eigen          // Matlab           // 注释

x.size()          // length(x)        // 尺寸

C.rows()          // size(C, 1)       // 列数

C.cols()          // size(C, 2)       // 行数

x(i)              // x(i+1)           // Matlab is 1-based

C(i,j)            // C(i+1,j+1)       //最头疼的地方,matlab和C++序号差1

 

                 

A << 1, 2, 3,     //A= [1,2,3;4,5,6;7,8,9]

    4, 5, 6,    

    7, 8, 9;    

B << A, A, A;     // B = [A,A,A];

A.fill(10);       // A = 10 * Ones(3,3);

A.setRandom();    //A = rand(3,3)

A.setIdentity();  // A = eye(3,3);

 

// 矩阵子区域

// 模版形式是很快的。注意matlab从1开始

// Eigen                           // Matlab

x.head(n)                          // x(1:n)

x.head<n>()                        // x(1:n)

x.tail(n)                           // N = rows(x); x(N - n: N)

x.tail<n>()                         // N = rows(x); x(N - n: N)

x.segment(i, n)                      // x(i+1 : i+n)

x.segment<n>(i)                    // x(i+1 : i+n)

P.block(i, j, rows, cols)              //P(i+1 : i+rows, j+1 : j+cols)

P.block<rows, cols>(i, j)             // P(i+1 : i+rows, j+1 : j+cols)

P.topLeftCorner(rows, cols)          // P(1:rows, 1:cols)

P.topRightCorner(rows, cols)         //[m ,n]=size(P); P(1:rows, n-cols+1:n)

P.bottomLeftCorner(rows, cols)       //[m ,n]=size(P); P(m-rows+1:m, 1:cols)

P.bottomRightCorner(rows, cols)     //[m ,n]=size(P); P(m-rows+1:m, n-cols+1:n)

P.topLeftCorner<rows,cols>()       // P(1:rows, 1:cols)

P.topRightCorner<rows,cols>()      // [m ,n]=size(P); P(1:rows, n-cols+1:n)

P.bottomLeftCorner<rows,cols>()    // [m ,n]=size(P); P(m-rows+1:m, 1:cols)

P.bottomRightCorner<rows,cols>()   // [m ,n]=size(P); P(m-rows+1:m, n-cols+1:n)

 

// swap是高度优化的,很快

// Eigen                           // Matlab

R.row(i) = P.col(j);               // R(i, :) = P(:, i)

R.col(j1).swap(mat1.col(j2));       //R(:, [j1, j2]) = R(:, [j2, j1])

 

// 矩阵变换

// Eigen                           // Matlab

R.adjoint()                        // R'

R.transpose()                      // R.' or conj(R')

R.diagonal()                       // diag(R)

x.asDiagonal()                     // diag(x)

 

// matlab 没有 *= 这种操作,其他都很像

// Matrix-vector.  Matrix-matrix.   Matrix-scalar.

y  =M*x;          R  = P*Q;       R  = P*s;

a  =b*M;          R  = P - Q;     R  = s*P;

a *= M;            R = P + Q;      R  = P/s;

                   R *= Q;          R = s*P;

                   R += Q;          R *= s;

                   R -= Q;          R /= s;

 

 // 把矩阵变成数列

// Eigen                        // Matlab

R = P.cwiseProduct(Q);             // R = P .* Q

R = P.array() * s.array();                     // R = P .* s

R = P.cwiseQuotient(Q);            // R = P ./ Q

R = P.array() / Q.array();                    // R = P ./ Q

R = P.array() + s.array();                     // R = P + s

R = P.array() - s.array();                     // R = P - s

R.array() += s;                    // R = R + s

R.array() -= s;                    // R = R - s

R.array() < Q.array();               // R < Q

R.array() <= Q.array();              // R <= Q

R.cwiseInverse();           //1 ./ P

R.array().inverse();          //1 ./ P

R.array().sin()             //sin(P)

R.array().cos()             //cos(P)

R.array().pow(s)          //P .^ s

R.array().square()           //P .^ 2

R.array().cube()            //P .^ 3

R.cwiseSqrt()             // sqrt(P)

R.array().sqrt()             //sqrt(P)

R.array().exp()           //exp(P)

R.array().log()             //log(P)

R.cwiseMax(P)            // max(R, P)

R.array().max(P.array())      //max(R, P)

R.cwiseMin(P)            // min(R, P)

R.array().min(P.array())      //min(R, P)

R.cwiseAbs()             // abs(P)

R.array().abs()             //abs(P)

R.cwiseAbs2()            // abs(P.^2)

R.array().abs2()            //abs(P.^2)

(R.array() < s).select(P,Q);  // (R< s ? P : Q)

 

// 矩阵数据单元的计算.

int r, c;

// Eigen                  // Matlab

R.minCoeff()              // min(R(:))

R.maxCoeff()              // max(R(:))

s = R.minCoeff(&r, &c)    //[aa, bb] = min(R); [cc, dd] = min(aa);

                        // r = bb(dd); c = dd;s = cc

s = R.maxCoeff(&r, &c)           //[aa, bb] = max(R); [cc, dd] = max(aa);

                        // row = bb(dd); col =dd; s = cc

R.sum()                  // sum(R(:))

R.colwise.sum()           // sum(R)

R.rowwise.sum()          // sum(R, 2) or sum(R')'

R.prod()                 // prod(R(:))

R.colwise.prod()          // prod(R)

R.rowwise.prod()          // prod(R, 2) or prod(R')'

R.trace()                 // trace(R)

R.all()                   // all(R(:))

R.colwise().all()            //all(R)

R.rowwise().all()           //all(R, 2)

R.any()                  // any(R(:))

R.colwise().any()           //any(R)

R.rowwise().any()         // any(R, 2)

 

// 乘法,归一化

// Eigen                  // Matlab

x.norm()                  // norm(x).    .

x.squaredNorm()           // dot(x, x)  

x.dot(y)                  // dot(x, y)

x.cross(y)                // cross(x, y)  需要加#include <Eigen/Geometry>

 

// 把现成的数据复制到Eigenvalues矩阵

float array[3];

Map<Vector3f>(array, 3).fill(10);

int data[4] = 1, 2, 3, 4;

Matrix2i mat2x2(data);

MatrixXi mat2x2 =Map<Matrix2i>(data);

MatrixXi mat2x2 = Map<MatrixXi>(data,2, 2);

 

// 求解Ax = b. x存放结果. Matlab: x = A \ b.

bool solved;

solved = A.ldlt().solve(b, &x));  //    #include <Eigen/Cholesky>

solved = A.llt() .solve(b, &x));  //      #include <Eigen/Cholesky>

solved = A.lu() .solve(b, &x));  // 稳定快速. #include <Eigen/LU>

solved = A.qr() .solve(b, &x));  //    #include <Eigen/QR>

solved = A.svd() .solve(b, &x));  // 稳定,慢 #include <Eigen/SVD>

//存放的函数

// .ldlt() -> .matrixL() and .matrixD()

// .llt() -> .matrixL()

// .lu() -> .matrixL() and .matrixU()

// .qr() -> .matrixQ() and .matrixR()

// .svd() -> .matrixU(),.singularValues(), 和.matrixV()

 

// 其他

// Eigen                          // Matlab

A.eigenvalues();                  // eig(A);

EigenSolver<Matrix3d> eig(A);     // [vec, val] = eig(A)

eig.eigenvalues();                // diag(val)


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenCV是一款开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法,可以帮助开发者实现各种视觉任务。CMake是一个跨平台的构建工具,可以帮助开发者在不同的操作系统上进行项目的构建和管理。Eigen是一个C++模板库,提供了高级的矩阵和向量运算功能,适用于各种数学计算和线性代数操作。 在使用OpenCV进行开发时,我们可以使用CMake进行项目的构建。CMake可以根据不同操作系统的情况生成相应的构建文件,方便开发者在不同系统上进行开发和部署。在构建OpenCV项目时,我们可以使用CMakeFile.txt文件来描述项目的结构和依赖关系,然后通过CMake生成对应的构建文件。 而Eigen可以与OpenCV一起使用,为OpenCV提供更强大的数学计算能力。Eigen提供了高性能的矩阵和向量操作,可以进行矩阵运算、特征值计算、线性代数等数学计算。通过集成Eigen,我们可以在OpenCV项目中更方便地处理各种数学计算任务。 在使用OpenCV和Eigen时,可以选择使用Visual Studio 2017进行开发。Visual Studio 2017是一款强大的集成开发环境,提供了丰富的开发工具和调试能力。通过Visual Studio 2017,我们可以方便地进行OpenCV和Eigen项目的编写、构建和调试,提高开发效率。 综上所述,OpenCV、CMake、Eigen和Visual Studio 2017可以相互配合使用,实现图像处理和计算机视觉相关的项目开发。通过使用CMake进行项目构建,集成Eigen库进行数学计算,使用Visual Studio 2017进行开发,可以提高开发效率,快速实现各种视觉任务。 ### 回答2: OpenCV 是一个开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法。CMake 是一个跨平台的构建工具,用于生成编译项目所需的 Makefile 或者 Visual Studio 的解决方案文件。Eigen 是一个 C++ 模板库,提供了线性代数的相关功能。 在使用 OpenCV 进行开发时,我们可以使用 CMake 来配置和生成项目,以便在不同的开发环境中进行编译和构建。CMake 可以自动检测并配置 Opencv 的相关路径,以便正确地链接和使用库文件。 而 Eigen 则是一个非常常用的线性代数库,它提供了矩阵、向量和矢量等数学对象的定义和操作。在使用 OpenCV 进行图像处理时,我们经常需要使用到矩阵操作,而 Eigen 提供了更高效和方便的矩阵运算,可以更好地满足我们的需求。 对于在 Visual Studio 2017 上使用 OpenCV、CMake 和 Eigen 进行开发,我们首先需要确保已经正确安装并配置了这些工具。然后,我们可以使用 CMake 来生成一个 Visual Studio 的解决方案,其中将包含我们要开发的项目以及所需的库文件链接。 在 CMake 中,我们需要添加相应的路径信息,以便 CMake 可以找到 OpenCV 和 Eigen 的安装路径。然后将这些路径信息与我们的项目相关内容一起配置,并生成 Visual Studio 的解决方案。 在 Visual Studio 2017 中,我们可以打开生成的解决方案,并进行编写和调试我们的代码。可以使用 OpenCV、CMake 和 Eigen 的相关函数和类,进行图像处理、线性代数计算等任务。 总之,使用 OpenCV、CMake 和 Eigen 进行 Visual Studio 2017 上的开发,可以方便地进行图像处理和计算机视觉算法的开发,以及进行高效的线性代数计算。 ### 回答3: OpenCV是一个流行的计算机视觉库,用于处理图像和视频。依靠cmake进行项目构建。Eigen是一个C ++模板库,提供了用于线性代数运算的高性能数学工具。现在我来回答关于OpenCV、CMake和EigenVS2017中的问题。 首先,你需要确保已经在你的计算机上安装了Visual Studio 2017和CMake。在安装完成后,你可以开始设置OpenCV、CMake和Eigen。 首先,你需要下载并安装OpenCV库。你可以从OpenCV官方网站下载最新版本的OpenCV,并按照官方文档提供的说明进行安装。在安装完成后,你需要设置OpenCV的环境变量,以便在VS2017中使用OpenCV。 接下来,你可以使用CMake来构建你的OpenCV项目。在CMake中,你需要指定OpenCV的安装路径,并设置你的工程文件路径。你可以使用CMake的GUI界面或命令行界面来完成这一步骤。 然后,你需要下载并安装Eigen库。你可以从Eigen官方网站下载最新版本的Eigen,并按照官方文档提供的说明进行安装。 在设置完OpenCV和Eigen后,你可以在VS2017中创建一个新的项目。你需要在项目配置中链接OpenCV和Eigen库,并将必要的头文件包含到你的代码中。你可以在项目属性中进行这些配置。 最后,你可以在你的代码中使用OpenCV、CMake和Eigen来进行图像和视频处理、线性代数运算等操作。你可以通过查看OpenCV、Eigen和CMake的官方文档来学习更多关于这些库的用法和特性。 总结来说,你需要安装OpenCV、设置CMake并安装Eigen,然后在VS2017中配置你的项目,以使用OpenCV、CMake和Eigen来进行图像处理和数学运算。希望这些信息对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值