Matlab与vc.docx

上传人:b****6 文档编号:7984308 上传时间:2023-01-27 格式:DOCX 页数:22 大小:247.75KB
下载 相关 举报
Matlab与vc.docx_第1页
第1页 / 共22页
Matlab与vc.docx_第2页
第2页 / 共22页
Matlab与vc.docx_第3页
第3页 / 共22页
Matlab与vc.docx_第4页
第4页 / 共22页
Matlab与vc.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

Matlab与vc.docx

《Matlab与vc.docx》由会员分享,可在线阅读,更多相关《Matlab与vc.docx(22页珍藏版)》请在冰豆网上搜索。

Matlab与vc.docx

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

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

当前位置:首页 > 解决方案 > 学习计划

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

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