matlab与vc6.0混合编程成功
- 格式:docx
- 大小:24.29 KB
- 文档页数:3
基于VC与Matlab的混合编程实现图像的三维显示陈翔李进文吴小雅(广州气象卫星地面站广州 510640)摘要本文介绍了VC++与Matlab混合编程的一般实现方法,并实现对二维影像图的三维效果显示。
关键词 VC++ MATLAB M文件三维显示引言通常我们看到的图像是二维状态下的,而在某些特殊领域需要根据三维影像才能做出更进一步的信息抽取,这就需要通过后处理的手段根据原始二维影像虚拟出其三维效果。
MATLAB既是一种直观、高效的计算机语言,同时又是一个科学计算平台。
它为数据分析和数据可视化、算法和应用程序开发提供了最核心的数学和高级图形工具。
根据它提供的500多个数学和工程函数,工程技术人员和科学工作者可以在它的集成环境中交互或编程以完成各自的计算。
MATLA具有强大的矩阵运算、数据处理和图形显示功能,其输出结果可视化,编程效率极高,极少的代码即可实现复杂的运行.然而其边解释边执行,运算效率较低,实现相同功能的代码跟其他编程平台相比运行时间相对较长,且不适合作为通用的编程平台。
因此,为系统整体效率考虑,采取具有很高编程效率的通用编程平台VC++与Matlab混合编程的方式,将更有助于发挥Matlab和VC的各自优势。
1 VC++与Matlab几种常用的集成方法 Matlab与VC++混合编程的具体方式有多种,根据Matlab是否运行可大致分为两类:Matlab在后台运行和可以脱离Matlab环境运行。
Matlab 5.0以后版本均自带C/C++编译器,可将其程序文件(M文件)转换为C-MEX或C/C++程序。
第一种方式是Matlab引擎采用客户机/服务器的计算方式,通过Windows的ActivcX通道和Matlab接口。
在具体的应用中,VC的程序作为前端客户机,通过调用Matlab引擎在后台与Matlab服务器建立连接,实现动态通信。
这种方法实现较为简单,不要求连接整个Matlab,只需要嵌入必要的Matlab引擎库,可大大地节省系统资源,但这种Matlab在后台运行,运行效率低下。
引言小波分析世纪80年代开始发展成熟起来的一个数学分支,其应用领域十分广泛,并逐步成为信号分析的又一有力工具。
MATLAB的小波工具箱为我们提供了小波多尺度分解函数,方便了我们对小波的使用。
但是用它所编写的软件不能脱离MATLAB编程环境在W indows平台下直接运行,代码执行效率低下,运行时占较多的系统资源,不能达到某些用户的需求。
VC++是由美国Microsoft 公司开发的可视化C/C++集成编程环境,是目前功能最强大的软件开发工具之一。
被广泛应用于Win32平台的基础应用程序的开发。
它具有强大的图形界面编程能力且代码执行效率高,可生成脱离VC++环境而独立运行的应用程序。
可是VC++在数值处理分析和算法工具等方面不如MATLAB。
本文结合VC++和MATLAB 的各自优点,以VC++图形界面作为前台框架,MAT LAB作为后台进行数值运算和数据可视化,利用组件对象模型(COM)技术作为媒介,实现了一维小波多尺度分解。
1、一维小波多尺度分解原理及其MATLAB实现1.1 一维小波多尺度分解原理以此类推,直到指定级数的多尺度小波分解为止,分解过程如图1示。
图中s为原始信号,cd1,ca1分别为分解后第1层的细节序列和近似序列,cd2,ca2分别为分解后第2层的细节序列和近似序列,以此类推。
因为这种算法分解的数据结构是塔式结构,所以这种算法也常被称为塔式算法(Pyramid Algorithm)。
1.2 一维小波多尺度分解及重构的MATLAB实现MATLAB 小波工具箱提供了以下几个实现一维小波分解和重构的函数[3]:[C,L] = WAVEDEC(X,N,’wname’),多尺度一维小波分解函数。
其中C为分解结构变量,L为个分解结构以及原始信号长度变量,X为原始信号,N为分解层度,’wna me’为小波类型。
X = WAVEREC(C,L,’wname’),多尺度一维小波重构函数。
其中C,L为多尺度一维小波分解函数WAVEDEC的计算结果。
VC与MATLAB混合编程实现方法及具体实例研究夏欣【期刊名称】《青岛理工大学学报》【年(卷),期】2012(033)003【摘要】Vc++与MATLAB混合编程的方法主要有2种类型,一种是在MATLAB中调用VC,另外一种是在VC中调用MATLAB.主要研究VC中调用MATLAB的方法,该类型的方法可以方便快捷地编制需要绘制图形的用户可执行程序.比较了该类型中几种方法的优缺点,并采用VC中调用Matcomc++矩阵库函数方法,给出了一个在VC++6.0和Matcom4.5环境下实现的两者混合编程的实例.%Two kinds of method could realize VC++ and MATLAB hybrid programming. One is calling VC in MATLAB,the other is just on the contrary, calling MATLAB in VC. This article mostly studies calling MATLAB in the VC method, which can realize user exe- cutable program conveniently and quickly. Advantages and disadvantages are compared be- tween these methods, and a hybrid program example in VC++6.0 and Matcom 4. 5 is giv- en, which adopts calling MATLAB C++ matrix in VC method.【总页数】6页(P83-88)【作者】夏欣【作者单位】青岛理工大学理学院,青岛266033【正文语种】中文【中图分类】TP319;TH7【相关文献】1.基于MATCOM转化法的VC与MATLAB混合编程实现汽车I曲线的模拟绘制[J], 任龙辉;肖婵;李腾飞2.VC与Matlab混合编程实现图像处理 [J], 刘子霆;3.基于MATLAB与VC++混合编程实现配电网重构算法 [J], 李国胜;华泽玺;苗轶如4.基于VC与Matlab混合编程实现图像增强处理 [J], 刘大鹏5.VC++与Matlab混合编程实现光场光强的三维显示 [J], 杨入超因版权原因,仅展示原文概要,查看原文内容请购买。
VisualStudio与Matlab实现混合编程环境:Win10vs2010Matlab2015⾥⾯有很多选做的内容,其中2、3必做1.Matlab环境设置:(选做)我没有做这步,因为打mbuild -setup指令不识别,缺少SDK,但是可以正常调⽤Matlab,这步是其他⽅式调⽤Matlab中的⼀步,使⽤Matlab⽣成DLL⽂件,VS引⽤要建⽴独⽴运⾏的C应⽤程序,系统中需要安装Matlab、Matlab编译器、C/C++编译器以及Matlab C/C++数学库函数和图形库函数。
Matlab编译器使⽤mbuild命令可以直接将C/C++源代码编译为独⽴运⾏程序,在这些源代码中可以使⽤Matlab提供的接⼝来调⽤Matlab数学库函数。
虽然⽣成的可执⾏程序可以脱离Matlab环境运⾏,但是它需要Matlab C/C++数学库⽂件或者图形库⽂件的⽀持才能运⾏。
但如果C/C++源代码完全是按传统C/C++源代码语法规则编写,没有包含Matlab数学库和图形库的调⽤,则不仅可以独⽴与Matlab环境,也不需要那两个库函数的⽀持。
在 Matlab 的Command Window 下输⼊命令。
mbuild – setup操作过程如下图:然后输⼊命令mex – setup以类似的⽅法配置编译器。
Matlab 的配置完成。
2.VS环境设置(必做)(1)设置Include 和Library ⽬录项⽬右键->属性->VC++⽬录->包含⽬录:添加<MATLAB>\R2010b\extern\include\win64 我的是:D:\RUANJIAN\Matlab\extern\include\win64<MATLAB>\R2010b\extern\include\ 我的是:D:\RUANJIAN\Matlab\extern\include项⽬右键->属性->VC++⽬录->库⽬录:添加<MATLAB>\R2010b\extern\lib\win32\microsoft 我的是:D:\RUANJIAN\Matlab\extern\lib\win64\microsoft<MATLAB>\R2010b\extern\lib\win64\microsoft截图::(2)设置⼯程⽬录: ( 我并没有设置)项⽬右键->属性->C/C++->常规->附件包含⽬录:添加<MATLAB>\R2010b\extern\include\win64<MATLAB>\R2010b\extern\include\项⽬右键->属性->链接器->常规:添加<MATLAB>\R2010b\extern\lib\win32\microsoft<MATLAB>\R2010b\extern\lib\win64\microsoft项⽬右键->属性->链接器->输⼊->附件依赖性:添加 (必做)libeng.liblibmat.liblibmex.liblibmx.lib 注:1.lib⽂件包含在<MATLAB>\R2010b\extern\lib\win64\microsoft,可根据需要增减 2.附件依赖性在VS2010前以空格隔开,在VS2010后使⽤;隔开。
关于如何使用VC调用matlab engine编程刚开始学使用VC调用matlab engine编程的时候,遇到很多问题,就去百度找解决方法,但发现根本解决不了我的问题,因为网上大部分实例和步骤都是在matlab6.5和vc++6.0环境下完成的,但是现在我用的是matlab2010a,所以会出现很多环境配置的问题,写本文的目的是总结用我在用VC调用matlab engine编程过程中出现的问题和解决办法。
Matlab Engine 采用Client/Server的方式,通过ActivcX通道和Matlab接口来实现在VC编程环境中直接调用matlab中的指令。
调用使用的函数是:engEvalSting。
下面是自己的实践过程:如果是第一次使用,则要设置一下Visual C++6.0 编程环境中的include 和lib的路径指向。
我的matlab2010安装在D盘目录D:\MATLAB 2010一、设置VC相关属性。
(1)Visual C++6.0 编译环境的设置:通过菜单 Tools/ Options,打开Visual C++6.0设置属性页,进入 Directorie页面,在 Show Directories for 下拉列表中选择Include Files,添加路径:D:\MATLAB 2010\extern\include (这是我电脑中Matlab的安装路径);再选择下拉列表中的 Library Files,添加路径:D:\MATLAB 2010\extern\lib\win32\microsoft(我电脑中Matlab 的安装路径,但是在我查看资料的时候看到很多是D:\MATLAB2010\extern\lib\win32\microsoft\msvc60这个路径,但是我用的是MatlabR2010a,msvc60是matlab6.5老版本才有的,10.0版本没有这个文件,所以我们把路径设到D:\MATLAB 2010\extern\lib\win32\microsoft 就可以了)。
VC6.0调用MATLAB生成的COM组件作者:彭军邮件:poonjun at gmail com 博客:/pengjun一、在MA TLAB中安装mbuild首先声明我的MA TLAB版本是2008A(相当于7.5版本),不过幸好版本如何改变,安装mbuild的命令没有变化,下面是安装mbuild的全过程:>> mbuild -setupPlease choose your compiler for building standalone MA TLAB applications:Would you like mbuild to locate installed compilers [y]/n? ySelect a compiler:[1] Lcc-win32 C 2.4.1 in D:\MATLAB~1\sys\lcc[2] Microsoft Visual C++ 6.0 in C:\Program Files\Microsoft Visual Studio[0] NoneCompiler: 2Please verify your choices:Compiler: Microsoft Visual C++ 6.0Location: C:\Program Files\Microsoft Visual StudioAre these correct [y]/n? yTrying to update options file: C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R2008a\compopts.batFrom template: D:\MATLAB~1\bin\win32\mbuildopts\msvc60compp.batDone . . .可以看到我的mbuild已经安装完成了,要注意的是mbuild和-setup之间是有一个空格的,不能连在一起。
VC++6.0与MATLAB联合编程实现物理实验数据智能处理王艳萍;杨建宋
【期刊名称】《杭州师范大学学报(自然科学版)》
【年(卷),期】2011(010)003
【摘要】采用VC++6.0和MATLAB混合编程的方法,实现了物理实验数据处理系统的开发.实践表明二者联合编译能大大提高软件开发效率,缩短软件维护周期.【总页数】7页(P268-274)
【作者】王艳萍;杨建宋
【作者单位】杭州师范大学理学院,浙江杭州,310036;杭州师范大学理学院,浙江杭州,310036
【正文语种】中文
【中图分类】TP312
【相关文献】
1.基于Matlab和VC++6.0联合编程的带式输送机动态分析 [J], 牛巍巍;韩刚
2.基于Matlab和VB混合编程实现大学化学实验数据处理系统 [J], 张云鹏;胡飞;马晓燕;马春燕;陆伟
3.基于编程实现物理化学实验数据处理系统 [J], 周建敏;吴政辉;林德裕
4.基于编程实现物理化学实验数据处理系统 [J], 周建敏;吴政辉;林德裕
5.Matlab程序编辑在大学物理实验数据处理中的应用 [J], 范丽琴;张春红
因版权原因,仅展示原文概要,查看原文内容请购买。
matlab7.0.1与vc6.0混合编程成功
matlab 2008-01-05 18:11 阅读600 评论0
字号: 大大 中中 小小
混合编程其实不难,关键是没有一个规范的,真正可以解决设置过程中出现的小问题的方法。我在设置的过程中,遇到了不少问题,花了多半天的时间,终于解决
了,顺利地在vc中调用matlab 生成的dll文件中的函数,并返回一个值,探出对话框,显示正确。这种混合编程的方式不能脱离matlab环境,如果需要发布独立的应用程
序,需要安装MCR。下面分步骤地讲一下混合编程的设置及其原因:
1 matlab方面的操作
首先先写一个算阶乘的函数,存成test1.m文件,该文件的内容是:
function y = test1(n)
y = 1 ;
for i = 1 : n
y = y * i ;
end
现在有了文件,下一步我们要设置好系统,设置好matlab,然后再把该文件编译成dll文件。
1、在环境变量(我的电脑右键-高级)path中加入
2、添加环境变量matlab值设为< MATLAB71_root >即matlab7.1的安装路径;
3、配置mbuild使用的C/C++编译器;
在Matlab命令窗口中输入:
mbuild -setup
按照提示选择VC6.0的编译器,完成后在Matlab命令窗口中输入:
mex -setup
同样选择VC6.0的编译器,就完成编译器的安装和配置。
接下来我们要把.m文件存储的程序编译成dll文件,在matlab命令窗口中输入:
mcc -W lib:test1 -T link:lib test1.m
这个需要等一小段时间,最终,在当前目录下生成了
到此,在操作系统和matlab这一方面的工作就做完了
2 vc++6.0中的操作
在vc中建立一个MFC AppWizard[exe]基本对话框工程,名字叫做test1app.
1 )在 VC 中创建一个 MFC 工程(本人创建的为基于对话框的),环境设置根据如下帖子
: 怎样设置 Visual Studio 与 Matlb Complier 4.0 一起工作 中的指导进行。在
本例子中,只需要在 VC 中进行如下步骤:
A. Tools->Options->Directories->Show directories for : Include files->
B. Tools->Options->Directories->Show directories for : Library files->
C. Project->Setting->C/C++->Category : Code Generation->Use run-time library
: Debug Multithread DLL ;
D. Project->Setting->Link->Category : Input->Object/library modules : test1.lib mclmcr.lib libmx.lib libmat.lib libeng.lib
2 )拷贝 MATLAB 当前目录下刚才用 mcc 生成的 test1.h , test1.dll , test1.lib ,以及 test1.ctf 文件到 VC 当前工程目录下,并
用 Project->Add to Project->Files… 将 test1.h 加入到当前工程中。
3 )在当前工程的对话框的头文件和cpp中加入 #include "test1.h" 与 #include "mclmcr.h" ;
工程设置到此就结束了,下面开始写代码:
首先需要在对话框的初始化程序BOOL CTest1appDlg::OnInitDialog()内写
if( !mclInitializeApplication(NULL,0) ) //matlab环境初始化
{
AfxMessageBox( "Could not initialize the application.");
exit(1);
}
/* Call the library intialization routine and make sure that the
* library was initialized properly. */
if (!test1Initialize()) //test1Initialize是test1.h中定义的test1函数的初始化函数
{
AfxMessageBox("Could not initialize the library.");
exit(1);
}
在对话框的确定按钮的消息响应函数内,调用dll中的阶乘函数,
void CTest1appDlg::OnOK()
{
// TODO: Add extra validation here
//此处为dll中的函数准备好参数,然后调用
double n = 4 ;
mxArray * t; //经过matlab编译完的dll 中的函数只能识别mxArray 类型的参数,所以我们在vc中定义的数值
//都需要转换成该种格式
t = mxCreateDoubleMatrix( 1 , 1 ,mxREAL);//该函数中的参数1,1定义了 t 这个矩阵的大小
memcpy(mxGetPr(t), & n, sizeof ( double ));//给 t 赋值为4
mxArray * y; //准备一个接收返回值的变量
y = mxCreateDoubleMatrix( 1 , 1 ,mxREAL);
mlfTest1(1,&y,t); //运行该函数,进行阶乘计算,4的
double r1 = 0; //vc中的接收返回值的函数
memcpy(&r1,mxGetPr(y),sizeof(double));
mxDestroyArray(t); //销毁废弃内存
test1Terminate();//中止调用
CString showrslt;
showrslt.Format("%f",r1);
AfxMessageBox(showrslt);//显示阶乘计算的结果
CDialog::OnOK();
}
mxDestroyArray(t); //销毁废弃内存
test1Terminate();//中止调用
CString showrslt;
showrslt.Format("%f",r1);
AfxMessageBox(showrslt);//显示阶乘计算的结果
CDialog::OnOK();
}