当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

matlab矩阵转为Eigen库中的矩阵

发表于: 2013-11-01   作者:cherishLC   来源:转载   浏览次数:
摘要: 在matlab,C++联合编程的过程中,想使用一下Eigen库(一个C++矩阵运算库)。 为啥不直接用matlab的库呢? 有两点考虑: 1、matlab中写for循环太慢,处理图像块有时还得两层for循环 2、在C++中采用matlab函数,不利于生成独立的C++程序。 不多说了,上代码: 以下是将matlab矩阵转为Eigen中的Map(可以当做矩阵使用)的
在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;
}

matlab矩阵转为Eigen库中的矩阵

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
1 矩阵
矩阵概念: 矩阵就是一系列数据的集合。 矩阵A的维度是p*q就代表该矩阵A有p行q列 如果用矩阵处理计
>> zeros(3) ans = 0 0 0 0 0 0 0 0 0 >> ones(3) ans = 1 1 1 1 1 1 1 1 1 >> e
PS:主要是讲解矩阵的相应的实现方法,其实MATLAB的很大一部分的优势,就是集成了矩阵级别的运算,
颜色矩阵 在flash中可以用矩阵方便的操作颜色。在flash8以前的版本,操作颜色的唯一途径就是通过修改
(作者:lcc) 多维数组 维数(Dimensions)超过2的数组均可视为「多维数组」(Multidimesional Arrays
这个周开始要着手实现网格水印的代码了,虽然还什么都不会,但也只能一步步摸索着往前走了。 我要实
1 #include<stdio.h> 2 3 //宏定义 4 #define max_row 200 //定义矩阵最大的行数 5 #define m
1 #include<stdio.h> 2 3 int main() 4 { 5 int i,j,k; 6 int n,m; //n:用于记录图中的节点
  根据公式可以直接推得:S(n) =S(n-1)+F(n)                 =S(n-1)+3*F(n-1)+2
《C和指针》第8章编程练习第5题: 1 /* 2 ** 矩阵相乘 3 */ 4 5 #include <stdio.h> 6 7 /* 8
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号