`

matlab矩阵转为Eigen库中的矩阵

 
阅读更多
在matlab,C++联合编程的过程中,想使用一下Eigen库(一个C++矩阵运算库)。
为啥不直接用matlab的库呢?
有两点考虑:
  • 1、matlab中写for循环太慢,处理图像块有时还得两层for循环
  • 2、在C++中采用matlab函数,不利于生成独立的C++程序。


不多说了,上代码:
以下是将matlab矩阵转为Eigen中的Map(可以当做矩阵使用)的函数,转为Map而不是Matrix是为了避免不必要的数据拷贝(Eigen的数据共享实在是烂的可以!)

namespace Eigen {
template<typename T> Map<Matrix<T, Dynamic, Dynamic, ColMajor>> matlab2Eigen (const mxArray * pMat, bool needTranspose = true) {
    Map< Matrix<T, Dynamic, Dynamic, ColMajor>> matrixMap ( (T*) mxGetPr (pMat), mxGetM (pMat), mxGetN (pMat) );
    return matrixMap;
}
}

其实就是一行函数而已,也就是Eigen中Map 的基础用法。更多用法参见:http://eigen.tuxfamily.org/dox/group__TutorialMapClass.html
其中的一行用于指定间隔的(注意这里列间距为1(更准确说是外间距,因为矩阵为列优先存储的,外间距为列间距),行间距为4,但矩阵是列优先存储的!也就是说,M(r,c)的计算方法为: M(c*1+r*4);)
Map<Matrix<int,2,4>, Unaligned, Stride<1,4> >(array) ;

如果是常用的写法:
Map<Matrix<int,2,4>>(array) ;

或者展开写:
Map<Matrix<int,2,4>, Unaligned, Stride<0,0> >(array) ;

M(r,c)的计算方法为: M(c*4+r*1)


附上完成的测试代码(两个矩阵相加):

#include <Eigen/Core>


//mex headers and libraries
#include "mex.h"
#pragma comment(lib,"libmx.lib")
#pragma comment(lib,"libmex.lib")
#pragma comment(lib,"libmat.lib")

namespace Eigen {
template<typename T> Map<Matrix<T, Dynamic, Dynamic, ColMajor>> matlab2Eigen (const mxArray * pMat, bool needTranspose = true) {
    Map< Matrix<T, Dynamic, Dynamic, ColMajor>> matrixMap ( (T*) mxGetPr (pMat), mxGetM (pMat), mxGetN (pMat) );
    return matrixMap;
}
}
//define function name in the DLL
#pragma comment(linker,"/EXPORT:mexFunction") //保证了DLL导出的函数名未经过修改,等效于使用.def文件
void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
    /* 检查输入输出变量的个数 */
    if (nrhs != 2) mexErrMsgTxt ("Two inputs required.");
    else if (nlhs > 2) mexErrMsgTxt ("Too many output arguments");


    auto m1 = Eigen::matlab2Eigen<double> (prhs[0]);
    auto m2 = Eigen::matlab2Eigen<double> (prhs[1]);
    if (m1.rows() != m2.rows() || m1.cols() != m2.cols() ) 
		mexErrMsgTxt ("two matrix must be the same size.");


    /* 为返回参数创建矩阵 */
    plhs[0] = mxCreateNumericMatrix (m1.rows(), m1.cols(), mxDOUBLE_CLASS, mxREAL);
    auto m3 = Eigen::matlab2Eigen<double> (plhs[0]);
    m3 = m1 + m2;
}
分享到:
评论

相关推荐

    C++矩阵库 Eigen 快速入门

    近需要用 C++ 做一些数值计算,之前一直采用Matlab 混合编程的方式处理矩阵运算,非常麻烦,直到发现了 Eigen 库,简直相见恨晚,好用哭了。 Eigen 是一个基于C++模板的线性代数库,直接将库下载后放在项目目录下,...

    C++ Eigen库计算矩阵特征值及特征向量

    Eigen库是C++中的一个开源数学库,广泛应用于矩阵运算、线性代数、优化问题等领域。今天,我们将重点介绍Eigen库在计算矩阵特征值及特征向量方面的应用。 什么是矩阵特征值和特征向量 在线性代数中,矩阵的特征值...

    EIGEN矩阵库

    EIGEN矩阵库是C++编程语言中一个高效、灵活且功能强大的线性代数库,主要用于处理向量、矩阵以及相关的线性运算。它的设计目标是提供与MATLAB类似的矩阵操作体验,同时保持C++的性能和低级控制。在EIGEN库中,你可以...

    Eigen库的简单实用说明

    本文主要介绍了Eigen库的基本概念和使用方法,包括如何包含头文件、定义不同类型的矩阵、初始化矩阵、获取矩阵信息、矩阵和数组之间的转换以及调整矩阵大小等。通过学习这些基础知识,可以帮助开发人员快速上手并...

    实现matlab矩阵计算的C++源程序

    本项目旨在实现MATLAB矩阵计算的功能,将这些功能移植到C++环境中。下面我们将深入探讨如何在C++中实现MATLAB矩阵运算的关键知识点。 1. **矩阵基础**: 在MATLAB中,矩阵是最基本的数据结构,可以执行各种数学...

    Eigen_Matlab指令对照.pdf

    总而言之,这份Eigen和Matlab指令对照表为使用Eigen库的开发者提供了一个方便的参考,使他们能够快速找到如何用Eigen库来实现Matlab中常见的操作和函数,从而更顺利地进行数值计算和矩阵运算的开发工作。

    matlab开发-eigen

    在MATLAB环境中进行开发时,有时我们需要处理矩阵和向量的高级操作,这时"Eigen"的概念就显得尤为重要。Eigen在MATLAB中主要指的是特征值(eigenvalues)和特征向量(eigenvectors),它们是线性代数中的基本概念,...

    MATLAB矩阵计算器.zip

    标题中的“MATLAB矩阵计算器.zip”表明这是一个与MATLAB软件相关的资源,可能是一个实现矩阵运算的程序或工具。MATLAB是一种强大的数学计算环境,尤其在矩阵和数组操作方面表现出色,广泛应用于工程、科学和经济等...

    eigen-2.0.15_matlab_

    在"eigen-2.0.15_matlab_"这个压缩包中,我们可以推测它包含的是Eigen库的一个版本,该版本可能针对MATLAB用户进行了优化或者提供了与MATLAB兼容的接口。下面将详细介绍Eigen库及其在MATLAB环境中的应用。 Eigen库...

    C++调用Eigen矩阵运算库技巧的直观理解

    由于其简洁的API设计和高性能,使用Eigen可以使C++代码在处理矩阵运算时达到类似MATLAB的便捷性。 首先,要使用Eigen,你需要在项目中包含相应的头文件,例如`#include &lt;Eigen/Dense&gt;`,这将引入大部分常用的矩阵和...

    matlab矩阵的生成.zip

    虽然标签是"C++",但我们可以假设这个资源是关于MATLAB的,因为MATLAB矩阵的操作对于C++程序员学习数值计算库(如Eigen、NumPy等)也是有帮助的。 生成矩阵的基本方法有很多种,以下是一些关键点: 1. **空矩阵**...

    C++调用Eigen库技巧的直观理解.pdf

    Eigen库中提供了丰富的矩阵操作,包括转置、共轭和共轭转置。`transpose()`函数返回矩阵的转置,而`adjoint()`用于复数矩阵的共轭转置。`conjugate()`函数则返回矩阵的共轭。 获取矩阵的尺寸和元素数量是通过`size...

    C++调用Eigen库技巧的直观理解.docx

    在C++编程中,Eigen库是一个强大的矩阵和向量操作库,特别适合于数值计算和线性代数应用。本文将深入探讨如何有效地使用Eigen库,并提供一些直观的理解和示例。 首先,为了使用Eigen库,你需要在IDE中设置包含路径...

    复数矩阵的特征值分解

    4. 处理结果:从返回的矩阵中提取特征值和特征向量,通常特征值位于对角矩阵中,而特征向量则按列存储。 5. 清理:在完成计算后,记得释放分配的内存资源,防止内存泄漏。 在实际应用中,GSL的性能优势主要体现在...

    C++调用Eigen库技巧的直观理解 (2).docx

    C++中的Eigen库是一个高效的线性代数库,它提供了丰富的功能来处理矩阵和向量操作,对于数值计算和科学编程来说非常有用。以下是对Eigen库的一些关键知识点的详细解释: 1. **IDE设置**:在集成开发环境中,为了...

    Qt/C++特征分解eig奇异值分解SVD库

    Eigen库是这个领域的关键组件,它提供了与MATLAB相似的功能,使得开发人员能够在桌面应用程序中执行复杂的数值计算,特别是在信号处理、图像分析、机器学习等领域。以下将详细介绍Eigen库中的特征值分解(eig)、...

    矩阵的qr分解,特征值计算,谱分解

    例如,对于一个Eigen矩阵对象`MatrixXf A`,可以使用`A.fullPivHouseholderQR()`得到QR分解的结果。 **2. 特征值计算** 特征值是矩阵A满足方程Ax = λx的非零向量x对应的标量λ。特征值和特征向量揭示了矩阵的内在...

    eigen-3.3.7.zip

    Eigen是一个开源的C++库,专门用于处理线性代数问题,如向量、矩阵运算以及更复杂的线性系统解算。在标题“eigen-3.3.7.zip”和描述中,我们看到的是Eigen库的一个特定版本,即3.3.7版的压缩包。这个版本包含了所有...

    矩阵计算库,C++语言

    **矩阵计算库C++语言——深入理解Eigen** 在计算机科学中,线性代数是解决大量问题的关键工具,尤其是在图像处理、机器学习、物理模拟等领域。C++作为一门强大而灵活的编程语言,自然需要一个高效且易于使用的矩阵...

Global site tag (gtag.js) - Google Analytics