MEX文件调试—MATLAB调用C++程序—混合编程

来源:互联网 发布:js window.android 编辑:程序博客网 时间:2024/04/27 22:51
  • 转载:http://www.blogbus.com/shijuanfeng-logs/106781870.html

    • MATLAB要调用C++程序步骤:

    1. 在MATLAB命令行敲:mex -setup,选择你所使用的C++版本,装上mex
    2. 用“mex [参数] *.cpp”, eg:mex -O -c svm.cpp
    这时在当前目录下就会生成*.mexw32,*.mexw64的文件,这个文件类似于c++的dll文件,MATLAB可以直接调用。

     

    当前,上述的cpp文件不是我们平时所写的以main函数为入口,而是是mexFunction函数为入口,当然,还有其他不同,以下会进一步说明。

    Mex文件的产生和调试(版本:VC++6.0和MATLAB7.0):(网上的实例不对,我在此进行了修正,请注意:删除线化掉的部分)

    1. 建立 MFC 动态链接工程 

    (1) 建立一个名为 sum_prod 的 MFC 动态链接工程 

    (2) 单击 OK 按钮,出现对话框,选择使用 静态链接 MFC 的 DLL ,其它采用默认设置。

    (3) 在 Sample 目录下会生成 sum_prod.cpp 和 sum_prod.def 这两个文件。

    2 、 VC++6.0 环境及工程设置

    在上面的 VC 工程中,进行以下设置

    (1) VC++6.0 环境设置

    单击菜单 Tools ,单击 Options… 菜单项,出现 Options 对话框,选择 Directories 标签,在 include files 里面加入:

    C:\MATLAB6P5\EXTERN\INCLUDE

    在 Library files 里面加入:

    C:\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60

     2) VC++6.0 工程设置

    单击菜单 Project ,单击 Setting… 菜单项,出现 Project Setting 对话框,选择 Link 标签,在 Object/library modules: 下面的文本框内容的后面加入 libmx.lib libmex.lib libmatlbmx.liblibmat.lib 

    设置完成。

    3.MATLAB设置: 

    (1) mex 命令设置

    (a) 运行 Matlab ,在 Matlab 的命令窗口 (Command Window) 键入“ mex -setup ”命令后,按回车键,安装 Matlab 编译器;

    (b) 命令窗口出现如下提示:

    Please choose your compiler for building external interface (MEX) files:

    Would you like mex to locate installed compilers [y]/n?

    此时键入 ”y” ,按回车;

    (c) 命令窗口出现如下提示:

    Please choose your compiler for building external interface (MEX) files:

    Would you like mex to locate installed compilers [y]/n?y

    Select a compiler:

    [1] Digital Visual Fortran version 6.0 in C:\Program Files\Microsoft Visual Studio

    [2] Lcc C version 2.4 in C:\MATLAB6P5\sys\lcc

    [3] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio

    [0] None

    此时键入 ” 3” ,按回车;选择 Microsoft Visual C++6.0 的编译器

    (d) 命令窗口出现如下提示:

    Please verify your choices:

    Compiler: Microsoft Visual C/C++ 6.0

    Location: C:\Program Files\Microsoft Visual Studio

    Are these correct?([y]/n):

    此时键入 ”y” ,按回车;确认选择 Microsoft Visual C++6.0 的编译器

    (3) mbuild 命令设置

    (a) 运行 Matlab ,在 Matlab 的命令窗口 (Command Window) 键入“ mbuild -setup ”命令后,按回车键,安装 Matlab 编译器;

    (b) 命令窗口出现如下提示:

    Please choose your compiler for building standalone MATLAB applications:

    Would you like mbuild to locate installed compilers [y]/n?

    此时键入 ”y” ,按回车;

    (c) 命令窗口出现如下提示:

    [1] Lcc C version 2.4 in C:\MATLAB6P5\sys\lcc

    [2] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio

    [0] None

    此时键入 ” 2” ,按回车;选择 Microsoft Visual C++6.0 的编译器

    (d) 命令窗口出现如下提示:

    Please verify your choices:

    Compiler: Microsoft Visual C/C++ 6.0

    Location: C:\Program Files\Microsoft Visual Studio

    Are these correct?([y]/n):

    此时键入 ”y” ,按回车;确认选择 Microsoft Visual C++6.0 的编译器

    (4) 在 Matlab 的命令窗口 (Command Window) 键入“ cd(prefdir); mccsavepath prefdir; ” 启动 MATLAB add-in 工具条 。MATLAB7.0,输入的是:cd(prefdir); savepath prefdir;就可以了,其他版本未知。

    4.添加 mexFunction 函数代码

    (1) 打开 sum_prod.def 文件,在“ EXPORTS ”后面(最后一行)加入 mexFunction 一行 ,声明 mexFunction 函数为导出函数,下面是编辑后的 sum_prod.def 文件内容

    (2) 打开 sum_prod.cpp 文件,在该文件尾部添加 mexFunction 函数代码 。也可以将 mexFunction 函数代码用另外一个 cpp 文件保存,在每个文件的开始应加上这一行
    #include "stdafx.h"
    (3) 与第 1 步 Maltab 函数相对应的 mexFunction 函数代码如下:
         #include "mex.h" // mx,mex 函数头文件

    // 定义输入参数

    #define P1 prhs[0]

    #define P2 prhs[1]

    // 定义输出参数

    #define SUM plhs[0]

    #define PROD plhs[1]

     

    // 定义 C 运算函数

    void SUM_PROD_RUN(double *sum,

    double *prod,

    double *p1,

    double *p2,

    int m1,

    int n1)

    {

    // C 源程序代码

    int i;

    for (i=0;i

    {

    sum[i] = p1[i]+p2[i];

    prod[i] = p1[i]*p2[i];

    }

    }

    void mexFunction (int nlhs, mxArray *plhs[], // 输出参数个数,及输出参数数组

    int nrhs, const mxArray *prhs[]) // 输入参数个数,及输入参数数组

    {

    int m1,n1,m2,n2;

    double *p1,*p2,*sum,*prod;

    // 取得输出矩阵的行列数

    m1 = mxGetM(P1);

    n1 = mxGetN(P1);

    m2 = mxGetM(P2);

    n2 = mxGetN(P2);

    // 输入矩阵的行列数必须相等

    if (m1!=m2||n1!=n2)

    mexErrMsgTxt("The size of input matrix must be equal!\n");

    // 为输出变量分配内存空间

    SUM = mxCreateDoubleMatrix(m1,n1,mxREAL);

    PROD = mxCreateDoubleMatrix(m1,n1,mxREAL);

    // 取得输入参数指针

    p1 = mxGetPr(P1);

    p2 = mxGetPr(P2);

    // 取得输出参数指针

    sum = mxGetPr(SUM);

    prod = mxGetPr(PROD);

    // 调用 C 运算函数

    SUM_PROD_RUN(sum,prod,p1,p2,m1,n1);

    return;

    }

    (4) 编译链接程序后,可以在 Debug 目录得到 sum_prod.dll ,该 DLL 就是 Matlab 环境中可直接调用的 C 语言 mex 函数 

    mex 函数

    5 、 mexFunction 函数调试

    (1) 在 VC++6.0 中以 Debug 方式建立以上 sum_prod 工程

    (2) 单击菜单 Project ,单击 Setting… 菜单项,出现 Project Setting 对话框,选择 Debug 标签, 在 Executable for debug session: 下面的文本框内容的后面加入 matlab.exe 的完整路径名 

    接 OK 按钮。

    (3) 在 mexFunction 源程序中合适的 设置断点,然后按 F5 键进入调试过程 。

    (4) 进入调试过程后,就会启动 一个新的 Matlab 程序,这个 Matlab 程序的当前目录为该工程所在的位置,为了运行 sum_prod.dll ,需要 将当前目录设置为 Debug 目录 。

    (5) 在 Matlab 命令窗口调用 sum_prod.dll ,程序就会停在 VC++6.0 环境里的程序断点处。此时可以 在 Context 窗口中看到最近处理的变量数值 ,并可以 随意添加 Watch 。这样就可以像调试通常的 C 程序一样对 mex 程序进行调试。

     7 、 mexFunction 函数测试

    (1) 运行 Matlab6.5 ,将 sum_prod.dll 复制到 Matlab 当前目录

    (2) 在 Matlab6.5 命令窗口输入以下代码

    “ p1=[1 2;3 4];p2=[5 6;7 8];[sum,prod]=sum_prod(p1,p2) ”

    按回车键,得到

    sum =

    6 8

    10 12

    prod =

    5 12

    21 32

    表明 sum_prod.dll 测试成功! 

0 0
原创粉丝点击