目录
  • 一.工程配置
    • 1.配置生成文件
    • 2.配置附加目录
    • 3.添加附加依赖项
  • 二.接口编写
    • 1.添加头文件
    • 2.接口函数编写
    • 3.输入参数获取
    • 4.出错信息发布函数mexErrMsgTxt,mexWarnMsgTxt
    • 5.输出参数设置
    • 6.参数转置
  • 总结

    由于matlab的运算速度较慢,因此常常需要使用c++对关键部分进行运算。Matlab针对这一需求提供了相应的api方便参数传递以及封装。

    这里使用的vs工程,对文件进行修改生成.mexw64文件,对于matlab可识别的文件。

    这里的操作都是针对vs进行配置和操作。

    一.工程配置

    1.配置生成文件

    右键->属性->常规->配置类型 动态库(.dll)

    右键->属性->高级->目标文件扩展名 .mexw64

    2.配置附加目录

    右键->属性->c++->附加包含目录  添加$(Matlab_Dir)\extern\include; 

    其中$(Matlab_Dir)为matlab安装地址

    右键->属性->链接器->附加库目录 添加$(Matlab_Dir)\extern\lib\win64\microsoft;;

    其中$(Matlab_Dir)为matlab安装地址

    3.添加附加依赖项

    右键->属性->链接器->输入->附加依赖项

    输入libmx.lib;libmex.lib;libmat.lib;libeng.lib;

    二.接口编写

    1.添加头文件

    #include "mex.h"是matlab提供的头文件,利用提供的api进行接口函数编写

    2.接口函数编写

    入口过程的名称必须是mexFunction,并且包含四个参数

    void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]);

    nlhs 输出参数个数,plhs 输出参数指针 

    nrhs 输入参数个数,prhs 输入参数指针 

    注意: 输出和输入参数的操作都是通过指针的方式进行的MATLAB可以通过这些指针,访问内存中的数据

    3.输入参数获取

    接口过程要把参数传递给计算过程,还需要从prhs中读出矩阵的信息,这就要用到下面的mx-函数和mex-函数。

    • mxGetM(prhs[0]); 获取其行数
    • mxGetN(prhs[0]); 获取其列数
    • mxGetNumberOfDimensions(prhs[0]);获取其维度

    主要介绍的是数据获取的两个函数 mxGetData 和 mxGetPr。

    mxGetData返回值为void类型的指针,必须转换为正确数据类型的指针的指针。

    mxGetPr返回值为double类型的指针,可以理解为它会自动转换 mxGetData的输出作为double指针。

    在使用上这两种都可以获取参数内容。

    还有一点需要注意的是,无法对未获取的值进行操作。

    下面的代码在调试时会报错,无法对于未保存的变量进行操作。

    Number = ((double*)mxGetData(mxGetCell(prhs[0], 19)))[0]-1;

    4.出错信息发布函数mexErrMsgTxt,mexWarnMsgTxt

    两函数的具体格式如下:

    #include "mex.h"

    void mexErrMsgTxt(const char *error_msg);

    void mexWarnMsgTxt(const char *warning_msg);

    其中error_msg包含了要显示错误信息,warning_msg包含要显示的警告信息。两函数的区别在于mexErrMsgTxt显示出错信息后即返回到MATLAB,而mexWarnMsgTxt显示警告信息后继续执行。

    5.输出参数设置

    对于程序的返回结果需要将其保存在plhs指针当中,而且保存在plhs的返回指针类型必须是mxArray。

    这里介绍两个api进行数组,矩阵的创建。由于常用的数据类型为double,这里列举的均为double类型的数组。

    plhs[0] = mxCreateNumericArray(3, dims,mxDOUBLE_CLASS, mxREAL);
    plhs[1] = mxCreateDoubleMatrix(n, n, mxREAL);    

    6.参数转置

    由于matlab的数据存储顺序与c++不同,因此在数据输入时需要对数据进行转换。在数据输出传递的时候,同样也需要对数组进行转换。

    matlab对于数组存储是按照列进行保存的,而c++是按照行进行保存,因此在数据计算时需要格外注意。

    这里是常用的行列转换的代码。

    template <class T1, class T2>
    void cTranspose3d(T1* dst, T2* src, int srcRow, int srcCol, int channel)
    {
    	int i = 0, k = 0;
    	T1* dst1 = NULL;
    	T2* src1 = NULL;
    	for (k = 0; k < channel; k++)
    	{
    		dst1 = dst + k * srcRow * srcCol;
    		src1 = src + k * srcRow * srcCol;
    		for (i = 0; i < srcRow * srcCol; i++)
    		{
    			dst1[i] = src1[(i % srcRow) * srcCol + (i / srcRow)];//th/ srcRow//src's  col -> dst's row,th%srcRow//src's   row -> dst's col
    		}
    	}
    }

    总结

    至此整个接口书写就结束了。该篇教程也是记录一下自己整个学习过程,希望能够看的人一点点帮助。

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。