- 浏览: 16715 次
最新评论
VC++和MATLAB
2009年08月25日
摘 要 本文简介了VC++和MATLAB特点,探讨了MATLAB与VC++接口编程的三种方法,并详细论述了MCC和COM组件接口编程的方法和实现过程。研究表明:采用VC++和MATLAB 接口编程方法降低了编程难度,较好地发挥了两者各自的优势。
[b] 关键词[/b] MATLAB;VC++;MCC;COM;接口编程
[b] MATLAB是美国MathWorks公司研制开发的一种科学计算软件,它将高性能的数值计算、符号计算和可视化集成在一起,并提供了大量的内置函数以及功能丰富的工具箱,使用方便,编程效率高。然而,MATLAB是一种解释性语言,运行效率低,不适合作为通用的编程平台。
VC++是Microsoft公司推出的一个基于Windows平台的可视化的集成开发环境,在运行速度、功能性以及应用程序界面开发方面功能强大,但在数值计算和图形绘制方面,VC++并不具备太多优势。因此,采用MATLAB进行核心程序的开发,用VC++制作出友好的程序界面,然后将两者结合起来,可以较大地提高编程效率。
MATLAB引擎采用客户机/服务器(Client/Server) 的方式,提供了一组MATAB API函数,通过调用这些函数实现以用程序进程之间的数据传递。在运用中,让VC++程序作为前端客户机,它向MATLAB引擎传递命令和数据,并从MATLAB引擎接受数据信息,实现动态通讯。
MCC是MATLAB中经过优化的编译器。使用MCC,用户可以将MATLAB数学库、图形库和界面的MATLAB程序转化为独立于MATLAB的EXE应用程序和DLL动态连接库,在VC中编写程序界面并加载调用动态连接库,实现两者之间的连接。
组件对象模型(简称MCR)是以组件为发布单元的对象模型。它提供一种可以共享二进制代码的工业标准,允许任何符合标准的程序访问,所以COM作为不同语言之间的协作开发是非常方便的。MATLAB的COM编译器是在MATLAB6.5中才开始提供的一个新工具,从MATLAB7.0起,这个产品改名为MATLAB Builder for COM。基于COM的混合编程方法也是Mathworks公司推荐使用的方法。
以上三种方法中,采用MATLAB引擎方式,应用程序整体性能好,MATLAB引擎支持功能全面,但需要MATLAB后台运行,不能脱离MALAB环境。而 MCC方法和COM组件方法均可以脱离MATLAB环境,应用程序运行效率高,利于软件的开发,本文将重点论述MCC和COM组件方法。
采用MCC方法需要对MATLAB和VC++接口设置,配置步骤如下:
1) MATLAB编译器配置
首先在MATLAB命令提示符下输入mbuild-setup 命令,选择编译器,(需要注意的是必须确保计算机上已经安装了某个版本的VC++,本文选择visual C++6.0)完成编译器设置。
2) VC++环境设置
(1)设定头文件和库文件路径。在VC++环境菜单栏中选择Tools->Options->Directories,在“Show directories for”栏中首先选择Include files,然后在“directories”中将\Extern\Lib\Win32\ Microsoft \MSVC++60添加进去。再次在“Show directories for”栏中选择Librarys files,再在“directories”中添加\Extern\Include。
(2)设置编译连接选项。在VC++环境菜单栏中选择Project ->setting,然后选择link选项卡,在object/library modules栏中添加mclmcrrt.lib libtest.lib;选择General选项卡,在Microsoft Foundation Classes栏中选择Use MFC in a Shared Library。
[b] [/b]完成MATLAB和VC++的接口设置以后,就可以实现MATLAB和VC++的接口编程,具体步骤如下:
1) 编写M函数文件“mypascal.m”
function m=mypascal(n)
m=pascal(n);
m=m';
示例M函数文件的作用是生成一个n阶的帕斯卡矩阵并返回,Pascal矩阵特点:第一行和第一列的元素均为1,其他位置的元素是前方的元素和上方的元素之和。需要注意的是:由于MATLAB中矩阵存储方式是以矩阵的列为先,也就是数据从第一列开始逐列存储的,而C/C++中矩阵则是以第一行开始逐渐存储的,因此在函数的最后一行对返回矩阵取转置运算,等效于使得计算得到的矩阵数据以行模式存储。
2) 编译M文件
在MATLAB命令行输入mcc-B csharedlib:libtest mypascal.m-v命令(或mcc-W lib:libtest-T link:lib mypascal.m)将m文件编译成C共享动态链接库文件。命令执行完毕后,在当前目录中生成C头文件 (libtest .h) 、引入库文件 (libtest.lib) 、ctf(libtest.ctf) 文件、动态链接库文件 (libtest.dll) 、C源文件 (libtest.c)等8个文件。
3) 创建工程对话框
[b] 运行visual C++创建一个对话框工程,取名为test,接受所有默认的设置。去掉对话框上的静态文本和按钮,增加一个按钮、一个静态文本框、编辑框以及一个List Control,鼠标右键单击List Control,选择Properties,把View改成Report,对话框界面如图1所示。给List Control控件添加ClistCtrl类的对象m_List,给编辑框关联一个整型成员变量m_size,给按钮增加一个消息响应函数。
4) 添加编译文件到工程
将mcc编译生成的“libtest.h”、“libtest.dll”、“libtest.lib”,“libtest.ctf”四个文件复制到工程目录,将libtest.h加入工程,并在对话框程序文件“testDlg.cpp”中添加头文件“libtest.h”。
5) VC++中调用动态连接库
① 在OnInitDialog()函数中添加初始化libtest.dll进程的码:
BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
if (!mclInitializeApplication(NULL,0))
{AfxMessageBox("不能初始化程序!");exit(1);}
if (!libtestInitialize()) {AfxMessageBox("不能初始化连接库!");exit(1);}
return TRUE; // return TRUE unless you set the focus to a control
}
② 在void CTestDlg::OnCreatebuttom()函数中添加以下代码,实现对mypascal.m的调用,并将计算结果显示在对话框界面中。
void CTestDlg::OnCreatebuttom()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
double data;
data=double(m_size);
mxArray *size; //输入参数
mxArray *out=NULL; //输出参数
//创建mxArray数据对象,双精度标量
size=mxCreateDoubleScalar(data);
//内存复制赋值
memcpy(mxGetPr(size),&data,1*sizeof(double)); mlfMypascal(1,&out,size);//函数调用
//结果数据显示
CString strtext;
int i,j;
//清除已显示的数据
m_List.DeleteAllItems();
intncolumn=m_List.GetHeaderCtrl()->
GetItemCount();
for (i=0;i\tool-box\compiler\deploy\ win32目录之下,应用程序运行前要先点击运行MCRInstaller.exe文件,按照提示步骤安装好MCR,然后将工程文件的可执行程序(.exe)、共享库(.dll)以及其对应的ctf文件复制到目标计算机即可独立运行。
[/b][/b]
发表评论
-
Android的电话功能介绍
2012-01-20 10:25 609Android的电话功能介绍 2 ... -
Muduo 设计与实现之一:Buffer 类的设计
2012-01-20 10:25 907Muduo 设计与实现之一:Buf ... -
Java性能调优方法:基于等待的调优
2012-01-20 10:25 583Java性能调优方法:基于等待的调优 2011年05月31日 ... -
长连接,短连接,同步,异步
2012-01-20 10:25 633长连接,短连接,同步,异 ... -
D-Bus介绍
2012-01-20 10:25 1011D-Bus介绍 2011年01月19日 ... -
网络和黑客windows编程
2012-01-19 15:26 655网络和黑客windows编程 2011年04月18日 第 ... -
Windows XP的小秘密 {7}
2012-01-19 15:26 536Windows XP的小秘密 {7} 201 ... -
转: Boost下载安装编译配置使用指南(含Windows和Linux)
2012-01-19 15:26 582转: Boost下载安装编译配 ... -
从32位应用程序到64位应用程序
2012-01-19 15:26 2633从32位应用程序到64位应 ... -
通过QQ旋风离线下载Android SDK,速度超快
2012-01-19 15:26 1740通过QQ旋风离线下载Android SDK,速度超快 201 ... -
我的日志
2012-01-17 05:13 754我的日志 7小时前 刘一平心想aU诺洗,始榷ム你 ... -
大肚婆
2012-01-17 05:13 761大肚婆 7小时前 我的宝宝还有三个月就要出生了,现在的每 ... -
我的日志
2012-01-17 05:13 593我的日志 7小时前 薛知蝶被他的态度给气炸了Fj ... -
VC编译器配置及编译选项
2012-01-17 05:12 693VC编译器配置及编译选 ... -
window系统下的远程堆栈溢出 --《原理篇》
2012-01-17 05:12 789window系统下的远程堆栈溢出 --《原理篇》 2011年 ... -
Qt 程序在 windows 下的发布
2012-01-16 04:04 741Qt 程序在 windows 下的发 ... -
如何制作库1
2012-01-16 04:04 612如何制作库1 2010年01月20日 ads做库: ... -
如何制作库2
2012-01-16 04:04 582如何制作库2 2010年01月20日 下面通过例子介绍如 ... -
各种文件后缀名与打开方式大全a-d
2012-01-16 04:04 612各种文件后缀名与打开方式大全a-d 2012年01月11日 ...
相关推荐
VC++和Matlab混编,用于图像处理和数据分析,都是编译运行成功后的总结的文档。采用了两种方式,COM组建混编和Matlab引擎混编。第二种是网上的实例,直接拷贝过来,编译成功,一并总结了。大家共勉
前段时间上传了VC++和Matlab混编的技术文档,现在再共享下代码,在本机运行成功的。 在调试代码前,务必先配置好VC++的 include files 和library files 的Matlab相应路径
基于VC++和MATLAB混合编程绘制三维图形
用mcc编译,在C++中调用编译的m问件
VC++和MATLAB引擎混合编程,实现正弦曲线的绘制
vc++和matlab混用的方法,可利用matlab调用函数在vc上面编写相应程序
VC++和MATLAB特点,探讨了MATLAB与VC++接口编程的三种方法,并详细论述了MCC和COM组件接口编程的方法和实现过程。研究表明:采用VC++和MATLAB 接口编程方法降低了编程难度,较好地发挥了两者各自的优势.zip
VC++和Matlab混合编程在图像处理中的应用.pdf
VC++和Matlab混合编程在图像处理中的应用,介绍如动态链接库dll等的使用
基于VC++和Matlab的图像处理比较研究.pdf
VC++和MATLAB特点,探讨了MATLAB与VC++接口编程的三种方法,并详细论述了MCC和COM组件接口编程的方法和实现过程。研究表明:采用VC++和MATLAB 接口编程方法降低了编程难度,较好地发挥了两者各自的优势.zip
VC++和Matlab混合编程在图像处理中的应用
基于VC++和MATLAB的车型分类及车辆计数系统_毕业论文.pdf
基于VC++和MATLAB的铰链四杆机构综合的软件开发_毕业论文.pdf
基于VC++和MATLAB混合编程的风电场风速预测系统的研究_毕业论文.pdf
F:\资料\cpp\数字图像处理与机器视觉-VC++与Matlab实现
本人学习中觉得有用的文章与大家共享! 1.VC++中使用Matlab COM组件;2.将simulink模型生成COM组件;3.Matlab接口。
VC++6.0和Matlab 7.0混合编程,Matlab生成动态链接库方法
利用mcc命令虽然可以直接生成.exe文件,并可以脱离MATLAB在VC++中直接运行,但是因为其自身的诸多缺点,这种方法并不能编译神经网络函数为C++文件,所以,也无法胜任这个任务。 最后,只有COM组件这一个办法了,由于...
VC++与Matlab混合编程的快速实现