美文网首页
MATLAB编程与应用系列-第16章 外部接口技术(4)

MATLAB编程与应用系列-第16章 外部接口技术(4)

作者: 德特数据 | 来源:发表于2018-10-31 23:07 被阅读0次

    本章教程共分为7篇进行阐述:
    MATLAB编程与应用系列-第16章 外部接口技术(1)
    MATLAB编程与应用系列-第16章 外部接口技术(2)
    MATLAB编程与应用系列-第16章 外部接口技术(3)
    MATLAB编程与应用系列-第16章 外部接口技术(4)
    MATLAB编程与应用系列-第16章 外部接口技术(5)
    MATLAB编程与应用系列-第16章 外部接口技术(6)
    MATLAB编程与应用系列-第16章 外部接口技术(7)

    本系列教程来源于出版书籍《基于MATLAB编程基础与典型应用书籍》,如涉及版权问题,请联系:156204968@qq.com。 出版社:人民邮电出版社, 页数:525。

    本系列教程目前基于MATLABR2006a,可能对于更高级版本的功能和函数有差异,教程中如有问题,请联系:156204968@qq.com

    16.4 MATLAB引擎技术

    MATLAB引擎技术主要在工作环境中安装了MATLAB应用程序的前提下实现其他语言调用MATLAB函数,这种技术一方面可以保持C,C++和FORTRAN语言的运算速度快的特点,同时可以在C,C++和FORTRAN语言中嵌入复杂的数学分析函数,比如信号处理函数,工程优化函数,FFT变换函数等,减少了C,C++和FORTRAN编程的困难。MATLAB引擎技术主要应用于以下几个方面:

    • 在特定的应用场合下,需要采用C,C++或者FORTRAN语言进行快捷实时的运算,但是应用环境需要大量的数学分析和运算,此时,可以在C,C++和FORTRAN语言中嵌入MATLAB函数,调用MATLAB引擎。

    • 对于一些信号分析系统,数据采集处理系统,前台需要丰富的人机接口界面,后台需要做大量的数据分析处理,那么此时可以很好地利用MATLAB引擎。前台可以使用C,C++和FORTRAN语言编写操作界面,而后台则使用MATLAB引擎,直接调用MATLAB数学函数库,一方面减少C,C++和FORTRAN语言编写相关数学算法的复杂度,保证了数学分析函数的可靠性,同时也极大缩短了应用程序开发周期。

    16.4.1 Visual C++中调用MATLAB引擎配置

    在Visual C++环境中调用MATLAB引擎,首先需要对Visual C++环境进行配置,按照以下步骤进行MATLAB引擎环境配置。
    • 运行Microsoft Visual C++,在菜单栏【File】下选择新建一个工程文件,选择【New】,点击【Project】属性页,选择【Win32 Console Application】,给出工程文件名称,如图16.1所示。


    图16.1.新建Win32 Console Application工程项目png

    • 选择菜单栏【Tools】下的【Options】,在【Directories】属性页下,设置相关的Include文件路径,Libray文件路径和Executable文件路径。Inlcude文件路径设置为%matlabroot%\extern\include,其中%matlabroot%为读者计算机中MATLAB应用程序的安装根目录,Library文件路径设置为%matlabroot%\extern\lib\win32\microsoft, Executable文件路径设置为%matlabroot%\bin\win3,如图16.2所示。

    图16.2.Visual C++中包含文件,库文件路径设置png

    • 选择菜单栏【Project】下的【Setting】选项,在【Link】属性页中,添加libeng.lib,libmex.lib,libmx.lib,libmat.lib库文件,注意库文件之间使用空格而不使用逗号,否则编译会出错,如图16.3所示。


    图16.3.Visual C++中Link选项设置png

    16.4.2 主要的MATLAB引擎函数

    MATLAB的应用程序接口(API)函数库的Engine函数库包含了许多引擎操作的函数,这些函数以Eng作为前缀,同MEX函数库和MX函数库相同,通过前缀来表明函数所在的API函数库。表16.5所示为常用的C语言Engine函数库函数功能描述。表16.6所示为常用的FORTRAN语言Engine函数库函数。

    表16.5 常用的C语言Engine函数库函数

    函数名 功能描述
    engOpen 启动MATLAB引擎
    engClose 关闭MATLAB引擎
    engGetVariable 从MATLAB引擎中获取MATLAB变量
    engPutVariable 将MATLAB变量传递给MATLAB引擎
    engEvalString 执行MATLAB字符串命令
    engOutPutBuffer 创建一个MATLAB缓冲区来存储MATLAB的文本输出
    engSetVisible 设置显示或者隐藏MATLAB引擎

    表16.6 常用的FORTRAN语言Engine函数库函数

    函数名 功能描述
    engOpen 启动MATLAB引擎
    engClose 关闭MATLAB引擎
    engGetVariable 从MATLAB引擎中获取MATLAB变量
    engPutVariable 将MATLAB变量传递给MATLAB引擎
    engEvalString 执行MATLAB字符串命令
    engOutPutBuffer 创建一个MATLAB缓冲区来存储MATLAB的文本输出

    16.4.3 实例演示

    在了解MATLAB引擎相关函数和Visual C++环境配置后,在本小节中将通过两个实例分别演示在MATLAB环境下使用MEX命令编译Engine函数和在Visual C++环境下编译运行Engine函数。

    1. 使用MEX文件编译Engine函数
    在MATLAB安装程序的路径下,提供了一些Engine函数的演示,读者可以打开文件查看Engine文件编写的基本结构和方法。首先拷贝C:\Prgoram Files\MATLAB\R2006a\extern\examples\eng_mat\engwindemo.c文件到当前MATLAB的工作窗口中,或者直接打开MATLAB,在MATLAB命令行窗口中输入以下命令:

    demofile = [matlabroot '\extern\examples\eng_mat\engwindemo.c'];
    copyfile(demofile, '.');
    

    通过which命令可以看到engwindemo.c文件已经拷贝到当前路径下,然后选择编译属性文件,在MATLAB命令行窗口中输入以下命令:

    optsfile = [matlabroot '/bin/engopts.sh'];
    mex('-f', optsfile, 'engdemo.c');
    

    或者直接使用以下的MATLAB命令行命令:

    mex('-f', [matlabroot  '\bin\win32\mexopts\lccengmatopts.bat'], ‘engwindemo.c’);
    

    编译成功后,可以看到在MATLAB的当前工作窗口中出现了一个engwindemo.exe可执行文件,在MATLAB命令行窗口中输入:

    !engwindemo
    

    通过!操作符,可以在MATLAB的命令行窗口中执行.exe文件,文件运行后的结果如图16.4所示。


    图16.4.程序运行结果png

    2. 在Visual C++中编译运行MATLAB Engine
    按照16.4.1节中Visual C++调用MATLAB引擎的配置方法,对VC环境进行配置,配置成功后,建立工程项目文件,就可以编译运行MATLAB引擎。实例matlabEngDemo.c为一个简单的调用MATLAB应用实例。

    /*
     *  matlabEngDemo.c
    */
    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    //包含engine.h头文件或者精确列出文件所在,读者根据Matlab安装路径修改即可
    //  #include <C:\Program Files\MATLAB\R2006a\extern\inlcude\engine.h>
    #include "engine.h"
    int main(void)
    {
        Engine *ep;
        mxArray *temperatureValue;
        double tempValue[]={0,4,6,10,12,16,22,26,30};
        int length;
        
        //开启Matlab引擎 Engine
        if( !(ep = engOpen(NULL)) )
        {
            //MatlabEngDemo.c为保存的文件名
            MessageBox( (HWND)NULL, (LPSTR)"Can't start MATLAB engine",
                        (LPSTR)"matlabEngDemo.c", MB_OK);
            exit(-1);
        }
        
        //如果正常开启Matlab引擎,则调用引擎函数
        length = sizeof(tempValue)/sizeof(double);
        //初始化mxArray变量temperatureValue
        temperatureValue = mxCreateDoubleMatrix(1, length, mxREAL);
        //将tempValue的数值拷贝给temperatureValue
        memcpy( (void *)mxGetPr(temperatureValue), (void *) tempValue, length * sizeof(double));
        //将变量导入工作窗口Workspace中
        engPutVariable(ep, "Temperature", temperatureValue);
        //以下利用engEvalString函数调用Matlab命令
        engEvalString(ep, "Density = -0.256 * Temperature.^2 + 6.16 * Temperature - 33.9;");
        engEvalString(ep, "plot(Temperature, Density,'r-');");
        engEvalString(ep, "title('Density vs. Temperature curve');");
        engEvalString(ep, "xlabel('Temperature');");
        engEvalString(ep, "ylabel('Density');");
        engEvalString(ep, "grid on;");
        //释放内存空间
        mxDestroyArray(temperatureValue);
        return 0;
    }
    

    编译运行程序后,可以得到如图16.5所示的运行结果。


    图16.5.程序运行结果png

    在启动的MATLAB命令行窗口中。使用whos命令,查看当前工作窗口中的变量,结果如下所示:

    >> whos
      Name              Size                    Bytes  Class
      Density           1x9                        72  double array
      Temperature       1x9                        72  double array
    Grand total is 18 elements using 144 bytes
    

    作者:德特数据
    联系方式:156204968@qq.com

    相关文章

      网友评论

          本文标题:MATLAB编程与应用系列-第16章 外部接口技术(4)

          本文链接:https://www.haomeiwen.com/subject/gcnztqtx.html