zoukankan      html  css  js  c++  java
  • VC 编译 MATLAB 的 mex 文件

    VC 编译 MATLAB mex 文件
    mex 文件是 MATLAB 调用其他程序设计语言程序或算法的接口。在 Windows 环境中,
    mex 文件是扩展文件名为 DLL 的动态链接库,可以在 m 程序中直接调用,用户可以通过
    234 MATLAB 实用教程
    MATLAB 提供的命令“mex”将 C 程序编译成 mex 文件,实现 MATLAB 环境下直接调用或
    链接这些程序。mex 文件必须在 C 语言编写后用“mex”命令编译生成,编写时按照 MATLAB
    规定的格式和步骤进行,采用 mex 函数库中的函数与 MATLAB 进行交互,从 MATLAB 中获
    取数据并返回信息。
    本节在讲述 mex 文件系统设置、mex 函数和 mex 文件建立方法的基础上,通过实例说明
    VC 编译 MATLAB mex 文件的方法。
    11.5.1 mex 文件系统设置
    编译和生成 mex 文件,需要安装 MATLAB 应用程序接口组件及 C 语言编译器。在
    Windows 环境下编译 mex 文件,编译器必须支持 32 位的 Windows 动态链接库。第一次使用
    mex 命令时必须通过命令窗口执行命令“mex –setup”进行适当配置,配置时第一个问题可
    选“n”,编译器可选用“Microsoft Visual C/C++ version 6.0”。
    11.5.2 mex 函数和 mex 文件
    mex-函数是 MATLAB 外部程序的接口函数,以 mex 为前缀,用于实现 mex 文件与
    MATLAB 的交互,mexFunction 函数是 mex 文件的核心。
    MexFunction 的函数声明如下:
    void mexFunction(int nlhs,mxArray *plhs[ ], int nrhs,const mxArray *prhs[ ])
    其中,nlhs 为输出变量的个数;plhs 为指向输出变量指针的数组;nrhs 为输入变量的个
    数;prhs 为指向输入变量指针的数组。mexFunction 函数中的参数声明是只读的,不能被修改,
    MATLAB 调用 mex 程序时自动生成参数 nlhsplhsnrhs prhs
    MATALB 中相应函数的调用格式为“[a,b,]=fun(c,d,)”,ab,… 为函数的输出变量,
    cd,… 为函数的输入变量,此时 nlhs ab,… 变量的个数,nrhs cd,… 变量的
    个数。例如,调用名为 engwm 的文件,可在 MATLAB 的命令行输入“[a,b,c]=engwm(x,y)”,
    执行后 nrhs=2nlhs=3、并创建指针数组 prhs[0]-> xprhs[1]->y,这时输出变量还没有创建,
    指针数组中 plhs[0]plhs[1]plhs[2]均指向 NULL
    函数 mexErrMsgTxt 用于显示错误信息,显示完毕后立即终止当前运行的 mex 程序(这
    与其他显示函数不同)。其他 mex 函数可参阅 MATLAB 的帮助文档。
    下面通过编写显示字符串的程序,说明 mex 文件的建立和使用方法。
    1)编写 C 语言程序代码
    VC 中新建文件 good.cpp 并将其保存在指定目录中(如 E:MEX),如图 11-22 所示。
    good.cpp 的代码如下:
    #include “mex.h”
    void mexFunction(int nlhs,mxArray *plhs[ ],int nrhs, const mxArray *prhs[ ])
    {
    mexPrintf(“Good Morning! ”);
    }
    这里,必须包含头文件 mex.h(该文件包含定义矩阵的头文件 matrix.h mex 函数的声
    11 章 编译器与外部接口 235
    明),mexPrintf 函数(只能用于 mex 程序)与 printf 函数的用法基本相同。


    11-22 创建文件 good.cpp
    2)编译 good.cpp
    打开 MATLAB 平台并将工作目录改为 good.cpp 所在目录 E:MEX,输入命令“mex
    good.cpp”,则在目录 E:MEX 下生成同名 DLL 程序 good.dll
    3)执行 good.dll 程序
    输入命令“good”将显示字符串“Good Morning”,如图 11-23 所示。


    11-23 MEX 程序的编译和执行
    上述源文件 good.cpp C++文件,也可用 C 文件 good.c 作为源文件(两文件代码相同)。
    mex 编译生成 mex 文件时,命令改为“mex good.c”,good.c 所在目录中生成 good.dll,而
    good.dll 的调用方法不变。
    236 MATLAB 实用教程
    11.5.3 VC 编译 mex 文件使用实例
    前面通过 MATALB 命令“mex”编译了 mex 文件,如果 mex 程序比较复杂(例如需要
    复杂界面窗口),应考虑使用 VC Project WizardClass Wizard 编译,下面用一个实例介绍。
    1.设置 VC 的头文件搜索路径和库文件搜索路径
    设置方法与 VC 调用 MATLAB 引擎时的设置相同,这里不再赘述。
    2.建立工程
    MFC AppWizard(dll)方式在指定目录下建立名为 Mexwm 的工程并选择静态链接。工
    Mexwm 包含若干头文件和 Mexwm.cppMexwm.defMexwm.rcStdAfx.cpp 文件。
    文件 Mexwm.def 中加入 mexFunction 函数,修改后的代码如下:
    ; Mexwm.def : Declares the module parameters for the DLL.
    LIBRARY "Mexwm"
    DESCRIPTION 'Mexwm Windows Dynamic Link Library'
    EXPORTS
    ; Explicit exports can go here
    mexFunction
    新建文件 circumference.cpp 并加入工程(文件功能是求圆周长),代码如下:
    #include "stdafx.h"
    #include "mex.h"
    #include <math.h>
    void circumference(double y[ ],double x[ ])
    {
    y[0]=x[0]*2*3.14;
    return;
    }
    void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
    {
    double *x; double *y; CString str;
    //检查变量个数
    if(nrhs!=1)
    {
    mexErrMsgTxt("输入变量只能为 1 个!");
    }
    else if(nlhs!=1)
    {
    mexErrMsgTxt("输出变量只能为 1 个!");
    }
    plhs[0]=mxCreateDoubleMatrix(1,1,mxREAL); //创建输出变量矩阵
    y=mxGetPr(plhs[0]); //赋输出变量的数据指针给 y
    x=mxGetPr(prhs[0]); //赋输入变量的数据指针给 x
    //调用计算程序
    circumference(y,x);
    str.Format("圆周为%3.2f",*y);
    11 章 编译器与外部接口 237
    AfxMessageBox(str);
    }
    3.设置工程选项
    选择菜单【Project】中的【settings】打开工程设置对话框,在 Link 选项卡的【对象/
    模块】文本框输入库文件名 libmx.lib libmex.lib libmat.lib(见图 11-24),在【C/C++】选项卡
    的【Preprocessor definitions field】文本框中输入 MATLAB_MEX_FILE(见图 11-25)。设置
    完毕并编译连接之后,工程所在目录下 debug 文件夹中生成动态连接库 Mexwm.dll


    11-24 添加库文件


    11-25 添加预处理程序定义
    4.运行程序
    打开 MATLAB 平台并将当前目录设为 Mexwm.dll 所在目录 E:wm object Mexwm Debug
    输入命令“x=6;y=Mexwm(x);”得到圆周结果,如图 11-26 所示。
    238 MATLAB 实用教程

    11-26 MATLAB 执行 Mexwm.dll 的结果

    1.列举 MATLAB 编译器 4.0 与以往编译器的不同。
    2.试通过 MATLAB 自带帮助文档,归纳 mcc 命令的用法。
    3.利用 MATLAB 编译器生成的独立应用程序分发到目标机器有哪些步骤?
    4.独立应用程序如何在目标机器上安装和运行?
    5.试述 EXCEL Link 的安装步骤。
    6.列举 EXCEL Link 的数据处理函数及其功能。
    7.用 COM 生成器生成和创建 COM 组件,包括哪四个步骤?
    8.组件打包时,应将那些文件打包创建自解压可执行程序?
    9MATLAB 引擎库函数常用的有哪些?请说明相应的功能。
    10VC 调用 MATLAB 引擎时,需进行哪些设置?VC 中编译 mex 文件时的设置有什
    么不同?
    11.已知 A 市有甲、乙、丙、丁四县。2004 年各县外贸出口额分别为 4 千万元,6 千万
    元,5.5 千万元 9 千万元,请用 VC 调用 MATLAB 引擎绘制饼状图显示各县对 A
    外贸出口贡献率。
    12.用 VC++编译生成 mex 文件,实现输入长方体的长、宽、高的功能,并求出其体积。
    13.利用 EXCEL Link 调用 MATLAB,对矩阵 A=[1 3 54 6 88 3 9]进行 LU 分解,并
    将结果显示在 EXCEL 列表中。

  • 相关阅读:
    PDF,仅支持英译中,可以下载后的pdf或者word版
    pip指定源安装【自用】
    【jQuery01】jQuery选择器
    【jQuery00】什么是jQuery,为什么要学jQuery,配置jQuery环境,解决冲突,大致使用流程
    什么是召回率??
    编程学习路线
    堆排序
    二叉插入排序
    每天算法一丁点(4)--递归算法应用:分书问题
    每天算法一丁点(3)--递归算法应用:半数集
  • 原文地址:https://www.cnblogs.com/fanglijiao/p/11225348.html
Copyright © 2011-2022 走看看