VS和MatlabR混合编程.docx

上传人:b****5 文档编号:30720335 上传时间:2023-08-19 格式:DOCX 页数:12 大小:740.85KB
下载 相关 举报
VS和MatlabR混合编程.docx_第1页
第1页 / 共12页
VS和MatlabR混合编程.docx_第2页
第2页 / 共12页
VS和MatlabR混合编程.docx_第3页
第3页 / 共12页
VS和MatlabR混合编程.docx_第4页
第4页 / 共12页
VS和MatlabR混合编程.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

VS和MatlabR混合编程.docx

《VS和MatlabR混合编程.docx》由会员分享,可在线阅读,更多相关《VS和MatlabR混合编程.docx(12页珍藏版)》请在冰豆网上搜索。

VS和MatlabR混合编程.docx

VS和MatlabR混合编程

基于VS2008和Matlab R2010a版本的混合编程的实现

调试通了基于VS2008和MatlabR2010a的混合编程,win7-32位机。

比起一般的指南,本文站在多个开发人员协同开发的需求之上,因此配置要稍微复杂一些,当然也会全面一些

1.Matlab R2010a编译器设置

为了能够让VS调用Matlab程序,我们可以采用将Matlab程序包装成动态链接文件DLL的形式,然后让VS调用动态链接文件,因此在Matlab中,我们需要设置一下Matlab的编译库,在Matlab主窗口中键入如下代码:

mbuild–setup

然后出现

PleasechooseyourcompilerforbuildingstandaloneMATLABapplications:

Wouldyoulikembuildtolocateinstalledcompilers[y]/n?

键入y后回车,出现

Selectacompiler:

[1]Lcc-win32C2.4.1inD:

PROGRA~1MATLABR2010asyslcc

[2]MicrosoftVisualC++2008SP1inD:

ProgramFilesMicrosoftVisualStudio9.0

[0]None

Compiler:

由于我们是需要用VS来调用Matlab函数,因此我们选择2,回车,出现

Pleaseverifyyourchoices:

Compiler:

MicrosoftVisualC++2008SP1

Location:

D:

ProgramFilesMicrosoftVisualStudio9.0

Arethesecorrect[y]/n?

确定,键入y后回车,出现

****************************************************************************

Warning:

Applications/componentsgeneratedusingMicrosoftVisualStudio

2008requirethattheMicrosoftVisualStudio2008run-time

librariesbeavailableonthecomputerusedfordeployment.

Toredistributeyourapplications/components,besurethatthe

deploymentmachinehastheserun-timelibraries.

****************************************************************************

Tryingtoupdateoptionsfile:

C:

UsersAppDataRoamingMathWorksMATLABR2010bcompopts.bat

Fromtemplate:

D:

PROGRA~1MATLABR2010bbinwin32mbuildoptsmsVS90compp.bat

Done...

如果出现以上说明,则证明Matlab编译器设置成功了。

接下来是生成M文件的DLL文件。

2.写my_add.m文件

为了更加直观的说明如何实现混合编程,笔者写了一个简单的程序作为测试。

先在Matlab里面写一个M文件,代码如下:

function[c]=my_add(a,b)

c=a+b;

end

将M文件保存为my_add.m,保存在C:

\Users\Administrator\Desktop\混编\hello_mex文件夹中。

然后在Matlab主窗口中将当前文件夹改为C:

\Users\Administrator\Desktop\混编\hello_mex:

cdC:

\Users\Administrator\Desktop\混编\hello_mex;

3.生成my_add.dll,my_add.lib,my_add.h

在Matlab主窗口中键入如下代码

mcc-Wcpplib:

my_add-Tlink:

libmy_add

其中cpplib:

后面的是需要生成dll文件的文件名,是自己取的,link:

lib后面的my_add.m是转换为DLL的M文件的文件名。

-W/-T/-C是参数,具体含义可以通过mcc–help命令查看,注意参数的大小写。

Matlab编译后会在hello_mex文件夹下生成9个文件,分别是:

其中my_add.dll,my_add.lib,my_add.h是我们需要的文件,至此,Matlab方面就已经设置妥当了。

4.VS2008编译器配置

4.1新建工程

打开VS2008,C:

\Users\Administrator\Desktop\混编\hello_mex下新建一个工程:

目录如下

4.2提取matlabsdk

1.

新建目录C:

\Users\Administrator\Desktop\混编\hello_mex\test1_vs\SDK\matlab_r2010a

2.把matlab的安装目录D:

\ProgramFiles\MATLAB\R2010a\extern下的include和lib文件夹拷贝到C:

\Users\Administrator\Desktop\混编\hello_mex\test1_vs\SDK\matlab_r2010a下

3.新建目录C:

\Users\Administrator\Desktop\混编\hello_mex\test1_vs\SDK\matlab_r2010\bin;把D:

\ProgramFiles\MATLAB\R2010a\bin\win32的所有dll拷贝到C:

\Users\Administrator\Desktop\混编\hello_mex\test1_vs\SDK\matlab_r2010\bin下

4.最终的文件目录如下

其实这些就是vs2008编译需要的dll,h,lib,我们单独提取出来是方便使用(不独立出来也可以,本文只按独立出来来写的),当然还可以精简,但是描述复杂,要精简的sdk可以联系笔者

4.3配置VS2008编译器

4.3.1配置头文件包含

..\SDK\matlab_r2010a\include;..\SDK\matlab_r2010a\include\win32

4.3.2配置附加库目录

..\SDK\matlab_r2010a\lib

5.写test1_vs.cpp

5.1写入matlab自带lib

在源文件test1_vs.cpp开始写入

/*matlab_r2010a库配置*/

#include"..\\SDK\\matlab_r2010a\\include\\mat.h"

#pragmacomment(lib,"..\\SDK\\matlab_r2010a\\lib\\libmat.lib")

#pragmacomment(lib,"..\\SDK\\matlab_r2010a\\lib\\libmx.lib")

#pragmacomment(lib,"..\\SDK\\matlab_r2010a\\lib\\libmex.lib")

#pragmacomment(lib,"..\\SDK\\matlab_r2010a\\lib\\libeng.lib")

#pragmacomment(lib,"..\\SDK\\matlab_r2010a\\lib\\mclmcrrt.lib")

5.2写入my_add.lib

my_add.h和my_add.lib放在C:

\Users\Administrator\Desktop\混编\hello_mex\test1_vs\test1_vs下

把my_add.h添加到项目中

#include"my_add.h"

#pragmacomment(lib,"my_add.lib")

5.3写入cpp和m交互输入输出

intmain(intargc,char*argv[])

{

my_addInitialize();//初始化DLL动态连接文件

double_x1[5]={1,2,3,4,5};//输入数组

double_x2[5]={1,2,3,4,5};//输入数组

double_y[5];//输出数组

mxArray*x1=mxCreateDoubleMatrix(1,5,mxREAL);//创建1*5矩阵

memcpy(mxGetPr(x1),(void*)_x1,sizeof(_x1));//拷贝输入数据

mxArray*x2=mxCreateDoubleMatrix(1,5,mxREAL);//创建1*5矩阵

memcpy(mxGetPr(x2),(void*)_x2,sizeof(_x2));//拷贝输入数据

mxArray*input[2]={x1,x2};//将矩阵x的指针作为输入参数传递进去

mxArray*output[1];//定义输出参数指针

mlxMy_add(1,output,2,input);//调用m函数

mxArray*y;//定义输出结果指针

y=output[0];//将输出参数传递给输出结果

memcpy(_y,mxGetPr(y),sizeof(_y));//拷贝输出数据

my_addTerminate();//结束DLL库//显示数组中的数据

printf("%f%f%f%f%f",_y[0],_y[1],_y[2],_y[3],_y[4]);

return0;

}

其中my_addInitialize(),mlxMy_add(),my_addTerminate()等函数可以在my_add.h中找到函数原型,mlxMy_add函数原型为:

mlxMy_add(intnlhs,mxArray*plhs[],intnrhs,mxArray*prhs[])

nlhs代表输出参数个数,plhs[]里面存放的是输出参数的指针,nrhs代表输入参数个数,prhs[]中存放的是输入参数的指针。

上例中由于输入输出参数只有2个,因此在plhs[0]中存放的就是M文件中a的指针,在plhs[1]中存放的就是M文件中b的指针,prhs[0]中存放的就是M文件中c的指针。

5.4编译生成程序

把my_add.dll拷贝到Release\Debug下,编译运行可得到

6.发布程序:

MCRInstaller.exe脱离matlab2010a

将项目文件夹下生成的可执行文件复制出来,将my_add.dll文件,.exe文件放在同一目录下便可脱离VS++独立运行

如果需要在其他未装Matlab的机器上运行,则还需要将“D:

ProgramFiles\MATLABR2010b\toolbox\compiler\deploy\win32”中的MCRInstaller.exe复制出来,在未安装Matlab的电脑上运行此程序,才可使得刚刚生成的可执行文件顺利运行。

7.常见问题

7.1没有添加环境变量

问题:

解决方法:

添加环境变量C:

\ProgramFiles\MATLAB\MATLABCompilerRuntime\v713\runtime\win32

8.总结

直接利用m文件,简化了开发难度,但是为用户增加了不少麻烦,首先安装162M的matalb运行时环境,当然运行时间也是一个需要考虑的因素;对于开发者,需要掌握混编技术,搭建开发环境,同时熟悉matlab和C++,完成输入输出数据的转换

9.参考

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 小学教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1