matlab课程学习总结.docx
- 文档编号:23425654
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:15
- 大小:194.02KB
matlab课程学习总结.docx
《matlab课程学习总结.docx》由会员分享,可在线阅读,更多相关《matlab课程学习总结.docx(15页珍藏版)》请在冰豆网上搜索。
matlab课程学习总结
VC++&Matlab混合编程的快速实现
摘要:
许多工程软件需要用到复杂的数学算法。
VC++能够形成各种用户界面,并可以直接与系统及底层硬件交换数据。
因此研究VC++和Matlab的混合编程具有很大的实际意义。
该文讨论了如何使用Matlab的Complier将*.m函数编译为动态链接库DLL,提供VC++调用的方法,提供了一种VC++与Matlab混合编程的快速实现。
关键词:
MatlabVC++MCCComplier动态链接库DLL
简介:
Matlab作为当今世界上应用最为广泛的数学软件,具有非常强大的数值计算、数据分析处理、系统分析、图形显示甚至符号运算的功能。
已经在如生物工程,图像处理,语音处理,雷达探空,声纳探水,地震探地,以及控制论,系统论等各个领域得到广泛的应用。
它是一个完整的数学平台,在这个平台上,用户只需寥寥数语就可以完成十分复杂的功能,大大提高了工程分析计算、图像处理的效率。
但是Matlab强大的功能只能在它所提供的平台上才能使用,即用户必须在安装Matlab系统的机器上才能执行*.m文件。
这样当用户需要将在Matlab下已开发完毕的复杂算法应用到高级语言开发环境下时就带了问题,是将现成的东西集成高级语言开发的程序中呢?
还是用高级语言再重新实现一遍?
显然大家所期望的是减少工作量,最好能将Matlab下开发好的程序或函数直接应用到高级语言开发的程序中,这就是Matlab与高级语言的混合编程问题。
VC++是当前Windows下的主要编程语言之一,它能方便地形成应用软件中所需要的各种用户界面和工具并直接与系统及底层硬件交换数据。
用VC++开发的系统具有容易维护升级、界面友好、代码效率高、执行速度快等一系列优点,因此已成为目前应用软件开发中广泛采用的主要工具之一。
因此,如何将Matlab与VC++进行有效的混合编程广受工程科研人员的关注。
解决这个问题,不仅能更好地发挥Matlab强大的功能,还能快速地进行软件开发,尤其是当软件开发中需要实现复杂的数学算法、图形处理时尤为迫切。
研究VC++与Matlab的混合编程具有很大的实际意义。
实例分析
1、编写Matlab函数
函数文件sum_prod.m,内容如下:
function[sum,prod]=sum_prod(p1,p2)
sum=p1+p2;%p1与p2的和
prod=p1.*p2;%p1与p2的点乘
该函数完成的是矩阵的求和与点乘的功能,下面将介绍把该代码转换成C++环境可用的代码的方法。
2、Matlab6.5编译器设置
(1)在同一台电脑上安装Matlab6.5和VisualC++6.0;
(2)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的编译器
(3)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的编译器
(4)在Matlab的命令窗口(CommandWindow)键入“cd(prefdir);mccsavepathprefdir;”启动MATLABadd-in工具条
3、建立C++控制台工程
(1)新建一个C++控制台工程Test
其它都采用默认设置。
然后在该工程中添加Test.cpp文件
4、启用MatlabAdd-in工具条
(1)在上面的VC工程中,在菜单栏的空白处右键单击鼠标,出现如下菜单
点击Coustomize…菜单项,出现如下Coustomize对话框,
选择Add-inandMacroFiles标签,选中MATLABAdd-in选项,点Close按钮关闭对话框,这里会在菜单附近出现如下工具条,它就是MatlabAdd-in工具条。
5、VC++6.0环境及工程设置
在上面的VC工程中,进行以下设置
(1)VC++6.0环境设置
单击菜单Tools,出现如下菜单
单击Options…菜单项,出现Options对话框,选择Directories标签,在includefiles里面加入:
C:
\MATLAB6P5\EXTERN\INCLUDE
C:
\MATLAB6P5\EXTERN\INCLUDE\CPP
如下图所示
在Libraryfiles里面加入:
C:
\MATLAB6P5\EXTERN\LIB
C:
\MATLAB6P5\EXTERN\LIB\WIN32
C:
\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60
如下图所示
(2)VC++6.0工程设置
单击菜单Project,出现如下菜单
单击Setting…菜单项,出现ProjectSetting对话框,选择Link标签,在Object/librarymodules:
下面的文本框内容的后面加入libmmfile.liblibmatlb.liblibmx.liblibmat.liblibmatpm.libsgl.liblibmwsglm.liblibmwservices.lib,如下图所示
选择C/C++标签,在Prerocessordefinitions:
下面的文本框内容的后面加入,MSVC,IBMPC,MSWIND,如下图所示
设置完成。
6、Matlab到C++的代码转换
在上面的VC工程中
(1)将前面sum_prod.m文件复制到该Test工程所在的目录下
(2)单击MatlabAdd-in工具条最左边第一个按钮,出现如下对话框
选中WindowsConsoleEXE四个选择选中后二项,如上图所示,单击OK,出现如下对话框
选中Matlab函数文件sum_prod.m,单击“打开”按钮,这样在该工程所在的目录就生成了sum_prod.cpp和sum_prod.hpp文件。
(3)打开sum_prod.cpp文件,注意到里面有这样一个函数
mwArraysum_prod(mwArray*prod,mwArrayp1,mwArrayp2)
{…}
可以看到在C++环境中,sum_prod也是一个函数,它的输入与输出数据类型是mwArray,它是VC6.0专门为Matlab中的矩阵对象定义的一个类。
函数sum_prod有三个输入参数和一个输出参数。
由于C++函数不能有一个以上的返回值,因此这里将Matlab函数sum_prod的第二个返回值,以地址型变量的形式作为C++函数sum_prod的第一个输入参数。
7、C++函数的使用
在上面VC工程Test.cpp文件中键入以下代码:
//********************************************************************
#include"matlab.hpp"//包含类mwArray定义
#include"sum_prod.hpp"//包含C++函数sum_prod
voidmain()
{
inti,j;
//定义C++二维数组
doublex[]={1,2,3,4,5,6};
doubley[]={7,8,9,10,11,12};
double*sum,*prod;
//初始化与C++数组相对应的mwArray变量
mwArrayX(2,3,x);
mwArrayY(2,3,y);
mwArraySUM,PROD;
//调用C++函数
SUM=sum_prod(&PROD,X,Y);
//给输出数据分配内存
sum=(double*)calloc(6,sizeof(double));
prod=(double*)calloc(6,sizeof(double));
//取出输出数据
sum=mxGetPr(SUM.GetData());
prod=mxGetPr(PROD.GetData());
//输出显示
cout<<"SUM="< for(i=0;i<2;i++) { for(j=0;j<3;j++) cout< cout< } cout<<"PROD="< for(i=0;i<2;i++) { for(j=0;j<3;j++) cout< cout< } //释放内存 free(sum); free(prod); } //******************************************************************** 编译链接程序,“忽略”编译过程中有关库文件msvcrt.lib的警告。 该C++程序运算结果如下图所示 特别说明一: 在C\C++环境中二维数组是“行向量”,如果将下面定义的变量x看成二维数组的话 doublex[]={1,2,3,4,5,6}; 那么x应该是 的矩阵,即 x=[1,2,3; 4,5,6]; 但是,如果将数组首地址x初始化mwArray类时,数组x在mwArray中是按“列向量”的形式排列的,即 X=[1,3,5; 2,4,6]; 同理,这里 Y=[7,9,11; 8,10,12]; 因此才能得到上图的结果 特别说明二: 通过MatlabAdd-in实现Matlab与VC++的混合编程也有不足,并不是所有的Matlab的函数都能转成C++函数,这一点在使用过程中要特别注意! 8、程序的发布 (1)使用VC附带的Depends工具找到应用程序所需要的dll文件,手动复制这些文件添加到应用程序所在的目录即可。 (2)编译好的程序只要附带mglarchive.exe(在C: \MATLAB6p5\extern\lib\win32目录)中的数学和图形库即可在没装matlab的机器上运行 总结 从以上的讨论中可以清楚的看到,使用Matlab生成动态链接库(*.DLL)实现VC++和Matlab的混编的确以它的方便,易用成为VC++和Matlab混编的一种快速实现方法。 另外,Matlab的Compiler也具有一定的局限性: 原则上在混编的过程中只能使用Matlab数学库中的函数和图形库中的部分函数,mathworks提供的文档上面讲到,Matlab的图形库只有在用mcc生成可执行程序(*.exe)时才能引用。 在VC++的程序中直接使用Matlab图形库中的函数(例如mlfPlot)是不背支持的。 另外,在使用mcc生成DLL的时候,Matlab图形库中的函数也不是全部都测试过。 还有对于一些工具箱中的函数,如果用到一些数学库之外的函数,就有可能出现错误。 即使编译通过,在运行的时候也有可能出错。 但是,随着Matlab的不断升级,mathworks推出了MatlabCOMBuilder创建COM组件,对这种不兼容性有了一定的改进,使得Matlab和高级语言的混合编程变得越来越实用,越来越简单。 参考文献: [1]MatlabCompiler [2]MatlabCOMBuilder
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- matlab 课程 学习 总结
![提示](https://static.bdocx.com/images/bang_tan.gif)