VS2015调用Matlabr2016a函数的混合编程方法1.环境配置1.1.配置环境变量:右击桌面“计算机”——属性——高级系统设置——“环境变量”——系统变量中“Path”中添加:C:\ProgramFiles\MATLAB\R2016a\bin\win64。我的Path:C:\ProgramFiles\Broadcom\Broadcom802.11NetworkAdapter\Driver;C:\ProgramFiles(x86)\Intel\iCLSClient\;C:\ProgramFiles\Intel\iCLSClient\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\ProgramFiles\Lenovo\BluetoothSoftware\;C:\ProgramFiles\Lenovo\BluetoothSoftware\syswow64;C:\ProgramFiles(x86)\Intel\OpenCLSDK\3.0\bin\x86;C:\ProgramFiles(x86)\Intel\OpenCLSDK\3.0\bin\x64;C:\ProgramFiles(x86)\NVIDIACorporation\PhysX\Common;C:\ProgramFiles\Intel\Intel(R)ManagementEngineComponents\DAL;C:\ProgramFiles\Intel\Intel(R)ManagementEngineComponents\IPT;C:\ProgramFiles(x86)\Intel\Intel(R)ManagementEngineComponents\DAL;C:\ProgramFiles(x86)\Intel\Intel(R)ManagementEngineComponents\IPT;C:\ProgramFiles(x86)\IDMComputerSolutions\UltraCompare;C:\ProgramFiles(x86)\MicrosoftSQLServer\90\Tools\binn\;D:\MATHWORK_R2014A\runtime\win64;D:\MATHWORK_R2014A\bin;D:\MATHWORK_R2014A\polyspace\bin;C:\ProgramFiles\MATLAB\R2016a\runtime\win64;C:\ProgramFiles\MATLAB\R2016a\bin;%USERPROFILE%\.dnx\bin;C:\ProgramFiles\MicrosoftDNX\Dnvm\;C:\ProgramFiles\MicrosoftSQLServer\120\Tools\Binn\;C:\ProgramFiles\MicrosoftSQLServer\130\Tools\Binn\;C:\ProgramFiles(x86)\WindowsKits\8.1\WindowsPerformanceToolkit\;C:\ProgramFiles\MATLAB\R2016a\polyspace\bin;C:\ProgramFiles\MATLAB\R2016a\bin\win64。1.2.注册matlab/regserver在命令行以管理员权限启动cmd.exe,cdC:\ProgramFiles\MATLAB\R2016a\bin\win64matlab.exe/regserver或者以管理员权限运行matlabregserver.bat1.3.设置vs2015要在VC中成功编译Matlab引擎程序,必须包含引擎头文件engine.h并引入Matlab对应的库文件libmx.lib、libmat.lib、libeng.lib。具体的说,打开一个工程后,做如下设置:vs2008:1)通过菜单工具/选项,打开选项页,点击项目和解决方案,然后在页面右面“显示以下内容的目录”下拉列表框中选择“包含文件”,添加路径:C:\ProgramFiles\MATLAB\R2016a\extern\include。2)选择“库文件”,添加路径:C:\ProgramFiles\MATLAB\R2016a\extern\lib\win64。vs2015:1)右击工程/属性,打开项目属性页,选择vc++目录,在包含目录和库目录分别添加C:\ProgramFiles\MATLAB\R2016a\extern\include和C:\ProgramFiles\MATLAB\R2016a\extern\lib\win64。如下图2.混合编程指令在调用Matlab引擎之前,首先应在相关文件中加入一行:#includeenging.h,该文件包含了引擎API函数的说明和所需数据结构的定义。2.1.引擎的打开和关闭engOpen-打开Matlabengine函数声明:Engine*engOpen(constchar*startcmd);参数startcmd是用来启动Matlab引擎的字符串参数,在Windows操作系统中只能为NULL。函数返回值是一个Engine类型的指针,它是在engine.h中定义的engine数据结构。EngClose-关闭Matlab引擎函数声明:intengClose(Engine*ep);参数ep代表要被关闭的引擎指针。函数返回值为0表示关闭成功,返回1表示发生错误。例如,通常用来打开/关闭Matlab引擎的代码如下:Engine*ep;//定义Matlab引擎指针。if(!(ep=engOpen(NULL)))//测试是否启动Matlab引擎成功。{MessageBox(Can'tstartMatlabengine!);exit(1);}.…………engClose(ep);//关闭Matlab引擎。2.2.向Matlab发送命令字符串engString-发送命令让Matlab执行。函数声明:intengEvalString(Engine*ep,Constchar*string);参数ep为函数engOpen返回的引擎指针,字符串string为要matlab执行的命令。函数返回值为0表示成功执行,返回1说明执行失败(如命令不能被Matlab正确解释或Matlab引擎已经关闭了)。2.3.获取Matlab命令窗口的输出要在VC中获得函数engString发送的命令字符串被Matlab执行后在matlab窗口中的输出,可以调用engOUtputBuffer函数。函数声明:intengOutputBuffer(Engine*ep,char*p,intn);参数ep为Matlab引擎指针,p为用来保存输出结构的缓冲区,n为最大保存的字符个数,通常就是缓冲区p的大小。该函数执行后,接下来的engString函数所引起的命令行输出结果会在缓冲区p中保存。如果要停止保存,只需调用代码:engOutputBuffer(ep,NULL,0)。2.4.读写Matlab数据从Matlab引擎工作空间中获取变量。mxArray*engGetVariable(Engine*ep,constchar*name);参数ep为打开的Matlab引擎指针,name为以字符串形式指定的数组名。函数返回值是指向name数组的指针,类型为mxArray*(mxArray数据类型在本文第4节详细简介)。向Matlab引擎工作空间写入变量。intengPutVariable(Engine*ep,constchar*name,constmxArray*mp);参数ep为打开的Matlab引擎指针,mp为指向被写入变量的指针,name为变量写入后在Matlab引擎工作空间中的变量名。函数返回值为0表示写入变量成功,返回值为1表示发生错误。2.5.调用引擎时显示/隐藏Matlab主窗口默认情况下,以engine方式调用Matlab的时候,会打开Matlab主窗口,可在其中随意操作。但有时也会干扰应用程序的运行,可用以下设置是否显示该窗口。intengSetVisible(Engine*ep,boolvalue);参数ep为打开的Matlab引擎指针,value为是否显示的标志,取值true(或1)表示显示Matlab窗口,取值false(或0)表示隐藏Matlab窗口。函数返回值为0表示设置成功,为1表示有错误发生。要获得当前Matlab窗口的显示/隐藏情况,可以调用函数:intengGetVisible(Engine*ep,bool*value);参数ep为打开的Matlab引擎指针,Value为用来保存显示/隐藏情况的变量(采用指针方式传递)。函数返回值为0表示获取成功,为1表示有错误发生。2.6.数据类型mxArray的操作在上节的Matlab引擎函数中,所有与变量有关的数据类型都是mxArray类型。数据结构mxArray以及大量的mx开头的函数,广泛用于Matlab引擎程序和MatlabC数学库中。mxArray是一种很复杂的数据结构,与Matlab中的array相对应,我们只需熟悉Matlab的array类型和几个常用的mxArray函数即可。在VC中,所有和Matlab的数据交互都是通过mxArray来实现的,在使用mxArray类型的程序中,应包含头文件matrix.h,不过在引擎程序中,一般会包含头文件engine.h,该文件里面已经包含了matrix.h,因此无需重复包含。创建和清除mxArray型数据Matlab有很多种变量类型,对应于每种类型,基本上都有一个函数用于创建,但它们都有相同的数据结构,就是mxArray。数组的建立采用mxCreatexxx形式的函数,例如新建一个double类型数组,可用函数mxCreateDoubleMatrix,函数形式如下:mxArray*mxCreateDoubleMatrix(intm,intn,mxComplexityComplexFlag);参数m和n为矩阵的函数和列数。ComplexFlag为常数,用来区分矩阵中元素是实数还是复数,取值分别为mxREAL和mxCOMPLEX。例如,创建一个3行5列的二维实数数组,可用如下语句:mxArray*T=mxCreateDoubleMatrix(3,5,mxREAL);对应的,要删除一个数组mxDestroyArray,该函数声明如下:voidmxDestroyArray(mxArray*array_ptr);参数array_ptr为要删除的数组指针。例如,要删除上面创建的数组T,可用如下语句:mxDestroyArray(T);类似的创建函数还有:mxArray*mxCreateString(constchar*str);创建一个字符串类型并初始化为str字符串。一般的在VC与Matlab交互中,以上两种类型就够了,其它类型数组的创建这里不再介绍。管理mxArray数据类型要获得mxArray数组每一维上元素的个数,可以用mxGetM和mxGetN函数。其中mxGetM用来获得数组第一维的元素个数,对于矩阵来说就是行数。intmxGetM(constmxArray*array_ptr);//返回array_ptr对应数组第一维的元素个数(行数)intmxGetN(constmxArray*array_ptr);//返回array_ptr对应数组其它维的元素个数,对于矩阵来说是列数。对于多维数组来说是从第2维到最后一维的各维元素个数的乘积。要获得某一特定维的元素个数,则要用函数:constint*mxGetDimensions(constmxArray*array_ptr);该函数返回array_ptr各维的元素个数保存在一个int数组中返回。对于常用的矩阵来说,用mxGe