浅谈Matlab与Vc混编技术

合集下载

MATLAB与VC++混合编程的研究及应用

MATLAB与VC++混合编程的研究及应用

MATLAB与VC++混合编程的研究及应用摘要:介绍了三种实用易行的matlab与vc++混合编程方式,即利用matlab的mcc编译器,使用matcom软件转化m文件,使用matlab的com builder工具制作com组件。

针对具体程序分别应用三种方法来实现,对每种方法介绍了详细步骤。

对三种方法进行了分析比较,总结了各自的优缺点,实现了matlab出色的图形处理功能和数值计算能力与vc++强大编程能力的结合。

关键词:matlab;vc++;混合编程中图分类号:tp311 文献标识码:a 文章编号:1009-3044(2013)10-2353-03matlab是适合多学科,多种工作平台的功能强大的大型数值计算和系统分析软件。

matlab将数值分析、矩阵计算、信号处理和图形显示相结合,包含了大量高度集成的函数,为科学研究、工程设计及众多学科领域提供了一种简洁、高效的编程工具,在数值分析、科学计算、算法开发、建模和仿真等方面具有独特优势[1]。

但是matlab使用的是解释性语言,限制了自身的执行速度;程序的执行限制与matlab自身的运行环境,不利于应用程序的开发;gui功能较差。

vc++是强大的windows应用程序开发工具,它提供了高度集成的工具集和可视化集成的编程环境,包括了microsoft的代码优化技术,极大提高了应用程序的设计效率,还提供了复杂的资源编辑器,拥有强大的gui功能[2]。

因此,实现matlab与vc++等可视化程序设计语言的混合编程,提高程序的执行速度,美化应用程序界面,脱离matlab环境,发布独立的应用程序,同时利用matlab在数值分析、矩阵计算、信号处理和图形显示等方面的强大功能,具有重要的意义。

1 matlab与vc++混合编程方法matlab与vc++有多种接口方法,但是一些常见方法难以实现,执行效率低,如matlab engine、直接调用matlab的c/c++数学函数库等。

对VC++6.0与Matlab的混合编程技术的探讨

对VC++6.0与Matlab的混合编程技术的探讨
Malb的所有 函数 ; ) V + 中调用 包含 Ma a t a (在 C + 3 tb l 的数学 函数 库进行 编程 . 用 数学 函数 库中 的规定 f 吏 函数 。 其中 , 采用方 式( 和() 要 Malb 1 2 ) 需 t 环境 的 支 a
表 1 Ma a 擎库 函数 t b引 l
Malb V + 的混 合编 程是 通过 应用 程序 t 与 C+ a 接 口( P) A I实现 的 。Malb中提供 的 v + 应 用程 t a C+ 序接 口方 式有 3种 :)通过 调用 语 言编 译器 和链 ( 1 接 器 。将 Mal tb程 序 编 译 成 V + 文 件 ; ) a C+ ( 在 2 V + C +中使 用 Malb引 擎 服 务 ,通 过 引 擎 调 用 t a
很好 的程 序 设 计 方 法 。
关 键 词 : 用 程序 接 口 ; t b引 擎 ; C + 客 户机 / 务 器 应 Ma a l V +; 服
Mal t b是 Mah ok 公 司推 出 的 一 套高 效 a tw rs 1 用户 数 据 请 求 (C 数 据 类 型 )、x ry 种 , Poet a e中输 入项 目名 , 项 目引 导完 、 V 2m Ar a 在 r cnm j 按 率的数 值计 算 和可视 化软 件 ,具有 极其 强大 的数 矩 阵 ( 数 据 结 构 )、 t b 命 令 成 项 目工程 创建 。 3 Mal a 在这 里我们 创建 一个 MF C单文 值分 析 、矩 阵运 算 、信 号 处 理 和图 形显 示 功 能 ; 4 Ma a 、 t b变量 ( l 数据 结 构) 、 t b命 令 6 Malb 档工程 , 名为 D m eg 5 Mal a 、 t a 命 e on 。 Maa t b以其强 大的数 据处 理能 力 和丰 富的工 具箱 变量 ( l 数据 结 构 ) 、 x r y矩 阵 ( 据 结 果 ) 、 7m Ar a 数 8 31 .2打开 界面 , 菜单 栏 中选 择 T o -o - _ 在 ol >p s

VC与Matlab混合编程

VC与Matlab混合编程

VC与Matlab混合编程本⽂主要介绍VC与Matlab混合编程的两种⽅法,并详细介绍了VC向Matlab传递复杂数据:结构体的⽅法,有详细代码说明。

Matlab 主要⾯对科学计算、可视化以及交互式程序设计的⾼科技计算环境,但由于Matlab开发平台上开发的程序不能脱离Matlab运⾏环境,因⽽在处理⼀些实际应⽤问题时显得灵活性不⾜,⽽VC++则在⼀定程度上能够弥补这⼀漏洞,因此,将⼆者结合共⽤,各献其长,可以为科研⼯作和⼯程开发提供更为强⼤的技术⽀持。

Matlab作为控制系统设计的⼀种通⽤⼯具,它可以很⽅便的和VC进⾏连接。

⼀般⽽⾔,Matlab与VC混合编程的实现⽅法有很多种,这⾥主要介绍以下两种:1. VC调⽤Matlab Engine的⽅式:Matlab Engine是⼀组Matlab提供的接⼝函数,⽀持C/C++语⾔,Matlab Engine采⽤C/S(客户机/服务器)模式,Matlab作为后台服务器,⽽C/C++程序作为前台客户机,向Matlab Engine传递执⾏命令和数据信息,从Matlab Engine接收执⾏结果。

⽤户可以在前台应⽤程序中调⽤这些接⼝函数,实现对Matlab Engine的控制。

采⽤这种⽅法⼏乎能利⽤Matlab全部功能,但是需要在机器上安装Matlab软件,缺点是执⾏效率较低。

下⾯简单介绍下这种⽅式的实现步骤:1.1 API接⼝介绍先来介绍⼀组Matlab提供的引擎API接⼝:(仅作简单功能介绍,详细参数说明请参考Matlab帮助)Engine* engOpen(const char* startcmd)启动Matlab引擎int engClose(Engine* ep) 关闭Matlab引擎int engEvalString(Engine* ep, const char* string)执⾏Matlab表达式mxArray* engGetArray(Engine* ep, const char* name)获取⼀个变量数组的值int engPutArray(engine* ep, const mxArray* mp)设置⼀个变量数组的值int engPutVariable(Engine *ep, const char *name, const mxArray *pm)同上mxArray *engGetVariable(Engine *ep, const char *name)获取⼀个变量int engOutputBuffer(Engine* eP,char* p,int n)获取输出字符串1.2 VC环境配置要想在VC集成环境下调⽤Matlab引擎实现VC和Matlab的混合编程,⼀般需要经过以下⼏个必要的步骤:(以下以Matlab2008a和VS2005版本为例)(1)添加include路径:将“\extern\include”(在Matlab的安装路径下)路劲添加到VC编译器的include下(2)添加lib路径:将“\extern \lib\win32\microsoft” (在Matlab的安装路径下) 路径添加到VC编译器的lib下(3)加载lib:需要加载⾄少libmx.lib、libmat.lib、libeng.lib三个库(4)include头⽂件:在要使⽤ engine 函数的地⽅包含engine.h头⽂件1.3 引擎调⽤接下来就可以在VC中调⽤Matlab引擎了,简单的⽰例代码如下:#include "engine.h"#pragma comment(lib, "libeng.lib")#pragma comment(lib, "libmx.lib")#pragma comment(lib, "libmat.lib")void TestDeno(){Engine* pEng = NULL;if (!(pEng = engOpen(NULL))){printf("Open matlab enging fail!");return;}//call Engine plot A*sin(t)+B A=2 B=1mxArray *A = NULL;double init = 2;A = mxCreateDoubleMatrix(1, 1, mxREAL);memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));engPutVariable(pEng, "A", A);init = 1;memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));engPutVariable(pEng, "B", A);mxDestroyArray(A);Sleep(3*60*1000);engEvalString(pEng, "t=0:0.2:7;plot(t,A*sin(t)+B);");if(NULL != pEng){engClose(pEng);}}⽰例代码通过VC调⽤Matlab引擎,绘制正弦曲线,相对简单,就不再详细解释,效图如下:2. VC调⽤Matlab DLL的⽅式DLL是⼀个可执⾏的⼆进制⽂件。

Matlab与C混合编程的方法研究与实现毕业论文

Matlab与C混合编程的方法研究与实现毕业论文

Matlab与C混合编程的方法研究与实现摘要:文章探讨了MATLAB与VC++的优缺点,介绍了VC++与Matlab混合编程的几种方法。

通过二者的结合,既有效地利用了MATLAB强大的数值计算能力和众多的函数,大大减少程序设计的工作量,又继承了VC++良好的程序界面,证明是一种很好的程序设计方法。

具体说明了如何应用Matlab引擎实现混合编程以及如何利用MATCOM进行MATLAB和VC++混合编程,并将两种方法用于数字图像处理。

关键词:MATLAB;VC++;MATCOM;引擎;混合编程;图像处理一、引言1、数字图像处理简介:图像技术由高到低分为三个层次:图像处理、图像分析和图像理解。

图像处理是比较底层的操作,它主要在图像像素级上进行处理,处理的数据量非常大。

数字图像处理最基本的目的就是改善图像,主要是按需要进行适当的变换突出某些有用的信息,去除或消弱无用的信息,如改变图像的对比度,去除噪声或强调边缘的处理等,其基本方法有:直方图修正、灰度变换、图像的频域特性、图像平滑、图像锐化等。

直方图是图像的重要统计特征,是表示数字图像中每一灰度级与该灰度级出现的频率数间的统计关系。

直方图能给出该图像的大致描述,如灰度范围、灰度级的分布、整幅图像的平均亮度等,但它不能完整地描述一幅图像。

通常用横坐标表示灰度级,纵坐标表示频数。

通常一幅均匀量化的自然图像由于其灰度直方图分布集中在较窄的低值灰度区间,引起图像的细节看不清楚,为使图像变得清晰,我们可以通过变换使图像的灰度范围拉开或使灰度分布在动态范围内趋于均匀化,从而增加反差,使图像的细节清晰,达到图像增强的目的。

灰度变换是图像增强的一种重要手段,它可以使图像动态范围加大,使图像对比度扩展,图像更加清晰,特征更加明显。

灰度变换可分为线性、分段线性、非线性以及其他的灰度变换。

线性灰度变换实际上使曝光不充分的图像中黑的部分更黑,白的部分更白,从而提高对比度。

图像中的边缘或者线条部分与图像频谱中的高频成分相对应,因此采用高通滤波的方法让高频分量顺利通过,使低频分量受到抑制,就可以增强高频的成分,使图像的边缘或者线条变得清晰,实现图像的锐化。

MATLAB与VC++混合编程实现一维小波多尺度分解

MATLAB与VC++混合编程实现一维小波多尺度分解

引言小波分析世纪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的计算结果。

Visual-C#与Matlab混合编程示例(含代码)

Visual-C#与Matlab混合编程示例(含代码)

Visual C# 与Matlab 混合编程由于Visual C# 与Matlab 混合编程的资料并不多,本文通过一个实例来阐述Visual C# 与Matlab 混合编程的方法。

一、混合编程的 4 种方式1. 通过从Matlab的*m文件中生成C语言版本的DLL1) 在Matlab中写好m文件;2) 使用Matlab的编译器,编译为C#能识别的DLL文件;3) 建立C#工程,在工程中引用上一步生成的文件;2. C#调用Matlab工作区计算并返回结果主要使用engOpen, engClose, engPutVariable, engEvalString, engGetVariable 函数进行操作。

大致过程如下:MatlabCSharp.engPutVariable(ep, "ml_a", mx_a);MatlabCSharp.engPutVariable(ep, "ml_b", mx_b);MatlabCSharp.engEvalString( ep, "ml_c = ml_a + ml_b ;" ); mx_c = MatlabCSharp.engGetVariable(ep, "ml_c" );3. 使用Matlab DeployTool 生成COM 组件1) 单击菜单New Deployment Project -> MATLAB Builder NE -> Generic COM Component2) 添加相应的M 文件3) 保存,编译4) 新建C#工程,引用生成的DLL文件。

4. 使用Matlab DeployTool 生成.Net 组件1) 单击菜单New Deployment Project -> MATLAB Builder NE -> .Net Component2) 添加相应的M 文件3) 保存,编译4) 新建C# 工程,引用生成的DLL 文件。

MATLAB与VC混合编程配置设置

MATLAB与VC混合编程配置设置

MATLAB与VC混合编程相关配置的设置MATLAB与VC的混合编程中,需要对电脑的“环境变量”和VC的“环境配置”进行设置,然后才可以进行程序的调用。

(1)电脑中“环境变量”的设置:对于win10系统控制面板→系统→高级系统设置→环境变量→系统变量→path中添加D:\softwares\MATLAB\ bin\win64,该路径是MATLAB中dll文件的路径,在path 中添加该路径的目的是让VC在运营时能够读取dll文件。

否则VC在运行时可能会出现“计算机丢失**.dll文件”的情况。

对于win7系统的“环境变量”设置,同样是在path中进行的。

(2)VC的环境配置首先需要建立一个新项目,如MyAdd.cpp。

项目→MyAdd属性→VC++目录→包含目录→D:\softwares\MATLAB \extern\include;项目→MyAdd属性→VC++目录→库目录→D:\softwares\MATLAB\installation document\extern\lib\win64\microsoft。

C/C++→常规→附加包含目录→D:\softwares\MATLAB \extern\include;C/C++→常规→调试信息格式→程序数据库(/Zi);链接器→常规→启用增量链接→是(/INCREMENTAL);链接器→常规→附加库目录→D:\softwares\MATLAB\ extern\lib\win64\microsoft;链接器→输入→附加依赖项→libMyAdd.lib,mclmcrrt.lib,libmx.lib,libmat.lib,mclmcr.lib。

其中在输入时这些lib之间用回车换行。

上述步骤的工作界面如下所示:需要注意:在进行VC与MATLAB混合编程的过程中,用到的环境是32位还是64位,在这里需要是相同的编程环境才可以相互调用,如:上图中如果是x32,则需要点击“配置管理器”进行重新设置。

VC与Matlab混合编程的实现

VC与Matlab混合编程的实现
机/ 务 器 的计 算 模 式 .通 过 Wid w的 A t e 服 no ci X v M C U eMF naS a dD L f F :s C i h r L 系统 菜 单 e 通道 和 Ma a 进 行 连 接 。f) 用 M t b数 学 函 工 程 \ 置 \连 接 对 象 \ 模 块 添 加 l mal. tb l 2应 al a 设 库 i t b b
1 引 言 、
MA L ec p t %\xeni ld \p a n
V 60是 Wi o s 面下 计算 机 专 业 人 士 进 C. n w 界 d
行 软 件开 发 时 的一种 强 大工 具 .在 图形 用 户界 面 需要 说 明的是 ,如果 Ma a t b的版本 不 同 , l 这 开发 方 面有 优势 . 码效 率 高 . 而在 科 学计 算 方 里看 到 的路 径就 会有 差 别 . 如 Ma a 6 代 然 例 t b 5和 Ma— l t 面能 力却 略 显不 足 。例如 , 当我们 采 用 V C作 为 开 l 7 a 4的路 径就 会有 所 差别 b 发 工 具 解 决 图 像处 理 和 模 式 识别 领域 的 问题 时 . Se .注 意 %Malb e trk bw n 2 \ . tp 3 t %\xenl \ i3 mi a i 经常需 要 进行 一 些复 杂 的矩 阵计算 例 如计 算 矩 阵 c0o \ v6 r fmsc 0中 的 * i 件 与 你 需 要 调 用 的 函 st .b文 1
12 7
福 建 电

2 1 第 4期 0 2年
V C与 Ma a t b混合 编 程 的 实现 l
黄 红兵
( 建农 林 大 学计 算机 与信 息 学院 福 建 福 州 3 0 0 福 5 0 1)

VC ++与Matlab混合编程方法剖析

VC ++与Matlab混合编程方法剖析

关 键 词 : t b Macm ̄ Mal ; t a o 混合 编程 ; t b引 擎 ; 速 傅 里 叶 变 换 Mal a 快 中图 分 类 号 : P 1 T 31 文 献 标 识 码 : B 文 章编 号 :0 4 7X( 0 7 1 一O 1 3 1 0 —3 3 2 0 ) 6 9 一O
A n lss o i e o r m i g M e h d b t e a l b a d V iu lC++ a y i fM x d Pr g a n t o e we n M ta n s a
ZHANG n e MiNi
( n Un v riyo o ta d Teeo mu iain , n, 1 0 I C ia Xi iest f s n lc m a P nc t s Xi o a 7 0 6 , hn )
lb h s p o f ce c n a i t t n t e d v l p n fc mme ca o t r . a a o r e f i n y a d f cl a e i h e eo me to o i i r ils fwa e VC
i n i n v t e v s a r g a s a n o a i iu lp o r mmig v n
a d M a l b b x mp e . ti x e ln o n t y e a ls I se c l tc m— a e
的领 域 , 自动 控 制 、 号 处 理 等 , 时 效 率ห้องสมุดไป่ตู้是 较 差 的 ; 如 信 其 1 引 言 随着 计 算 机 技 术 的 发 展 , 物 工程 、 像 信 号 处 理 、 生 图 语 音信 号 处 理 、 雷达 工 程 、 号 分 析 等 均 要 涉 及 到 大 量 的 数 信 值计 算 , 其 是 矩 阵 运 算 , 往 会 使 科 研 人 员 的 工 作 进 程 尤 往

Matlab与VC(MFC)混合编程(介绍Matcom与Matlab 引擎两种方式)文库

Matlab与VC(MFC)混合编程(介绍Matcom与Matlab 引擎两种方式)文库

本文由wolf1sky贡献doc文档可能在WAP端浏览体验不佳。

建议您优先选择TXT,或下载源文件到本机查看。

Matlab 与 VC 混合编程 1:一、采用 Matcom1、目标1. 测试在 VC 中调用 MatrixC++库,生成矩阵并显示 2. 测试 VC 中调用.m 文件2、步骤2.1 目标 1<1>建立 VC 工程,添加库 v4501v.lib,有两种方法:?向工程中添加文件 v4501v.lib 在 Setting/link 中添加库 v4501v.lib(这样写的前题是 VC 路径设置正确,即在 Options/Directories 中设置,否则请注明详细路径)二者选其一就可以了。

<2> 添加头文件 #include "matlib.h" (这样写的前题是 VC 路径设置正确,即在 Options/Directories 中设置,否则请注明详细路径)建议:最好在工程中把文件 matlib.h 添加进来,方便查看函数详细说明 <3>现在就可以调用 Matrix中的C++函数了,例子如下:// Init matcom initM(MATCOM_VERSION); winaxes(AfxGetMainWnd()->GetSafeHwnd()); Mm a,b; a = (BR(1),2,3,semi,4,5,6,semi,7,8,9); a = transpose(a); b = (BR(1),2,3,semi,4,5,6,semi,7,8,9); m_1.Format("%3f %3f %3f \r\n%3f %3f %3f \r\n%3f %3f %3f \r\n",a.r(1,1),a.r(1,2),a.r(1,3),a.r(2,1),a.r(2,2),a.r(2,3),a.r(3,1),a.r(3,2),a. r(3,3));//m_1 是一个 CEdit 控件 UpdateData(FALSE); exitM();2.2 目标 2<1>首先用 Matlab 调试成功以下两个有依赖关系的.m 文件文件 1:equation.m function y = equation(a,b) y = a * b; 文件 2:CallE.m % function name function [o1,o2] = CallE(x) if (nargin ~= 1) error('arguments must be inputed!'); endif (x == 1) a = reshape(1:9,3,3); elseif (x == 2) a = reshape(11:19,3,3); else error('input error'); end b = magic(3); o1 = equation(a,b); o2 = o1 + 1; <2>将以上两个文件放在同一个目录下,启动 MatCom 编译运行 CallE.m, >> CallE(2) 则在同一目录下生成一个 DEBUG(或者是 Release,在 MatCom 的菜单项 Configuration 中选择)目录下可以找到相应的.cpp 及.h 文件,把它们全部拷贝到 VC 工程目录下,也可以自己建一个文件夹 <3>在 VC 项目中添加这些文件,并在头部添加相应.h 的引用,如下: #include "./matlib/equation.h" #include "./matlib/calle.h" <4>添加调用函数的代码,如下: Mm a,b,c; a = BR(2); 表示输入参数到输出参数的间隔,《MatrixLIB user's 详见calle(a,i_o,b,c); //i_o 是一个间隔符,Guide》m_2.Format("%3f %3f %3f \r\n%3f %3f %3f \r\n%3f \r\n",b.r(1,1),b.r(1,2),b.r(1,3),b.r(2,1),b.r(2,2),b.r(2,3),b.r(3,1),b.r(3,2),b. r(3,3)); %3f %3fUpdateData(FALSE);3、遇到的问题及解决方案<1>当在 VC 工程中添加由 Matcom 转换的 cpp 及 h 文件后,注:如果在编译中出现下列错误:fatal error C1010: unexpected end of file while looking for precompiled headerdirective 解决:进行下列设置:工程->设置-> C/C++ 选择 precompiled headers 选解决:择第一或第二项:自动选择预补偿页眉,如图:<2>使用Matcom 后,生成Debug 版没问题,而生成Release 时链接出错,nafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMT.lib(delete.obj) 解决:解决:将"Project 属性" -> "C/C++" -> "代码生成(codegeneration)" -> "运行时库(run-time library)" 项下修改应用程序的默认标准库版本,我修改成 Debug Multithreads 就可以了,原因是安装Matcom 时库为调试版<3>在其它机器上运行出错解决:解决:将 ago4501.dll v4501v.dll glu32.dll opengl32.dll 附带发布即可 <4>关闭程序后进程没有退出解决:解决:添加语句winaxes(m_hWnd);参考文献1、何东健等.《数字图像处理》.西安电子科技大学出版社.20032、邓科.浅析 VC 与matlab 接口编程(一). VC 知识库,41 期3、邓科.浅析 VC 与 matlab 接口编程(二). VC 知识库,42 期4、Matcom 参考手册Matlab 与 VC 混合编程 2:二、通过 Matlab 引擎与 VC 混合编程--飞狼编程宝典--明明知道选择你是一个错误,却为何那么地坚持这个错误……基于 Matlab 引擎的混合编程方式无法脱离 Matlab 环境,却为何还要使用它?根据本人的实践,对于一般应用,如矩阵运算,图像操作等,使用 Matcom 就已经足够,而且能够脱离 Matlab 那个巨大的环境而独立运行,但是,对于很多好用的 Matlab 工具箱,我们却无法直接在 VC 中调用。

MATLAB 与C C + + 、FORTRAN语言混合编程

MATLAB 与C C + + 、FORTRAN语言混合编程

MATLAB 与C/ C + + 、FORTRAN语言混合编程摘要:对MATLAB 与C/ C + + 和FORTRAN 语言进行混合编程的常用方法进行了介绍,分析了其实现方式和各自的利弊,并用实例对MEX 文件实现方式进行了较详细的论述.关键词: MATLAB ; C/ C + + ; FORTRAN ; 混合编程中图分类号: TP313 文献标识码: A 文章编号:16722948X(2004) 0620547205 1 混合编程的意义及其实现方式1. 1 混合编程的意义MATLAB 语言具有功能强大、开发效率高等诸多优点, 已在工程实际中得到广泛应用, 但是与FORTRAN、C/ C + + 等语言相比,其执行效率较低,特别是当程序中含有大量循环语句(例如迭代计算)时,MATLAB 就有些力不从心, 速度很慢, 而运用FORTRAN 等擅长数值计算语言进行编程,其运行效率高. 一方面,如果放弃MATLAB 强大功能和数量众多的应用工具箱,无疑是资源的极大浪费. 另一方面,针对工程实际,人们用FORTRAN、C/ C + + 语言已编写了大量实用程序,如果将其重新改写成M 文件移植到MATLAB 环境中,不仅要花费大量的时间和精力,而且有时还降低了其运行效率. 可否将二者优势互补呢? 混合编程就是其有效的解决途径.1. 2 混合编程的实现正是考虑到上面这些原由,MATLAB 系统提供了其应用程序接口(Application Program Interface) 来解决这些问题. API 主要包括3 部分:MEX 文件———外部程序调用接口,用来在MATLAB 环境下调用FORTRAN、C/ C + + 语言编写的程序;MAT 文件应用程序———数据输入输出接口,用于MATLAB 系统与外部环境之间互传数据; 计算引擎函数库———MATLAB 处于后台作为一个计算引擎,与其它应用程序建立客户机/ 服务器关系,在其它应用程序中调用[1 ,2 ] .1. 2. 1 MEX 文件MEX 文件是按照一定格式,用FORTRAN 或C/C + + 语言编写的源程序,在MATLAB 下借助相应的编译器,生成的动态链接函数的统称. 在Windows操作系统下,是用MATLAB 附带的批处理mex. bat来编译生成文件后缀名为. dll (Dynamic Link Li2brary) 动态链接库文件,该文件可在MATLAB 环境下,像命令函数一样直接运行和调用,使用起来极为方便. 采取MEX 文件方式,是重复利用已有FOR2TRAN、C/ C + + 程序,让MATLAB 和FORTRAN、C/ C + + 语言优势互补的最有效和常用的方式,但不足的是其开发的程序只能在MATLAB 环境下运行.本文将详细的论述基于Windows 平台上其实现过程.1. 2. 2 MAT 文件应用程序MATLAB 数据存储的默认文件名后缀为. mat ,习惯上称该格式的文件为MAT 文件, MAT 文件应用程序提供了一种方法让MATLAB 与其它软件进行数据输入输出.1. 2. 3 MATLAB 计算引擎MATLAB 引擎采用客户机/ 服务器的计算模式,通过对Activex 技术的支持,实现VC 应用程序(客户机) 与MATLAB(服务器) 的动态连接通信. 假如用户想以较短的时间开发前台为VC + + 产生的用户界面,后台由MATLAB 计算分析的应用程序, 使用MATLAB 引擎是很好的选择. 在实际应用中,MAT2 LAB 作为ActiveX 的自动化服务器,接收通过引擎传来的数据和指令信息并进行相应的处理,然后将结果经过引擎返回给发送请求的客户机. 但这种方式需要MATLAB 在后台的适时运行, 如果用户没有安装MATLAB ,应用程序就无法正常运行,而且应用程序与MATLAB 间通过字符流传递数据和命令参数,整个算法在MATLAB 中执行,从而降低了程序的执行效率,因而其实际应用不多.1. 2. 4 MCC 和MATCOM前面提到的几种方式都是以MATLAB 为主,程序的运行都离不MATLAB 环境. 除此之外,另一种方式就是将MATLAB 语言程序翻译成C/ C + + 语言代码,再用C/ C + + 语言的方式进行开发. MAT2 LAB 自己提供了C 语言翻译程序mcc , 另一种是原第3 方公司MathTools 开发的MATCOM. 后者出现较早,功能远比MATLAB 自己的翻译程序强大,所以MathTools 公司已经被MathWorks 公司收购,并已将其开发技术融于新推出的MATLAB 6. 0 (Re2 lease 12) 中. 但二者都不完善,有大量的MATLAB函数及数据类型是不能兼容变换的,所以有时会发现将简洁的MATLAB 程序翻译成C 语言程序很晦涩.翻译后的C 程序几乎不适合手动去维护,更谈不上升级了[3 ] .2 C/ C + + 语言MEX文件的实现C/ C + + 语言MEX 文件的实现包括,源程序的编辑、MEX 编译和调试. 在编译和调试前要进行编译器的配置.2. 1 C/ C+ + 语言MEX文件的编写C/ C + + 语言MEX 文件的编写格式,除了要遵循C/ C + + 语言语法外,还须要加入用于MATLAB和C/ C + + 语言通信协议———入口子程序. 我们首先看一个极简单的C 语言MEX 文件,该程序的作用是两个数求和,源程序如下:/ / 示例程序myplus. c :求两个Double 数之和# include ”mex. h”/ 3 计算功能子程序3 /void myplus (double y[ ] ,double x[ ] ,double z[ ]) {y[0 ] = x[0 ] + z[0 ] ;}/ 3 以下是入口子程序3 /void mexFunction(int nlhs ,mxArray 3 plhs[ ] ,int nrhs ,const mxArray 3 prhs[ ]){double 3 x , 3 y , 3 z ;int mrows0 ,ncols0 ;int mrows1 ,ncols1 ;/ 3 检查输入输出变量个数3 /if (nrhs ! = 2)mexErrMsgTxt (”Two input s arquired”) ;elseif ( nlhs > 1) mexErrMsgTxt ( ”Too many output argument s”) ;/ 3 输入量必须是两个非复数double 类型3 /mrows0 = mxGetM(prhs[0 ]) ;ncols0 = mxGetN(prhs[0 ]) ;if ( ! mxIsDouble (prhs [ 0 ]) | | mxIsComplex (prhs [0 ]) | | ! (mrows0 = = 1 & &ncols0 = = 1) ) mexErrMsgTxt ( ”Input s must be all noncomplex scalar double. ”) ;mrows1 = mxGetM(prhs[1 ]) ;ncols1 = mxGetN(prhs[1 ]) ;if ( ! mxIsDouble (prhs [ 1 ]) | | mxIsComplex (prhs [1 ]) | | ! (mrows1 = = 1 & &ncols1 = = 1) ) mexErrMsgTxt ( ”Input s must be all noncomplex scalar double. ”) ;if (mrows0 ! = mrows1| | ncols0 ! = ncols1) mexErrMsgTxt ( ”Input s must be same dimen2sion. ”) ;/ 3 为返回参数创建矩阵3 /plhs [ 0 ] = mxCreateDoubleMat rix ( mrows0 ,ncols0 ,mxREAL) ;x = mxGet Pr (prhs[0 ]) ;z = mxGet Pr (prhs[1 ]) ;548 三峡大学学报(自然科学版) 2004 年12 月y = mxGet Pr (plhs[0 ]) ;/ 3 调用计算功能子程序myplus () 3 /myplus (y ,x ,z) ;}上面程序为一典型的C 语言MEX 文件,程序由两部分构成:一个计算功能子程序(myplus () 函数) 和一个入口子程序(mexFunction () 函数) . 顾名思义,计算功能子程序包含所有实际所需完成的功能、算法,我们已有的或现编的C/ C + + 、FORTRAN 程序就被当做计算功能子程序使用,它由入口子程序调用. 入口子程序是MATLAB 系统和外部程序之间沟通的桥梁,主要用来完成两者之间的通信. 上面示例程序中,mexFunction () 函数有大量语句是用于检查变量的数据类型等辅助性工作,这是必要的,因为MAT2LAB 语言不像C/ C + + 等语言变量使用前须声明,对类型的检查可以避免许多错误的发生.下面简要的说明一下上面程序中用到的MAT2LAB API 函数,它们在mex. h 或mat rix. h 中声明. mexFunction () ,入口子程序函数,其格式如下:void mexFunction(int nlhs ,mxArray 3 plhs[ ] ,intnrhs ,const mxArray 3 prhs[ ]){⋯⋯/ / 一些必要的代码,用来完成MATLAB 系统与计算功能子程序之间的通信}其参数的含意为:nrhs 和nlhs ,整型变量,分别为调用MEX 文件时输入、输出参数的个数. prhs、plhs ,指针数组,其元素分别为指向输入、输出参数的指针. mexErrMsgTxt () ,用于输出错误信息,并返回到MATLAB 命令提示符下.mxGetM() 和mxGetN ( ) ,获得矩阵的行数和列数,参数为指向矩阵的指针,如程序中的mrows0 =mxGetM(prhs[0 ]) 的作用为:得到第一个输入实参的行数,并赋值给整型变量mrows0.mxIsDouble () 、mxIsComplex () ,判断矩阵是否为双精度型、复数型. 输入参数为矩阵指针,返回值为BOOL 值.mxCreateDoubleMat rix(int m ,int n ,mxComplex2ity complexFlag) ,创建一个未赋值的双精度矩阵,m ,n 为创建矩阵的行、列数,complexFlag 为标识是实数还是复数. 该函数返回所创建矩阵的指针.mxGet Pr () 获得矩阵实数部分的指针,输入参数为矩阵的指针,返回值为矩阵实数部分的双精度指针.MATLAB API 函数还包含其它许多接口函数,分为mx2函数和mex2函数,详细情况可查阅相关文献.MEX 源程序编写完成后,还要经过编译后才能生成dll 文件,供MATLAB 或其它程序调用,编译前要对MATLAB 进行编译器的配置.2. 2 编译器的配置编译器的配置是通过MATLAB 的配置文件(mexopt s. bat ) 进行的,其具体过程为: 在MATLAB 命令窗口下键入:mex2steup ,随后系统弹出一个DOS 窗口,按照提示一步步选择完成即可. 该命令可带许多参数,可针对不同的操作系统进行多种配置[2 ,3 ] . 2. 3 C/ C+ + 语言MEX文件的编译编译方法很简单,直接在MATLAB 命令提示符下键入:mex filename ,其中filename 为需编译的源程序名. 如果提示有错误信息,需查错,修改源程序、调试. 直到没有错误信息提示. 编译通过生成的可执行的dll 文件,可在MATLAB 命令提示符下或其它程序中调用.3 FORTRAN语言MEX文件的实现FORTRAN 语言MEX 文件的实现步骤和C/ C+ + 语言MEX 文件大体相同.3. 1 FORTRAN 语言MEX 文件的编写MATLAB 提供了C/ C + + 和FORTRAN 两种语言的接口,基于FORTRAN 语言和前面讲到的基于C/ C + + 语言的MEX 文件在实现方式上相差不大. 我们先还是看一下前面程序用FORTRAN 语言MEX 文件来实现的源程序.! 示例程序myplus. f :求两个数之和! 计算功能子程序subroutine myplus (y ,x ,z)! 变量声明real 3 8 x ,y ,zy = x + zreturnend! 以下是入口子程序subroutine mexFunction(nlhs ,plhs ,nrhs ,prhs) ! 参数声明integer nlhs ,nrhs ,plhs ( 3 ) ,prhs ( 3 )! 调用API 库函数的声明integer mxGet Pr ,mxCreateFullinteger mxGetM ,mxGetN ,mxIsNumeric! 程序内部使用变量的声明第26 卷第6 期陈建平等MATLAB 与C/ C + + 、FORTRAN 语言混合编程549 integer xpr ,ypr ,zprinteger mrows ,ncols ,sizereal 3 8 x ,y ,z! 检查输入输出变量个数if (nrhs. ne. 2) thencall mexErrMsgTxt (’Two input s arquired’)elseif (nlhs. gt . 1) thencall mexErrMsgTxt ( ’Too many output argu2ment s’)endif! 输入量必须是两个数mrows = mxGetM(prhs (1) )ncols = mxGetN(prhs (1) )size = mrows 3 ncolsif (mxIsNumeric (prhs (1) ) . eq. 0) thencall mexErrMsgTxt (’Input s must be a number’)endifmrows = mxGetM(prhs (2) )ncols = mxGetN(prhs (2) )size = mrows 3 ncolsif (mxIsNumeric (prhs (2) ) . eq. 0) thencall mexErrMsgTxt (’Input s must be a number’)endif! 为输出参数创建矩阵plhs (1) = mxCreateFull (mrows ,ncols ,0)xpr = mxGet Pr (prhs (1) )zpr = mxGet Pr (prhs (2) )ypr = mxGet Pr (plhs (1) )! 将数据指针转换成双精度型call mxCopyPt r ToReal8 (xpr ,x ,size)call mxCopyPt r ToReal8 (zpr ,z ,size)! 调用计算功能子程序mypluscall myplus (y ,x ,z)! 将计算结果传给输出数据指针call mxCopyReal8ToPt r (y ,ypr ,size)returnend该程序的结构和内容与前面myplus. c 大致相同,也是由两部分:一个计算功能子例行程序和一个入口子例行程序构成,其程序中参数和变量大多相同,这里就不一一再介绍了. 但值得一提的是, FOR2TRAN 和C/ C + + 语言语法规则相差较大,在C/ C ++ 语言中对字符大小写是敏感的,而FORTRAN 语言中大小写是一样的;C/ C + + 语言中数组是按行存储,数组下标是从0 开始计数的,而FORTRAN 语言中数组是按列存储,数组下标从1 开始. C/ C + + 语言几乎支持所有的数据类型,支持头文件,操作很灵活. 而FORTRAN 语言,不支持指针,参数传输较麻烦[1 ] .3. 2 FORTRAN语言MEX文件的编译和C/ C + + 语言MEX 文件一样,编译前需进行编译器的配置,方法同前,只是选的编译器不同(例如Compaq Visual Fort ran version 6. 6) . 编译的过程也一样,MATLAB6 的编译命令(不再区分C/ C + + 文件用cmex. bat ,FORTRAN 用fmex. bat) 统一使用mex.bat 批处理命令,其后的文件名须带扩展名.4 Visual Studio IDE 下MEX文件的建立和调试4. 1 Visual Studio 的配置前面使用的mex 文件的使用方式,类似在DOS下程序开发方式,程序编辑、编译、调试和执行分开,每次只能创建一个文件,需要来回切换MATLAB 命令窗口和编辑窗口,操作较麻烦. VC 是在Windows环境下的优秀开发平台,将MATLAB 和VC 强强联手,无疑是非常好的混合编程方式. 下面就简要介绍一下如何在VC 的IDE( Integrated Development Envi2 ronment) 中编译MEX 程序. 为了表述的方便,我们以MATLAB6. 5 (安装在C: \ matlab6p5) 和Visual C ++ 6. 0 (安装在D : \ Program Files \ Microsoft Visual Studio) 为例,可以分为以下5 步[4 ,5 ] :①用VC 创建一个工程(假定名称为myproject) ,类型选择Win32 Dynamic - link Library ,并将自己的MEX源程序和mexversion. rc (在C: \ MATLAB6p5\ extern \ include 下) 加入到工程.②创建一个与工程同名的定义文件(myproject .def) ,内容如下:L IBRARY myproject . dllEXPORTS mexFunction(如果是FORTRAN 该行改为EXPORTS -MEXFUNCTION @16 )并加入定义文件myproject . def 到工程③定位库文件( . lib) 位置. 具体操作为:选择VC下拉菜单Tools/ Options ⋯,在弹出的对话框Show di2rectories for 下拉框中选择Library files ,在下部的Di2 rectories : 中添加C: \ MATLAB6p5 \ extern \ lib \win32 \ microsoft \ msvc60 目录. 然后选择VC 下拉菜单Project/ Settings ⋯, 在弹出的对话框中选择550 三峡大学学报(自然科学版) 2004 年12 月Link 选项卡,在Category 栏中选择general 选项,在出现的Object/ library modules : 框中填入libmx. lib , libmex. lib , and libmat . lib.④加入MATLAB include 目录. 具体操作为:选择VC 下拉菜单Tools/ Options ⋯,在弹出的对话框Show directories for 下拉框中选择Include files ,在下部的Directories : 中添加C: \ MATLAB6p5 \ extern\ include 目录. 然后选择VC 下拉菜单Project/ Set2tings ⋯, 在弹出的对话框中选择C/ C + + 选项卡,在Category 栏中选择Preprocessor 选项,在出现的Pre2 processor definitions : 框中填入MATLAB-MEXFILE.⑤最后就是调试运行配置. 具体操作为:选择VC下拉菜单Project/ Settings ⋯,在弹出的对话框选择Debug 选项卡,在Category 栏中选择General 选项,在出现的Executable for debug session :框中填入C: \ MATLAB6p5 \ bin \ win32 \ matlab. exe.4. 2 在Visual Studio 中使用MATLAB add - inMATLAB6. X为Visual Studio IDE 提供了add -in ,该add - in 使MATLAB 的M - files 非常容易的就可加入到VC 环境中,使VC 和MATLAB 很好的融合. 不过要使用该插件需要简单的配置. 具体操作如下:使用前面提到的mex - steup 命令进行编译器的配置, 选择VC 作为编译器后, 该命令自动装载MATLAB add - in. 然后选择VC 下拉菜单Tools/Customize ⋯, 在弹出的对话框中勾选MATLAB add- in 复选框. 随后VC 就出现了如图1 所示的工具条,其中第一个按钮的功能就是用来将M - files 添加到Visual Studio IDE 中的.图1 图标示例5 结语本文对MATLAB 与C/ C + + 和FORTRAN 语言进行混合编程的常用4 种方法进行了论述. 4 种方法各有其优势,又各有不足. 其中MEX 文件的方式,特别是Visual Studio IDE 下混合编程,将MATLAB和Visual Studio 开发系统相接合,以其功能强大、操作便利和利于升级维护,具有广泛的使用价值.参考文献:[1 ] 刘志俭. MATLAB 应用程序接口用户指南[M] . 北京:科学技术出版社,2000.[2 ] 飞思科技产品研发中心. MATLAB6. 5 应用程序接口编程[M] . 北京:电子工业出版社,2003.[3 ] 薛定宇. 科学运算语言MATLAB5. 3 程序设计与应用[M] . 北京:清华大学出版社,2000.[4 ] 王振义. MATLAB 和Visual C + + 的混合编程[J ] . 雁北师范学院学报,2002 ,18 (2) :26~29.[5 ] 马海阳,王艳华,孙道恒. MATLAB 的VC 编程接口浅析[J ] . 信息技术,2003 ,27 (3) :55~57.[责任编辑张莉]第26 卷第6 期陈建平等MATLAB 与C/ C + + 、FORTRAN 语言混合编程551__。

MATLAB与Visual C++混合编程在储层三维建模系统中的应用

MATLAB与Visual C++混合编程在储层三维建模系统中的应用

MATLAB与Visual C++混合编程在储层三维建模系统中的应用摘要:利用Visual C++与MATLAB进行混合编程,开发了三维储层建模系统。

解决了MATLAB 不能实现端口操作、实时控制和V isual C++处理复杂数值运算效率低的问题,二者功能互补,为三维储层建模的复杂计算及计算结果的可视化提供强大的技术支持。

MATLAB将河流储层建模系统中计算模块转化成V isual C++的代码,并将代码用V isual C++编译器编译连接成独立应用程序。

V isual C++编写的可视化交互操作界面对MATLAB 编译后的动态链接库文件进行调用,实现复杂计算功能。

关键词:MATLAB;V isual C++;混合编程;储层三维建模对河流相进行储层建模,我们通常采用自回避随机游走算法,约定游走粒子不允许到达曾经访问过的位置。

这样得到的建模结果就不会产生与自身相交,形成闭合环的现象,符合古河流沉积规律,但是所形成的游走路径是二维空间中的一条折线,脱离了地质构造形态本身,对建模结果的认识不够直观。

因此我们采用空间插值方法建立三维储层建模,以便观察河流空间分布模式。

空间插值常用于将离散点的测量数据转化为连续的数据曲面,本文采用最近邻点插值法对各小层的顶、底面进行建模。

最近邻点插值法又称泰森多边形法,它将空间分割成不同的多边形区域,每一区域的属性值使用距它最近位置点的属性值。

三维插值计算实现代码如下:%编译命令:mcc -W cpplib:libtestgrid -T link:lib testgrid (生成C++的动态库)%编译命令:mcc -W lib:libtestgrid -T link:lib testgrid (生成C的动态库)function testgrid(filename,step,bView)[x,y,top, bottom] = textread(filename, '%*s %f %f %*s %*s %f %f %*f');x=x/1000.0;y=y/1000.0;step = step / 1000.0;mid = (top + bottom)/2;max_x = max(x)+0.2;min_x = min(x)-0.2;xi =(min_x:step:max_x);max_y = max(y)+0.2;min_y = min(y)-0.2;yi=(min_y:step:max_y);[xx,yy]=meshgrid(xi,yi);if (bView)zz_top=griddata(x,y,-top,xx,yy,'nearest');zz_bottom=griddata(x,y,-bottom,xx,yy,'nearest');figure('NumberTitle','off','Name','小层构造模型');mesh(xx,yy,zz_top),hold on;mesh(xx,yy,zz_bottom);plot3(x,y,-bottom,'r.'), hold off;xlabel('X(Km)');ylabel('y(Km)');zlabel('z(m)');title('小层构造模型','FontName','隶书','FontSize',20) 2混合编程2.1实现混合编程的环境配置要成功地实现混合编程,达到混合编程的要求并最终作为独立的应用程序发布, 首先要对MATLAB 及V isual C+ + 进行环境的配置。

VC6.0与MATLAB7.X混合编程方法研究

VC6.0与MATLAB7.X混合编程方法研究

Cls m b r TP3 1 a s Nu e 1
1 引言
MAT AB是 美 国 Mah rs 司研 制开 发 L tWo k 公
用 C++语 言开发 涉及 矩 阵操作 较 多的程 序 , 但 不
费 时费力 、 易 出 错 , 且 运 行 效 率 也 不 一 定 高 。 容 而
TLAB i e o Bu l r f r COM .Th r p r c n e to if r n y S i to u e n o d e p o e o t x fd fe e twa si n r d c d a d c m.
p r d.Th y f r la i g t e c mb n t n p o r m n r d c d. ae e wa s o ee sn h o i a i r g a i i to u e o s Ke o d M yw rs A TLA B ,VC++ ,c mb n t n p o r m mi g o ia i r g a o n
提供 VC下 的编程 插 件 。针 对这 种情 况 , 具体讨 论
可视化编程环境 。其功能强大, 既适用于与底层交 流信息 , 又有 强大 的可视 化编程 功能 , 执行 速度 快 , 运 行稳定 , 为许 多程 序 员 所 喜爱 。但 是 , 如果 纯 粹
了 V ++60 在 c . 环境下与 M T B. 系列版 A I 7x A
关 键 词 MA AB VC + 混合 编 程 TL + 中图 分 类 号 TP 1 31
Re e r h on t m b na i og a m i o s a c he Co i ton Pr r m ng f r
M A TLA B7. n C ++ 6. Xa d V O

VC++与MATLAB的混合编程研究

VC++与MATLAB的混合编程研究

主要 有 以下 几种 : 使用 Matb提 供 的 mC ① t a C编译 器 。
②利 用 Acie 自动化技 术 , t X v 调用 Malb的服务 引擎 t a 库 。③ 使 用 第 三 方 软 件 Mac m 来 实 现 。④ 使 用 to
Malb环境 独立运行 。 t a 利 用这 种方 法 , 换后 的 c c+ +文 件代 码冗 余 转 /
度 大 、 读 性 不 强 , 行 速度 也 比传 统 c/ 可 执 c+ +代 码 慢, 但是 在提 高开 发效率 上还 是一种 不错 的选择 。
12 利 用 A t e 调 用 M alb服 务 引 擎 库 . ci X, v t a
a a a s a d d s dv t e fva i dv nt ge n ia an ag s o rous met odsa h rap ia i r o h nd t ei plc ton a e pr pos d. e
KEYW ORDS m i e r g a x d p o r mmi g, VC ,M a l b, C n ta OM

l 混 合 编 程 方 法 介 绍
1 1 使 用 Malb提 供 的 IC 译 器 . t a l C编 l ] 用 M alb的 Ie t a T c编 译 器 将 Malb的 源 程 序 文 I t a
种 解释 性语 言 开发 平 台 , 这就 决 定 了它 的代 码 执 行
件 (*. 转 变 为 VC+ + 能 够 识 别 的程 序 文 件 ( m) *
Malb是 一 种 面 向工 程 实践 和科 学 运算 的交 互 t a 式仿 真 软件 , 集科 学计 算 、 号处 理 、 它 信 系统 仿 真 与 图 形可 视化 于一体 , 具有 极高 的编程 效率 。 常有利 于工 非

Matlab与Visual C++混合编程学习笔记

Matlab与Visual C++混合编程学习笔记

Matlab与Visual C++混合编程学习笔记要实现VC++与matlab的无缝混编,必须充分掌握matlab的C/C++数学库函数和图形库函数,而要运用这两类库函数则必须先熟悉matlab的接口类与接口函数的结构及使用规则。

1 Matlab接口类与接口函数的介绍接口类 mwArray(1) 构造函数mwArray()默认构造函数,通过它用户可以创建一个未初始化的mwArray类对象(阵列)。

mwArray(const char *str)通过该函数可以构造一个字符串型的阵列,并通过输入的字符串指针指向的字符串进行初始化,例如:mwArray A(“MATLAB mwArray string”); mwArray(int32 rows, int32 cols, double *real, double *imag = 0) 通过该函数可以创建一个指定行数、列数、以及实部和虚部数据的二维复数阵列,例如:double real[] = {1, 2, 3, 4, 5};double imag[] = {6, 7, 8, 9, 10};mwArray A(1,5,real,imag);mwArray(const mwArray &mtrx)mwArray(const mxArray *mtrx)mwArray(double start, double step, double stop)mwArray(int32 start, int32 step, int32 stop)mwArray(const mwSubArray & a)mwArray(double)mwArray(int)(2) 索引和下标函数operator ()cell ()field ()(3)转换函数operator double() const(4) 内存管理函数类mwArray对运算符new和delete进行了重载。

实现VC++MATLAB混合编程论文

实现VC++MATLAB混合编程论文

浅谈实现VC++与MATLAB混合编程摘要:本文深入分析了vc++与matlab两种编程语言的特点,充分发挥了两种语言的优点,实现混合编程。

并在弹箭弹道参数相对于气动参数的灵敏度分析过程中进行了验证,直观方便地利用灵敏度函数对气动参数加以辨识,得出弹道参数模型,并进行弹道计算。

关键词:编程混合编程灵敏度matlab是一种以矩阵为基本运算单位的高效数值计算软件,带有功能强大的数学函数库,并开发有多种学科领域的工具箱函数库,广泛地应用于科学研究与工程计算。

vc++用于面向对象的可视化编程,可以完成从底层软件直到面向用户软件等各种应用程序的开发。

利用它提供的各种实用工具,开发者可以轻松开发出高效强大的windows应用程序。

把matlab在数值计算、算法设计以及数据可视化等领域的优势与vc++应用系统集成,不仅可以完全满足系统在数据运算与表现方面的需求,而且还可提高系统处理的效率和稳定性,同时也减少了开发人员实现算法的困难,缩短了软件开发的周期,提高了软件质量,在实践中具有很高的使用价值。

1 mlrs/m26多管火箭弹弹道所谓弹道是指弹箭在空中飞行时,其质心所经过的路线,它是一条空间曲线。

从弹箭侧面看,弹道的投影如图1所示:利用现代控制理论、弹箭飞行动力学、数值分析、随机过程、弹箭设计理论以及计算机仿真等理论,分析弹箭弹道参数对气动系统灵敏度函数问题,以matlab和vc为操作平台,制作用户操作界面。

2 vc++与matlab混合编程的优点vc++用于面向对象的可视化编程,开发者可以轻松开发出高效强大的windows应用程序,利用它提供的各种实用工具,可以完成从底层软件直到面向用户软件等各种应用程序的开发。

但在实际工程开发中,与matlab相比:①matlab比vc++在数值处理分析和算法工具等方面更优异。

②matlab比vc++在准确方便地绘制数据图形方面更完善。

matlab具有强大的数值计算功能,matlab中提供了大量用c\c++重新编写的matlab库函数,matlab自身存在一些缺点限制了它在更多方面的应用,主要包括初等数学函数、线形代数函数、矩阵操作函数、数值计算函数、特殊数学函数、插值函数等,这些缺点主要包括:①容易被直接读取,所以难以保护劳动者的成果,matlab编写的m文件大多是文本文件。

matlab与C混合编程步骤详解

matlab与C混合编程步骤详解

1MATLAB Compiler 是MATLAB自带的一个编译器,它能将m文件转化成 C、C++或p等各种类型的源代码,并根据需要生成可执行文件、lib文件(库文件)、dll文件或S函数文件等。

Matlab所使用的编译器包括了MATLAB 的C\C++数学库函数以及图形库。

必须保证编译器的正确配置,因为编译器使用了C\C++库函数,所以在使用前需要使用mex -setup 和 mbuild -setup两个命令对编译器进行配置。

步骤如下:1. 设置Matlab的编译器,使用外部的VC或者gcc等编译器。

2. 编译m文件成dll3. 设置VC等的继承环境,设置C需要用到的静态库和动态库4. 编写C调用dll1.1设置MATLAB编译器首先要安装Matlab 编译器,一般来说,在安装了Matlab后编译器就己经安装了,所在就只需要对Matlab编译器进行设置。

1.1.1 编译环境设置首先设置系统的环境变量,点击“我的电脑”属性-→系统特性--→高级-→环境变量-→添加系统变量Matlab值为Matlab的安装路径:G:\matlab7.0\bin\win32,重启电脑即可。

1.1.2 MATLAB7.0 编译器设置(a) 为编译后产生的MEX文件进行预配置在Matlab 的命令窗口(Command Window) 键入“mex -setup ”命令后,按回车键,安装Matlab 编译器;(b) 为产生独立外部应用程序进行预配置对Matlab编译器mbuild应用程序进行设置,运行Matlab ,在Matlab 的命令窗口(Command Window) 键入“mbuild -setup ”命令后,按回车键,安装Matlab 编译器;1.2 将MATLAB函数转成DLL函数在Matlab的Command Window /下输入命令:命令 1 :mcc -W lib:dlltest -T link:lib huatu_test.m或命令 2 :mcc -W cpplib: dlltest -T link:lib huatu_test.m命令1生成的是C,命令2生产的是C++。

浅析VC与Matlab联合编程(二)

浅析VC与Matlab联合编程(二)

::首页>> 文档中心>> 在线杂志>> 其它[ 在线杂志第42期][ 原创文档本文适合中级读者已阅读231次]浅析VC与Matlab联合编程(二)作者:邓科下载源代码在“浅析VC与Matlab联合编程(一)”中简单介绍了VC与matcom的接口编程,实现本功能,要真正熟练使用接口编程,还要对函数调用有一定了解。

本文通过一个实例,较详细的介编译后的函数。

首先新建一个函数huatu.m,该函数的功能是:接受用户输入的左端点值和右端点值两个输图形。

函数还将生成两个随机数,作为一个点的坐标在图中打印出来(绿点),用来说明如何在步骤如下:1.建立一个名为Example2基于对话框的MFC(exe)工程。

2.在matcom中新建一个名为huatu.m文件,如图1;图13.在matcom命令窗口中运行该函数,如图2;图24.将生成的huatu.h、huatu.cpp(默认位置为安装目录:\matcom45\samples\Debug)和ma 为安装目录:\matcom45\lib)四个文件拷贝到建立的工程Example2目录下。

5.将第四步拷贝的四个文件加入到VC工程中:工程->添加工程->文件,选择刚才拷贝到Exa 成后如图3;图36.在Example2dlg.cpp中添加头文件:(如图4所示)#include "matlib.h"#include "huatu.h"图47.为工程建立界面:添加一个Button按扭控件;添加四个Edit box控件,用于显示数据;添加显示文字,一个显示图形,将显示图形的Static text的ID设置为ID_PIC。

其他所有控件属性保适当调整显示图形Static text控件的边缘)。

如图5所示图58.按Ctrl+W为控件添加变量。

如图6所示图69.为Button1按钮添加响应代码。

如图7所示图710.运行程序,输入左端点和右端点,点击”画图”按钮,结果如图8所示。

Matlab与VC++混合编程综述

Matlab与VC++混合编程综述
A bsr c M alb s vey o s t r f sintfc om p i g, VC + + i as t a t: ta i a r g od ofwa e or ce i c i utn s l o a a it of s f ae v rey o t r de lpm e t w veo n plto m o ho c af r f c ie,ho t c m b n t a va a e o her m ie pr g a r ng pa t t sr n t s f t t o f r w O o i e he d ntg s f t i, xd o rm m , ly O he te g h o he w , o t r pi de lpm e t f nd t a c n r l s f a e i v r e e tve I t i pa r a d ti d o r iw of he a d veo n o i usr l o to ot r s e y f ci . n h s i w pe , eal vev e e Engne i
M a l b a d ta n VC + + M i e o r m m i v e x d Pr g a ng Re i w
W a gCh n - i , a gXio bn, ioDig n n e g je W n a — i L a n —a
( a g h u T xi ame t n tu e C a gh u2 3 6 , h n ) Ch n z o e t eG r n s tt, h n z o 1 1 4C ia l Ii
这一 混合 编程 的理 想策 略 , 多 学者纷 纷 进行 了研 究 , 许
研 究 了多 种实 现 的方法 。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

COM 的存在 形式
com 组件 的标 志方 式
COM组件标志
CLSID && IID
typedef GUID CLSID; tupedef GUID IID; //组件标志 //接口标志 UUIDGEN.exe GUIDGEN.exe
ProgID
GUID记忆起来很困难,所以有些计算机语言采用ProgID来标识组 件,就好像是给组件起了一个很友好的名字。ProgID应该与GUID 一一对应。
Visual C++中调用COM组件的步骤
• • • • • 初始化COM库 得到COM对象的CLSID 创建一个COM对象的实例 使用COM对象 退出COM库
Visual C++中调用COM组件的步骤
//初始化COM库 HRESULT hr; hr = CoInitalize(NULL); if(FAILED(hr)) { return false; } //退出COM库 CoUninitialize();
VC调用*.m编译后的动态链接库
简单代码
mxArray *pArrayIn = NULL; mxArray *pArrayOut = NULL; pArrayIn = mxCreateDoubleMatrix(1,1,mxREAL); *(mxGetPr(pArrayIn)) = 10*(0.3+0.7*rand()*1.0/RAND_MAX); mlfSincplot(1,&pArrayOut,pArrayIn); mxDestroyArray(pArrayIn); mxDestroyArray(pArrayOut);
COM简单介绍
COM组件概述 COM是Component Object Model (组件对象模型)的缩写
由于COM是建立在二进制级别上的规范,所以组件对象之间的交互规 范不依赖于任何特定的开发语言。COM用于不同语言的协作开发是非常方便的 COM开发框架是以组件为基础的,可以吧组件看做是用于”搭建“软件的积木块, 采用这种开发模式除了跨语言的特性以外,还可以带来很多好处,例如采用组件 替换可以使得软件系统的升级更新换代更加简单,可以在多个不同的软件开发应 用中重复利用组件开发不同的应用软件等。
Visual C++中调用COM组件的步骤
//得到COM库对象的CLSID
CLSID CLSID_MyInterface; HRESULT hr; hr = CLSIDFromProgID(L"Myinterfa ce.Myinterface1.0",&CLSID_M yinterface);
if(FAILD(hr)) { MessageBox("CLSIDFromPro gID调用失败"); return false; } //创建一个COM对象的实例 IMyInterface *pImyInterface; //IID_IMyInterface接口IMyInterfacede IID CoCreateInstance(CLSID_MyInte rface,NULL,CLSCTX_ALL,IID_ IMyInterface,(void**)&pIMyInte rface);
VC调用*.m编译后的动态链接库
函数调用: 1.在MATLAB当中,我们利用M文件来实现函数,每一个M文件实现一个单独的功 能,这一点和C语言当中的函数是相互对应的。 2.MATLAB所有的计算都是基于一种名为mxArray的数据结构之上的, 所有的浮点数、向量或者是矩阵在MATLAB当中都是通过mxArray结构来进行存 储和传递的。当然,MATLAB所提供的所有数学函数也都是基于这样一种数据结 构进行运算的。所以,要使用MATLAB的生成代码,就必须将C语言当中常用的 浮点数和整数转换为mxArray结构。
VC调用*.m编译后的动态链接库
编译Matlab *.m文件
通过matlab编译器的mcc命令,可以将Matlab*.m文件直接编译为动态链接 库供Visual C++调用。以下面函数为例,采用mcc -B cssharedlib:libsincplot sincplot.m 将其编译为动态链接库,生成文件列表如图所示 %sincplot.m文件 function[y]=sincplot(n); x1=0.01:0.01:n*pi; y1=sin(x1)./x1; x2=-n*pi:0.01:-0.01; y2=sin(x2)./x2; y=[y2 y1]; plot([x2 x1],y);
COM在Windows平台下的实现方式
COM最早应用在OLE中,由于COM开发模型特有的优点, 现在COM组件已经渗透到了Windows的各个角落,为人熟 知的DriectX多媒体开发包就建立在COM组件技术之上。COM 在Windows平台上以动态链接库的形式存在。采用动态链接 库可以由COM组件客户决定什么时候加载所需要的COM组件 由于COM组件多种多样,为了区别众多的COM组件。COM 规范采用了128位长度的常量来标识COM组件。 typedef struct_GUID{ DWORD Data1; WORD Data2; WORD Data3; BYTE Data4[8]; }GUID;
混编新特点
• MCR的启动时间和Matlab程序启动时间相 同,在混编中应当考虑到这一点。 • 由于采用了MCR执行Matlab程序而不是将 Matlab程序编译为C/C++程序,Matlab函数 和工具箱中可编译的部分大大增加,为用 户提供了方便。
matlab调用C/C++程序
•Matlab调用C/C++程序通过将其编译为MEX文件来实现。
Dot
编译器配置&使用
如果使用Matlab DotnetBuilder以前还没有配置Matlab C/C++编译器的话,需 要首先运行: >>mbuild -setup 然后配置Matlab C/C++编译器 使用 Matlab DotnetBuilder: D:\3D仿真系统项目组\Vs2005与matlab2007a混编基本步骤与环境配置.doc
使用MATLAB引擎
简单程序
Engine *m_ep; char m_outbuff[_MAX_BUFF_CHAR_NUM]; m_ep = engOpen(NULL); engOutputBuffer(m_ep,m_outbuff,_MAX_BUFF_CHAR_NUM); engEvalString(m_ep,"x1 = 123456"); engEvalString(m_ep,"x2 = 654321"); engEvalString(m_ep,"y = x1 + x2"); cout<<m_outbuff; engClose(m_ep); m_ep = NULL;
HRESULT 类型
错误的做法 正确的做法
...... HRESULT hr; hr = IMyInterface ->Myfun(...); if(hr == E_FALL) { return; }
........ HRESULT hr; hr = IMyInterface->MyFun(..) if(FALED(hr)) { return; }
浅谈Matlab与Vc混编技术
放大器组 作者:王 刚
为什么需要混编?
背景简介:
Matlab 是由Math Works 公司于1984 年推出的数值计算及图形处理软件, 可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处 理、图像处理等若干领域的计算和图形显示功能。其中,控制系统工具箱 的集成为设计和分析各种复杂的控制系统提供了有效的方法和途径。 但是,由于Matlab开发平台的局限性,在其上面开发的程序不能脱离Matlab 运行环境,因而在处理一些实际应用问题时显得灵活性不足,而VC++则在 一定程度上能够弥补这一漏洞,因此,现将二者结合共用,各献其长,可以 为科研工作和工程开发提供了更为强大的技术支持。
用matlab生成COM组件 matcom && VC++
使用MATLAB引擎
API函数介绍
1.int engClose(Engine * ep); 2.int engEvalString(Engine *ep,const char * name); 3.mxArray * engGetVariable(Engine *ep,const char* name); 4.int engGetVisible(Engine *ep,bool *value); 5.Engine *engOpen(const char *startcmd); 6.Engine *engOpenSingleUse(const char *sartcmd,void*dcom,int *retstatus); 7.int engOutputBuffer(Engine *ep,char *p,int n); 8.int engPutVariable(Engine *ep,const char*name,const mxArray *mp); 9.int engSetVisble(Engine *ep,bool value);
MCR ?
• • • • Matlab Component Runtime 时间:matlab 7.0 以后 作用:执行生成matlab接口文件 好处:可以在没有安装matlab的电 脑上运行
混编新特点
• matlab程序在MCR环境下与在Matlab环境 下执行效率相同,因此通过编译Matlab程 序不会提高Matlab程序的效率。 • 由于Matlab编译器只生成Matlab接口文件 ,而MCR接口文件一般会采用兼容设计, 因此,与matlab6.5及以前版本的软件相比 ,用户开发C/C++混合程序时的复杂度降低 ,可继承性提高。
相关文档
最新文档