Matlab与vc.docx
- 文档编号:7984308
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:22
- 大小:247.75KB
Matlab与vc.docx
《Matlab与vc.docx》由会员分享,可在线阅读,更多相关《Matlab与vc.docx(22页珍藏版)》请在冰豆网上搜索。
Matlab与vc
将Matlab7.0函数转换成VC++6.0动态链接库[转]
VC与Matlab混合编2010-10-1119:
15:
10阅读152评论0 字号:
大中小 订阅
本文引用自1muliwei《Matlab7.0函数转换成VC++6.0动态链接库[转+修改]》
引用1muliwei的Matlab7.0函数转换成VC++6.0动态链接库[转+修改]
1、mcc4.0编译环境设置
在桌面上右键单击“我的电脑”图标出现以下菜单
单击“属性”菜单项,出现“系统特性”对话框,单击“高级”选项卡,如下图所示
在上图中,单击“环境变量”按钮,出现“环境变量”对话框,添加系统变量matlab值为C:
\MATLAB7即matlab7.0的安装路径,如下图所示
在环境变量path中加入C:
\MATLAB7\bin\win32,如下图所示
按“确定”完成设置后,重启计算机或注销当前用户,即可应用新设置。
2、Matlab7.0编译器设置
(1)mex命令设置
(a)运行Matlab,在Matlab的命令窗口(CommandWindow)键入“mex-setup”命令后,按回车键,安装Matlab编译器;
(b)命令窗口出现如下提示:
Pleasechooseyourcompilerforbuildingexternalinterface(MEX)files:
Wouldyoulikemextolocateinstalledcompilers[y]/n?
此时键入”y”,按回车;
(c)命令窗口出现如下提示:
Pleasechooseyourcompilerforbuildingexternalinterface(MEX)files:
Wouldyoulikemextolocateinstalledcompilers[y]/n?
y
Selectacompiler:
[1]DigitalVisualFortranversion6.0inC:
\ProgramFiles\MicrosoftVisualStudio
[2]LccCversion2.4inC:
\MATLAB6P5\sys\lcc
[3]MicrosoftVisualC/C++version6.0inC:
\ProgramFiles\MicrosoftVisualStudio
[0]None
此时键入”3”,按回车;选择MicrosoftVisualC++6.0的编译器
(d)命令窗口出现如下提示:
Pleaseverifyyourchoices:
Compiler:
MicrosoftVisualC/C++6.0
Location:
C:
\ProgramFiles\MicrosoftVisualStudio
Arethesecorrect?
([y]/n):
此时键入”y”,按回车;确认选择MicrosoftVisualC++6.0的编译器
(2)mbuild命令设置
(a)运行Matlab,在Matlab的命令窗口(CommandWindow)键入“mbuild-setup”命令后,按回车键,安装Matlab编译器;
(b)命令窗口出现如下提示:
PleasechooseyourcompilerforbuildingstandaloneMATLABapplications:
Wouldyoulikembuildtolocateinstalledcompilers[y]/n?
此时键入”y”,按回车;
(c)命令窗口出现如下提示:
[1]LccCversion2.4inC:
\MATLAB6P5\sys\lcc
[2]MicrosoftVisualC/C++version6.0inC:
\ProgramFiles\MicrosoftVisualStudio
[0]None
此时键入”2”,按回车;选择MicrosoftVisualC++6.0的编译器
(d)命令窗口出现如下提示:
Pleaseverifyyourchoices:
Compiler:
MicrosoftVisualC/C++6.0
Location:
C:
\ProgramFiles\MicrosoftVisualStudio
Arethesecorrect?
([y]/n):
此时键入”y”,按回车,确认选择MicrosoftVisualC++6.0的编译器,编译器设置完成。
3、编写Matlab函数
函数文件sum_prod.m,内容如下:
function[sum,prod]=sum_prod(p1,p2)
sum=p1+p2;%p1与p2的和
prod=p1.*p2;%p1与p2的点乘
该函数完成的是矩阵的求和与点乘的功能,下面将介绍把该代码转换成VC++环境可用的代码的方法。
4、将Matlab函数转成DLL函数
在Matlab7.0的CommandWindow下输入命令:
命令1:
mcc-Wlib:
libsum_prod-Tlink:
libsum_prod.m
或
命令2:
mcc-Wcpplib:
libsum_prod-Tlink:
libsum_prod.m
生成动态链接库DLL,编译完成后,Matlab生成一些文件,其中
libsum_prod.ctf
libsum_prod.dll
libsum_prod.h
libsum_prod.lib
这些文件是我们后面需要用到的。
特别注意:
命令1生成的DLL函数接口的数据类型是mxArray,命令2生成的DLL函数接口的数据类型是mwArray。
5、VC++6.0工程的创建与设置
(1)建立一个名为Test的C++控制台工程,在工程中添加一个名为Test.cpp文件
(2)对VC++6.0,进行以下设置
单击菜单Tools,出现如下菜单
单击Options…菜单项,出现Options对话框,选择Directories标签,在includefiles里面加入:
C:
\MATLAB7\EXTERN\INCLUDE
如下图所示
在Libraryfiles里面加入:
C:
\MATLAB7\EXTERN\LIB\WIN32\MICROSOFT\MSVC60
如下图所示
(3)对该工程,进行以下设置
单击菜单Project,出现如下菜单
单击Setting…菜单项,出现ProjectSetting对话框,选择Link标签,在Object/librarymodules:
下面的文本框内容的后面加入mclmcrrt.liblibsum_prod.lib,如下图所示
6、代码编辑及DLL调用
(1)将前面生成的四个文件:
libsum_prod.ctf
libsum_prod.dll
libsum_prod.h
libsum_prod.lib
复制到VC工程所在目录。
(2)在VC++6.0环境中,单击菜单Project,选择AddtoProject菜单项,再单击Files…子菜单项,出现如下图对话框,
将libsum_prod.h加入到当前工程中。
3)当用命令1生成的DLL函数时,在工程文件Test.cpp中添加以下代码:
#include"iostream.h"//输入输出头文件
#include"mclmcr.h"//mxArray类型声明
#include"libsum_prod.h"//DLL头文件
voiddisplay(constmxArray*in,constchar*name);
intmain()
{
//初始化程序
if(!
mclInitializeApplication(NULL,0))
{
fprintf(stderr,"Couldnotinitializetheapplication.\n");
exit
(1);
}
//初始化库
if(!
libsum_prodInitialize())
{
fprintf(stderr,"Couldnotinitializethelibrary.\n");
exit
(1);
}
//声明DLL函数输入输出mxArray对象
mxArray*X,*Y;
mxArray*SUM=NULL,*PROD=NULL;
//给输入mxArray对象分配内存
X=mxCreateDoubleMatrix(2,3,mxREAL);
Y=mxCreateDoubleMatrix(2,3,mxREAL);
doublex[]={1,2,3,4,5,6};
doubley[]={7,8,9,10,11,12};
//给输入mxArray对象赋值
memcpy(mxGetPr(X),x,6*sizeof(double));
//来源:
(-Matlab7.0函数转换成VC++6.0动态链接库[转]_wind_新浪博客
memcpy(mxGetPr(Y),y,6*sizeof(double));
//调用DLL函数,注意输入与输出的接口是不同的
mlfSum_prod(2,&SUM,&PROD,X,Y);
//显示mxArray对象
display(SUM,"SUM");
display(PROD,"PROD");
//释放输入输出mxArray对象所占用的内存
//注意输出对象的内存是在调用DLL函数过程中分配的
mxDestroyArray(X);
mxDestroyArray(Y);
mxDestroyArray(SUM);
mxDestroyArray(PROD);
//关闭库和程序
libsum_prodTerminate();
mclTerminateApplication();
return0;
}
//显示矩阵函数
voiddisplay(constmxArray*in,constchar*name)
{
inti,j,r,c;
double*data;
data=mxGetPr(in);
r=mxGetM(in);
c=mxGetN(in);
printf("%s=\n",name);
for(i=0;i { printf("\t"); for(j=0;j printf("%4.2f\t",data[j*r+i]); printf("\n"); } printf("\n"); } 该C++程序运算结果如下图所示 (4)当用命令2生成的DLL函数时,在工程文件Test.cpp中添加以下代码: #include"iostream.h"//输入输出头文件 #include"mclmcr.h"//mwArray类型声明 #include"libsum_prod.h"//DLL头文件 voiddisplay(constdouble*data,constintr,constintc,constchar*name); intmain() { //初始化程序 if(! mclInitializeApplication(NULL,0)) { fprintf(stderr,"Couldnotinitializetheapplication.\n"); exit (1); } //初始化库 if(! libsum_prodInitialize()) { fprintf(stderr,"Couldnotinitializethelibrary.\n"); exit (1); } //声明DLL函数输入输出mwArray对象 mwArrayX(2,3,mxDOUBLE_CLASS); mwArrayY(2,3,mxDOUBLE_CLASS); mwArraySUM,PROD; doublex[]={1,2,3,4,5,6}; doubley[]={7,8,9,10,11,12}; double*sum,*prod; sum=newdouble[6]; prod=newdouble[6]; //给输入mwArray对象赋值 X.SetData(x,6); Y.SetData(y,6); //调用DLL函数 sum_prod(2,SUM,PROD,X,Y); //取出输出数据 SUM.GetData(sum,6); PROD.GetData(prod,6); //显示mwArray对象 //std: : cout<<"SUM="< : endl< : endl;; //std: : cout<<"PROD="< : endl< : endl;; display(sum,2,3,"SUM"); display(prod,2,3,"PROD"); deletesum; deleteprod; //关闭库和程序 libsum_prodTerminate(); mclTerminateApplication(); return0; } //显示矩阵函数 voiddisplay(constdouble*data,constintr,constintc,constchar*name) { inti,j; printf("%s=\n",name); for(i=0;i { printf("\t"); for(j=0;j printf("%4.2f\t",data[j*r+i]); printf("\n"); } printf("\n"); } 该C++程序运算结果如下图所示 特别说明: 在C\C++环境中二维数组是“行向量”,如果将下面定义的变量x看成二维数组的话 doublex[]={1,2,3,4,5,6}; 那么x应该是 的矩阵,即 x=[1,2,3; 4,5,6]; 但是,如果将数组首地址x初始化mxArray和mwArray类时,数组x在mxArray和mwArray类中是按“列向量”的形式排列的,即 X=[1,3,5; 2,4,6]; 同理,这里 Y=[7,9,11; 8,10,12]; 因此才能得到上图的结果 MFC(VC6.0)与Matlab7.0接口编程方法与实现(DLL)[转] VC与Matlab混合编2010-10-1119: 19: 45阅读43评论0 字号: 大中小 订阅 引用 MATLAB是美国MathWorks公司研制开发的一种科学计算软件,它将高性能的数值计算、符号计算和可视化集成在一起,并提供了大量的内置函数以及功能丰富的工具箱,使用方便,编程效率高。 然而,MATLAB是一种解释性语言,运行效率低,不适合作为通用的编程平台。 VC++是Microsoft公司推出的一个基于Windows平台的可视化的集成开发环境,在运行速度、功能性以及应用程序界面开发方面功能强大,但在数值计算和图形绘制方面,VC++并不具备太多优势。 因此,采用MATLAB进行核心程序的开发,用VC++制作出友好的程序界面,然后将两者结合起来,可以较大地提高编程效率。 1 VC++与MATLAB接口方法概述 1.1 MATLAB引擎方式 MATLAB引擎采用客户机/服务器(Client/Server)的方式,提供了一组MATABAPI函数,通过调用这些函数实现以用程序进程之间的数据传递。 在运用中,让VC++程序作为前端客户机,它向MATLAB引擎传递命令和数据,并从MATLAB引擎接受数据信息,实现动态通讯。 1.2 MATLAB编译器(MCC) MCC是MATLAB中经过优化的编译器。 使用MCC,用户可以将MATLAB数学库、图形库和界面的MATLAB程序转化为独立于MATLAB的EXE应用程序和DLL动态连接库,在VC中编写程序界面并加载调用动态连接库,实现两者之间的连接。 1.3 COM组件 组件对象模型(简称MCR)是以组件为发布单元的对象模型。 它提供一种可以共享二进制代码的工业标准,允许任何符合标准的程序访问,所以COM作为不同语言之间的协作开发是非常方便的。 MATLAB的COM编译器是在MATLAB6.5中才开始提供的一个新工具,从MATLAB7.0起,这个产品改名为MATLABBuilderforCOM。 基于COM的混合编程方法也是Mathworks公司推荐使用的方法。 以上三种方法中,采用MATLAB引擎方式,应用程序整体性能好,MATLAB引擎支持功能全面,但需要MATLAB后台运行,不能脱离MALAB环境。 而MCC方法和COM组件方法均可以脱离MATLAB环境,应用程序运行效率高,利于软件的开发,本文将重点论述MCC和COM组件方法。 2 MATLAB编译器(MCC) 2.1 MATLAB与VC++接口配置 采用MCC方法需要对MATLAB和VC++接口设置,配置步骤如下: 1)MATLAB编译器配置 首先在MATLAB命令提示符下输入mbuild-setup命令,选择编译器,(需要注意的是必须确保计算机上已经安装了某个版本的VC++,本文选择visualC++6.0)完成编译器设置。 2)VC++环境设置 (1)设定头文件和库文件路径。 在VC++环境菜单栏中选择Tools->Options->Directories,在“Showdirectoriesfor“栏中首先选择Includefiles,然后在“directories”中将$MATLAB\EXTERN\INCLUDE添加进去。 再在“Showdirectoriesfor“栏中选择Librarysfiles,在“directories”中将$MATLAB\EXTERN\LIB\WIN32\MICROSOFT\MSVC60添加进去。 (2)设置编译连接选项。 在VC++环境菜单栏中选择Project->setting,然后选择link选项卡,在object/librarymodules栏中添加mclmcrrt.liblibtest.lib;选择General选项卡,在MicrosoftFoundationClasses栏中选择UseMFCinaSharedLibrary。 2.2 实例演示 完成MATLAB和VC++的接口设置以后,就可以实现MATLAB和VC++的接口编程,具体步骤如下: 1)编写M函数文件“mypascal.m” functionm=mypascal(n) m=pascal(n); m=m';%m'是m的转置 示例M函数文件的作用是生成一个n阶的帕斯卡矩阵并返回,Pascal矩阵特点: 第一行和第一列的元素均为1,其他位置的元素是前方的元素和上方的元素之和。 需要注意的是: 由于MATLAB中矩阵存储方式是以矩阵的列为先,也就是数据从第一列开始逐列存储的,而C/C++中矩阵则是以第一行开始逐渐存储的,因此在函数的最后一行对返回矩阵取转置运算,等效于使得计算得到的矩阵数据以行模式存储。 2)编译M文件 在MATLAB命令行输入mcc-Bcsharedlib: libtestmypascal.m-v命令(或mcc-Wlib: libtest-Tlink: libmypascal.m)将m文件编译成C共享动态链接库文件。 命令执行完毕后,在当前目录中生成C头文件(libtest.h)、引入库文件(libtest.lib)、ctf(libtest.ctf)文件、动态链接库文件(libtest.dll)、C源文件(libtest.c)等8个文件。 3)创建工程对话框 运行visualC++创建一个对话框工程,取名为test,接受所有默认的设置。 去掉对话框上的静态文本和按钮,增加一个按钮、一个静态文本框、编辑框以及一个ListControl,鼠标右键单击ListControl,选择Properties,把View改成Report,对话框界面如图1所示。 给ListControl控件添加ClistCtrl类的对象m_List,给编辑框关联一个整型成员变量m_size,给按钮增加一个消息响应函数。 图1 4)添加编译文件到工程 将mcc编译生成的“libtest.h”、“libtest.dll”、“libtest.lib”,“libtest.ctf”四个文件复制到工程目录,将libtest.h加入工程,并在对话框程序文件“testDlg.cpp”中添加头文件“libtest.h”。 5)VC++中调用动态连接库 ①在OnInitDialog()函数中添加初始化libtest.dll进程的码: BOOLCTestDlg: : OnInitDialog() { CDialog: : OnInitDialog(); //TODO: Addextrainitializationhere if(! mclInitializeApplication(NULL,0)) {AfxMessageBox("不能初始化程序! ");exit (1);} if(! libtestInitialize()){AfxMessageBox("不能初始化连接库! ");exit (1);} returnTRUE;//return
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Matlab vc