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

合集下载

Matlab与Fortran的混合编程及其应用

Matlab与Fortran的混合编程及其应用
第 25 卷 第 1 期 2 00 5 年 1 月
桂 林 工 学 院 学 报
JOURNA L OF GU IL I N UN I V ERS I TY O F TECHNOLOGY
V o.l 25 N o . 1 Jan 2005
文章编号: 1006- 544X ( 2005) 01- 0076- 05
Matlab与 Fortran的混合编程及其应用

( 1 中国地质大学 地球物理与空间信息学院, 武汉

1 ,2
430074 ; 2 桂林工学院 电子与计算机系 , 广西 桂林
541004)
摘 要 : 介绍和分析了 M atlab与 Fortran混合编程的两种方式 , 即利用 M ex文件和利用 M atlab 引擎; 给出了其具体实现方法 , 并讨论了各自的优缺点和适用情况; 给出了一个物探数据可 视化的应用实例. 分析和实验结果表明: 通过 M atlab与 Fortran混合编程, 不仅可以利用 M at lab强大的图形功能和丰富的工程计算函数, 还能发挥 Fortran数值运算高效的特点和利用其原 有的大量程序资源 , 从而使编程更为灵活、高效. 如 Fortran程序中有大量交互输入, 宜采用 M atlab引擎混合编程方式; 如 Fortran中要调用的 M atlab函数较多 , 则应考虑采用 M ex 文件混 合编程 . 关键词 : M atlab; Fortran; 混合编程; 接口 中图分类号 : TP311 文献标识码 : Ay
c 给输出矩阵命名, 即 M atlab中名为 T callm xSet N am e( T, T ) c 将数组 tm i e复制到输出矩阵 T callm xCopyReal8T oPtr( tm i e , m xG etP r( T), 10 ) c 将输出矩阵写入 M atlab工作空间 call engPuM t atrix( ep , T) c 调用 M atlab函数 call engEvalString( ep, D= 5 * ( - 9 8) * T ^2 ; ) call engEvalString( ep, p lot( T, D); ) call engEvalString( ep, title( Position vs . Tm i e) ) call engEvalString( ep, x label( T m i e ( seconds) ) ) call engEvalString( ep, ylabel( Position ( m eters) ) ) c 暂停, 以便看显示的图形, 按任意键继续 read( * , * ) call engEvalString( ep, close ; ) 从工作空间获取结果矩阵 D = engGeM t atrix( ep , D ) c 将结果矩阵复制到数组 d ist callm xCopyP tr T oReal8( m xG etPr( D) , d is, t 10) c 进行后续处理 prin t* , M atlab com pu ted the follow ing d istances : prin t* , tm i e( s) distance( m ) do 10 i= 1, 10 c 显示结果 prin t* , tm i e( i) , d ist( i) 10 con tinue callm xFree M atrix( T) callm xFree M atrix( D) call engC lose( ep) stop end

第15章MATLAB与其他编程语言结合

第15章MATLAB与其他编程语言结合

第15章MATLAB与其他编程语言结合第1 5章M A T L A B与其他编程语言结合M AT L A B可以和其他编程语言一起使用,可以调用 F O RT R A N或C程序。

反过来F O R T R A N或C也可以调用M A T L A B程序。

这样,快速的编译程序就可以利用M A T L A B中强大的矩阵或图形命令,通过编写部分的C或F O R T R A N程序,并进行编译,就可以避免M A L TA B 程序的瓶颈现象。

M A T L A B还可以结合使用其他的应用程序,如Microsoft Word for Wi n d o w s。

这将在本章的最后一节讨论,这主要取决于计算机的系统和安装的应用程序。

15.1 介绍M A T L A B和F O R T R A N或CM A T L A B可以被F O R T R A N或C语言程序调用,它也可以调用F O R T R A N或C语言程序。

如果M A T L A B程序运行速度很慢,后者对此很有用。

因为M A T L A B是一个解释性语言,所以当运行程序时就是解释它的命令。

这样有时会导致程序的运行速度很慢,如f o r- l o o p s循环。

在F O RTRAN 77和C中可以使用M AT L A B库,也可以用F O RTRAN 90或C++对它们进行链接。

除非特别需要,一般不推荐编写F O R T R A N或C程序。

M A T L A B的优点在于可以用高级的形式描述出操作,而程序员不必担心循环的次数和一些其他细节问题。

被M A T L A B调用的程序必须在编译后转换成M E X文件,这样才能被M A T L A B调用。

在编译时它们和M文件一样使用。

在2 .8节中讲到了由M A T L A B创建的二进制文件。

它们是以M A T文件形式被调用的,在C 或F O R T R A N语言的库中有用来读和写二进制文件的程序。

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是⼀个可执⾏的⼆进制⽂件。

VC和MATlAB混编(笔记)

VC和MATlAB混编(笔记)

基于COM的VC/MATLAB混合编程方法Matlab是一种脚本语言,程序运行效率低下,而且不能脱离Matlab软件环境,不能直接用于商用软件的开发。

VC具有代码效率高,执行速度快等优点,但是自身提供的数学函数相对较少,当遇到复杂的数值运算时,编写复杂的程序代码将大幅度延长软件开发周期。

VC++由于其丰富得人机界面,高效的执行效率已经成为基于Windows平台下开发商业软件的必备工具。

然而,VC++对于复杂的数值运算就有点“力不从心”了。

因此,混编可以充分发挥出各自的有点,开发出更加好用的软件。

VC和Matlab的混合编程有多种方法:①Matlab engine方法②直接调用Matlab的C/C++数学函数库③用Matlab自带的Matlab Compiler④使用Matcom工具(可脱离Matlab软件环境)⑤使用Matlab的combuilder工具生产COM组件(可脱离Matlab软件环境)1、基于COM的VC/MATLAB混合编程方法自Matlab6.5版本开始,新推出来的Combuilder支持把用Matlab编写的程序做成com 组件,供其他语言调用。

该方法实现简单,通用性强,成为VC与Matlab混合编程最有效的方法。

COM是component object module的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现调用它。

Matlab6.5新推出来的Combuilder就是把用Matlab 编写的程序做成com组件,供其他语言调用。

该方法实现简单,通用性强,而且几乎可以使用Matlab的任何函数(注重:不支持脚本文件,脚本文件使用时要改为函数文件),因此在程序较大、调用工具箱函数或调用函数较多时推荐使用,这也是Matlab公司推荐的使用方法。

例:基于COM的MATLAB与VC混编示例1、打开matlab新建一个M文件,这里采用与上例相同的函数,注意:不能是脚本文件。

matlab和fortran混合编程

matlab和fortran混合编程

matlab和fortran混合编程matlab2016b+vs2010+ivf2013+f90其实默认是f77语法,但通过配置可以改变为⾃由格式。

默认只能f77代码,怎样修改:找到:mex_FORTRAN_win64,删掉fixed就可以⽤f90了。

⼤体过程:1.在matlab中配置fortran编译环境: mex -setup FORTRAN2.写好源代码,⾃定义⼦函数仍可以像往常⼀样调⽤别的⼦函数3.将matlab当前路径调整到当前源代码⽂档所在路径4.在matlab命令⾏输⼊编译命令:mex csuherror.f905.像使⽤matlab内置函数⼀样使⽤此函数,error=csuherror(X),其中X为csuh的9个参数(包括C),输出的为计算误差6.若需要调试,需要这样编译:mex -g csuherror.f90 ,之后通过vs附加matlab到进程,并打开源代码加断点,在matlab运⾏时就可以调试了,具体请参考帮助⽂档。

下⾯是⼀个例⼦:先写fortran代码:传⼊⼀个数组和⼀个数字,输出⼀个数组Add.f90 ,注意此⽂档名为将来matlab调⽤的函数名,调⽤函数名时与其内的⼦函数名称Add⽆关。

1 #include "fintrf.h" !必须有的头⽂件,⾥⾯有mxGetPr, mxGetM, mxGetN,mxCreateDoubleMatrix等函数的申明 /post/1d001431_ab72071234 subroutine mexFunction(OutSum,OutVar,InSum,InVar)!函数接⼝名称必须为mexFunction,567 !OutSum:输出参数个数8910 !OutVar:输出参数数组指针111213 !InSum:输⼊参数个数141516 !InVar:输⼊参数数组指针171819 !参数顺序不能随意更改20 Integer InSum,OutSum212223 mwPointer InVar(*),OutVar(*) !mwPointer专门⽤于表⽰指针变量,这个不能随意⽤Integer代替2426 mwPointer mxGetPr, mxGetM, mxGetN,mxCreateDoubleMatrix !这个对返回指针函数的再次申明,27 integer, parameter :: fp = selected_real_kind(15,300)28 Integer , parameter :: myINT = SELECTED_INT_KIND( 8 )293031 Real(fp),Allocatable::x(:,:),y(:,:)32 real(fp)::z333435 Integer m,n363738394041 If(InSum/=2)Then424344 call mexErrMsgIdAndTxt('MATLAB:InputTooBig','输⼊参数个数必须为2个')454647 Return484950 EndIf515253545556 m=mxGetM(InVar(1))!获取第1个输⼊参数的⾏数575859 n=mxGetN(InVar(1))!获取第1个输⼊参数的列数606162 Allocate(x(m,n),y(m,n))636465 Call mxCopyPtrToReal8(mxGetPr(InVar(1)),x,m*n)!将第1个参数数组赋值给x变量666768 Call mxCopyPtrToReal8(mxGetPr(InVar(2)),z,1)!将第2个整数变量赋值给z6970717273 Call Add(x,y,z,m,n)!调⽤内部函数747576777879 OutVar(1)=mxCreateDoubleMatrix(m,n,0)!给返回参数分配内存808182 Call mxCopyReal8ToPtr(y,mxGetPr(OutVar(1)),m*n)!将返回参数赋值给分配的内存838485868788 DeAllocate(x,y)!释放临时分配的内存899091 Return929394 End SubRoutine9596979899 ! SubRoutine Add(x,y,z,m,n)100 !101 ! Integer,Intent(In)::m,n102 ! integer, parameter :: fp = selected_real_kind(15,300)103 !104 ! Real(fp),Intent(In)::x(m,n),z105 !106 ! Real(fp),Intent(Out)::y(m,n)107 !108 ! Integer i,j109 !110 ! Do i=1,m111 !112 ! Do j=1,n113 !114 ! y(i,j)=x(i,j)+z115 !116 ! EndDo117 !118 ! EndDo119 !120 ! Return121 !122 !End SubRoutine124 SubRoutine Add(x,y,z,m,n)125126127 Integer,Intent(In)::m,n128 integer, parameter :: fp = selected_real_kind(15,300)129130131 Real(fp),Intent(In)::x(m,n),z132133134 Real(fp),Intent(Out)::y(m,n)135136137 Integer i,j138139140 Do i=1,m141142143 Do j=1,n144145146 y(i,j)=x(i,j)+z147148149 EndDo150151152 EndDo153154155 Return156157158 End SubRoutine将matlab当前路径改为Add.f90同⽬录路径,然后: mex Add.f90 ,之后会⽣成Add.mex64在matlab命令⾏窗⼝输⼊:x=[1 2 3];a=2;y=Add(x,a)---我把Add.f90改为multiple.f90的话:效果⼀样。

MATLAB与C的混合编程

MATLAB与C的混合编程

编号学士学位论文MATLAB与C的混合编程学生姓名:学号:系部:专业:电子信息科学与技术年级:指导教师:完成日期:年月日中文摘要对MATLAB与C语言进行混合编程的常用方法(MAT文件、MEX文件、MATLAB计算引擎、MATLAB编译器、MCC和MATCOM)进行了介绍,分析了其实现方法和各自的利弊。

通过MAT文件实现与其它编程环境的数据交换,通过MEX文件实现在MATLAB环境中调用其它语言编写的程序,通过MATLAB引擎实现其它编程环境中使用MATLAB的计算功能,通过MATCOM 技术将MATLAB的源代码译成同等功能的C源代码。

并用实例对MEX文件实现方式进行了较详细的论述。

通过混合编程,利用了C语言高效的特点,在发挥MATLAB强大的计算功能的同时,又弥补其执行速度慢的缺点。

关键词:MATLAB;C;MAT文件;MEX文件;MATLAB计算引擎;MATLAB编译器;MCC和MATCOM;混合编程Mixed programming technology for MATLAB withCAbstractOn MATLAB and C language common methods of mixing programming(MAT files,documents and MATLAB calculation engine MEX MATLAB,the compiler, MCC and MATCOM)are introduced,analyzes its implementation method and their respective advantages and disadvantages.Through the MAT files realization and other programming environment,through the data exchange MEX files in the MATLAB environment of realizing invoke other language program,through OnIMATLAB and C language common methods of mixing programming(MAT files, documents and MATLAB calculation engine MEX MATLAB,the compiler,MCC and MATCOM)are introduced,analyzes its implementation method and their respective advantages and disadvantages.Through the MAT files realization and other programming environment,through the data exchange MEX files in the MATLAB environment of realizing invoke other language program,throughKey words:MATLAB;C;MAT files;MEX files;MATLAB calculation engine;MATLAB Compiler;MCC and MATCOM;Mixed programming technologyII目录中文摘要 (I)ABSTRACT (I)引言 (1)1.MATLAB (1)1.1MATLAB简介 (1)1.2MATLAB的语言特点 (1)2.C语言 (3)2.1C语言简介 (3)2.2C语言特点 (4)3.混合编程的实现方式 (4)3.1MAT文件 (5)3.2MEX文件 (8)3.3MATLAB计算引擎 (11)3.4MATLAB编译器 (13)3.5MCC (13)3.6MATCOM (16)4.C语言MEX文件的实现 (17)4.1C语言MEX文件的编写 (17)4.2编译器的配置 (20)4.3C语言MEX文件的编译 (20)4.4举例说明C的.............................................MEX源程序的编写和调用过程205.结语 (24)参考文献 (26)III致谢 (28)IV引言MATLAB语言具有功能强大、开发效率高等诸多优点,已在工程实际中得到广泛应用,但是与C语言相比,其执行效率较低,特别是当程序中含有大量循环语句(例如迭代计算)时,MATLAB就有些力不从心,速度很慢,而运用擅长数值计算语言进行编程,气运行效率高。

Matlab与C_C_语言混合编程的几种方法

Matlab与C_C_语言混合编程的几种方法

" 嵌 入 1.. 生 成 的 文 件
在 !"#$"% 下 用 下 面 格 式 的 命 令 生 成 .99 文 件 , 假 定 要 编 译 的 函 数 名 为 Z75.#6?5[L"12 : 1..>#>T *99 Z75.#6?5[L"12 得到: Z75.#6?5[L"12’;99 , Z75.#6?5[L"12’.99 将 Z75.#6?5[L"12’.99 加 入 项 目 , 不做任何改动。 最 后 进行编 译 就 可 以 了 。
!
结束语
在 !"#$%!& 数 据 库 中 , 对 象 泛 指 库 中 所 有 组 成 部
分 。’(! 通 过 对 象 属 性 值 的 存取或 调 用 对 象 的 方 法 , 可以 对 所 有 对 象 进 行 管 理 。 块 表 是 一 个 集 合 对 象 )(*$+,-. , 调 用 其 !// 方 法 可 以 定 义 0 个 块 。 调 用 1$/2*345+2 对 象
能 很 强 , 使 用 它 可 以 用 类 似 15#*5C 的 语 法 编 写 % << 程 序, 十 分 方 便 。 虽 然 速 度 上 仍 然 比 普 通 的 % K %<< 程 序 慢 , 但 由 此 换 来 的 高开 发 效 率 和 可 靠 性 往 往 是 值 得 的 。 在 ’% 的 集 成 开 发 环 境 里 使 用 15#*5C , 可 以 利 用
$6%11H6$2’$6%
$6%1..’$6%
$6%V
656#!:!OP*S![)\_DISL< ; F F 初 始 化 !"#.?1 进 程 !1 3‘=‘. ; F F 定义变量, !1 为 !"#.?1 的 矩 阵 类 3 a.?$?5:-‘-‘-‘-@‘@-< ; F F 类 似 H?4 循 环 语 句 = a=65:3< ; F F 正弦函数 . a.?=:3< ; F F 余弦函数 9 $?#::*T:3<‘.‘3‘=<< ; F F 画出正弦和余弦函数 2 36#!: < ; F F 退 出 !"#.?1 进 程 b

VC和matlab混合编程画图实践

VC和matlab混合编程画图实践

VC和Matlab混合编程画图实践2013-03-14【摘要】在DSP软件开发中,基于代码的可移植性的需要,首先要基于VC平台开发出纯C定点版本。

为了对定点代码的精度和性能进行充分测试,需要对其进行定点仿真并与浮点的性能比较。

浮点代码的性能可以很容易的通过Matlab仿真得到,但由于VC与Matlab对仿真结果的保存形式不同,比对结果的过程需要人为完成。

并且VC对定点仿真的结果保存为文本形式,不够直观。

当仿真或测试条目较多时,这一过程将变得重复而繁琐,因此为了将这一过程变得更自动化、更直观,本实践介绍了一种利用VC调用Matlab动态链接库的方法,通过VC直接调用Matlab的方法进行画图,能够更直观、更方便的分析定浮点仿真结果的差异。

【关键词】Matlab Engine动态链接库VC定点仿真Matlab画图一、问题的提出在VC平台软件开发中,需要对实现的定点代码进行定点仿真,观测最后的BER曲线,并与浮点的结果做对比,观察其性能差异。

然而,VC平台的仿真结果只是保存在数组中的结果,不能直观的展示给测试人员,仍需人为的提取分析,这样便造成重复劳动和时间上的浪费,因此需要寻找一种简单易行的方法,实现将VC的仿真结果画图呈现出来。

二、解决思路Matlab作为数据仿真分析的工具十分强大,其包含了非常丰富的数学运算库和与外部工具的接口,众所周知,利用Matlab画图是十分方便的,只需将仿真结果,外加画图的参数传递给Matlab的命令函数,就能非常方便的完成画图,简单易行。

Matlab与VC的接口方式有很多种,如引擎的形式,COM 组件的形式,动态链接库的形式等等,因为动态链接库的形式在之前的实践中已经研究过,并且相对成熟,因此本实践将着重介绍将Matlab的函数编译成动态链接库供VC调用方法,对于引擎的和其他方式略做简单介绍。

三、实践情况3.1 工具与环境准备1)Matlab环境准备:本实践中采用的Matlab版本为R2011b。

MATLAB语言及其与C_C_的混合编程

MATLAB语言及其与C_C_的混合编程

] 其中: 5G+0 、 5.+0 为 整 型 D65*I , 分 别 用 来 指 明 返 回 变
《微型机与应用》 !""" 年第 ## 期
软件天地
量、 入口变量的个数; $%&’ () 、 $*&’ () 为 +,-**./ 型 指 针 数 组, 分别指向返回变量、 入口变量的地址。这些参数是用 来 传 递 0-12-3 启 动 045 文 件 的 参 数 。按 0-12-3 的 语法规则, 函 数 调 用 的 一 般 形 式 是 (6 , 7 … )896:;, , /, <…=, 这 里 96: 是 045 文 件 名 或 0 ;0-12-3 内 部 函 数 = 文 件 名, 三连点表示参数个数是任意的, 变 量 ,、 /、 < 等称为输 入变量, 而 6、 7 称为输出变量。 例 如 : 如 果 要 调 用 # 个 名 为 96: 的 045 文 件 , 在 随后, 0-12-3 环 境 中 其 命 令 形 式 为 (6 , 7) 896: ;, , /, <= ,
和 链 接 器 链 接 而 生 成 的 动 态 链 接 子 程 序 。 $3T 源 代 码 由 二部分组成: 第一部分称为入口子程序; 第二部分称为计 算 功 能 子 程 序 。 入 口 子 程 序 的 功 能 是 在 $%&’%( 系 统 与 被调用的外部子程序之间建立通信联系。它定义被 定 义 $%&’%( 系 $%&’%( 调 用 的 外 部 子 程 序 入 口 地 址 , 统向子程序传递的子程序参数,还定义了子程序向
由其分析数据, 并画出结果 \ O O \ 发 送 数 据 到 0-12-3 ,
B:A +.B:;= ] 4:SB:> \>$ ; +,-**./ \18GH22M , VC6Z%> AB+>(#")8]"L" , #L" , !L" , DL" , ^L" , _L" , ‘L" , aL" , bL" , cL"d ; B9 ; ! ;>$8>:SJ$>:;[e"[=== ] [e:N.:fA ’A.*A 0-12-3 >:SB:>e:[= ; 9$*B:A9;’AV>** , *>A6*: 45R1g?-R2Hh4 ; d

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与VC混合编程

Matlab与VC混合编程

浅析VC与matlab接口编程(一)作者:孙科QQ:44760299邮箱:c_dinco@Matcom是mathTools公司推出的一个能将M文件转化成相同功能C++代码的工具。

相比Matlab自带的编译器Compiler,用Matcom转化代码要简单和方便得多。

本文将结合作者编程经验,以VC6.0和Matcom为例,详细介绍如何利用Matcom进行VC与Matlab的联合编程。

Matcom安装安装Matcom前要已求安装VC6.0。

在安装过程中出现选择编译器对话框,选择“是”(图一)。

出现选择是否安装Matlab时,选“否”。

其他选项采用默认设置。

Matcom可以独立于Matlab运行,但需要外部的C++编译器,指定Matlab的位置是为了让编译文件中需要的一些系统函数找到路径用的。

图一安装完成后,启动界面MIDEVA(图二)。

MIDEVA集成开发环境包括命令行窗口、变量列表窗口、命令列表窗口和编译链接信息窗口等几部分,并有详细的帮助文档。

图二Matcom命令输入方法与Matlab相同。

如果安装在中文版操作系统时,输入命令前加一空格。

(如图三)。

图三下面详细介绍如何将m文件编译后放入VC中。

1、启动MIDEVA ,File->New,新建如下Test1.m文件:x=1:0.1:10; y=sin(x); plot(x,y);将文件保存(如图四)。

图四m文件保存的默认位置为:matcom安装目录\matcom45,生成的C++文件保存的默认位置为:matcom安装目录\matcom45\Debug\,本例matcom安装目录为C盘即 C:\matcom45\Debug\,在该目录下将会产生Test1.h、Test1.cpp、Test1.r 、Test1.obj文件。

2、在VC中用MFC Wizard(exe)创建一个基于对话框名为Example的工程。

在面板上添加一个ID为IDC_BUTTON1按扭。

vc和matlab的混合编程-Silence的日志-网易博客

vc和matlab的混合编程-Silence的日志-网易博客

vc和matlab的混合编程-Silence的日志-网易博客vc和matlab的混合编程技术 2008-10-29 23:14:29 阅读60 评论0 字号:大小订阅matlab真的是一个好东西,它的介绍我就不说啦,自己google 去,matlab在数学处理、数字图像方面的研究有很好的应用,只是他在与其他例如vc,vb,java的接合上显得比较的困难,似乎大家都在探讨这方面的问题,经过这些天的猛看猛试验,最终在matlab的COM接合上实现突破,并且正如matlab推荐的那样,真的非常的方便和通用,几乎可以处理所有的函数,包括图形图像的处理函数。

一般来说,vc调用matlab混合编程有以下几个途径:一、通过Matlab Engine方式Matlab Engine是指一组Matlab提供的接口函数,支持C语言, Matlab Engine采用C/S(客户机/服务器)模式,Matlab作为后台服务器,而C程序作为前台客户机,通过Windows的动态控件与服务器通信,向Matlab Engine传递命令和数据信息,从Matlab Engine接受数据信息。

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

采用这种方法几乎能利用Matlab全部功能,但是需要在机器上安装Matlab软件,而且执行效率低,因此在实际应用中不采用这种方法,在软件开发中也不可行,我认为适合个人使用或做演示用,因此不打算介绍。

二、直接调用Matlab的C/C++数学函数库Matlab中提供了可以供C/C++语言调用的C/C++数学函数库,其中包含了大量用C\C++语言重新编写的Matlab数学函数,这些函数涉及到线形代数、数值分析、傅立叶变换、多项式计算、解微分方程等,并且函数库中提供了大量各种矩阵操作函数,在VC中可以直接使用这些函数,通过这些函数可以在VC中方便的实现在Matlab中矩阵运算功能。

MATLAB与C语言混合使用

MATLAB与C语言混合使用

MATLAB与C语言混用包括两个方面,即在MA TLAB平台上调用C语言资源,以及在C 语言的平台上调用MATLAB资源。

在MA TLAB平台上使用mex命令将C语言文件编译成MEX文件形式的共享库,以便MATLAB调用,C MEX型S-函数就是在MA TLAB平台上调用C语言资源的例子。

下面通过实例介绍在C语言平台上如何调用MATLAB资源。

首先,建立两个MA TLAB函数,分别实现计算和显示功能。

实现计算功能函数的内容如下:function y=mysum(x)y=sum(1:x);实现显示功能函数的内容如下:function mydisplay(x)disp(x);其次,建立C语言文件,其具体内容如下并保存为mysump.c#include<stdio.h>#include<math.h>#include"libmysum.h"main(int argc,char **argv){mxArray *N;mxArray *R=NULL;int n;n=5;mclInitializeApplication(NULL,0);libmysumInitialize();N=mxCreateDoubleScalar(n);mlfMysum(1,&R,N);mlfMydisplay(R);mxDestroyArray(N);mxDestroyArray(R);libmysumTerminate();mclTerminateApplication();}由于编译过程不支持中文注释,下面还是以程序的形式解释语句的含义:见mysump注释.c文件。

编译:mcc -W lib:libmysum -T link:exe mysum mydisplay mysump.c运行:mysum。

Matlab与CC++混合编程Matlab调用C函数

Matlab与CC++混合编程Matlab调用C函数

Matlab与CC++混合编程Matlab调⽤C函数Matlab与C/C++混合编程有很多种⽅式,分别适⽤于不同的情况。

1. 程序主体⽤Matlab编写,有⼀些特别耗时的函数⽤C/C++改写来提⾼效率,或者已经有现成的C/C++函数,应⽤到Matlab程序中(本⽂属于这种情况)2. 程序主体⽤C/C++编写,部分程序想调⽤Matlab函数减少开发时间,本⽂不涉及这种情况,建议读者⾃⾏查阅Matlab帮助⽂档⼀点点废话Matlab有着⾮常详细的帮助⽂档,建议直接阅读其帮助⽂档,市⾯上很多Matlab书籍都是简单的翻译翻译帮助⽂档,例⼦都是照抄,还有很多错误和断章取义的地⽅,参考这样的书籍容易被带上弯路。

打开Matlab,按F1打开帮助,此部分内容在:MATLAB->Advanced Software Development->MATALB API for Other Languages什么是MEX-file简单来说MEX-file是⼀种预编译的,⽤其他语⾔(C/C++,Fortran)编写的函数库,可以直接被Matlab调⽤。

正如前⾯提到的,这种⽅式适⽤于两种情况:1. 程序中有⼀部分代码耗时巨⼤,想通过改写这部分函数提⾼速度2. 已经有⼤量C/C++或Fortran的函数库,想直接⽤Matlab调⽤,避免重复开发这两种情况⽤MEX-file的这种⽅案来解决都是⾮常合适的,因为这种调⽤⽅式⾮常⽅便,你需要注意地只是数据结构的转换。

这种⽅式⽀持C/C++和Fortran,本⽂主要将C/C++。

如何创建可供Matlab直接调⽤的MEX-file1.安装Matlab⽀持的编译器在Matlab命令窗⼝输⼊:mex -setup如果你的电脑已经安装了Matlab⽀持的编译器,这时候你应该会看到设置编译器的提⽰命令,跟着⼀步步下去就可以了。

注意:如果你电脑只安装了⼀个⽀持的编译器,这⼀步会⾃动⽤此编译器进⾏配置,如果有多个⽀持的编译器,Matlab会引导你选择要使⽤哪个编译器。

Fortran和Matlab混合编程简介

Fortran和Matlab混合编程简介
Fortran和Matlab 混合编程简介
陆华剑 2003年7月23日
内容
一 Fortan和Matlab优缺点比较
二 Fortran和Matlab混合编程的两种基本方式 (1)Fortran和Matlab编程比较 (2)Fortran调用Matlab命令 (3)Matlab调用Fortran程序 三 参考资料
一 Fortan和Matlab优缺点比较
(从数值计算角度) 程序 优点 缺点 计算结果不能直 接可视化
Fortran
计算速度快
语言简洁,函数 丰富,调试容易, Matlab 计算结果可以方 便地实现可视化
计算速度慢
Fortran+Matlab
优点
.计算速度快 (Fortran) .计算结果可视化 (Matlab)
二Fortran和Matlab混合编程的两种基本方式 (1)Fortran和Matlab编程比较 (2)Fortran调用Matlab命令 (3)Matlab调用Fortran程序 三参考资料
三 参考资料
1)《Fortran95程序设计》 彭国伦 编著, 中国电力出版社 2)《matlab 5.x入门与提高》 龚剑 朱亮 编著,清华大学出版社 3)Matlab联机帮助文件
Fortran Engine Functions
integer*4 function engOpen(startcmd) integer*4 ep character*(*) startcmd integer*4 function engClose(ep) integer*4 ep integer*4 function engPutVariable(ep, mp) integer*4 ep, mp integer*4 function engGetVariable(ep, name) integer*4 ep character*(*) nam integer*4 function engEvalString(ep, command) integer*4 ep

Matlab和C语言混合编程,包含目录的设定

Matlab和C语言混合编程,包含目录的设定

Matlab和C语⾔混合编程,包含⽬录的设定
如果.c⽂件不依赖于任何第三⽅库,那么mex编译很简单,只需要在matlab的命令⾏输⼊
mex test.c 即可。

但是如果这个c⽂件使⽤了第三⽅库⽂件,如opencv、gsl等等,那么就需要更改⼀下mex的编译选项,否则会报fetal error C1083,找不到包括⽂件。

这⾥需要注意的是,在mex之前,需要使⽤ mex -setup 选择编译器,假如我选的是VS2012,那么我需要把相应的选项加到VS2012所对应的opt⽂件中,具体的位置在
‘MATLAB路径\R2013a\bin\win64\mexopts’下⾯,
VS2012 对应的⽂件就是 msvc110opts.bat.
打开这个⽂件后,找到set INCLUDE= 和 set LIB= 两⾏,把所⽤到的库的inclue路径和lib路径分别添加到这两⾏后⾯就可以。

保存后,需要重新使⽤mex -setup选择编译器,使改动⽣效。

关于依赖库位置的设置⽅法,也许还有更好的⽅法,继续探索中。

MATLAB与VC混合编程.

MATLAB与VC混合编程.

MATLAB 与 VC 混合编程SCIE摘要:MATLAB 提供了很丰富的编程接口,可以通过这些接口使用其它语言来编写模块集成到 MATLAB 程序中,也可以在其它程序设计语言中调用 MATLAB 。

尽管如此,在某些情况下可能仍然不能满足某些特殊的要求, 本文从实际应用出发, 介绍了 MATLAB 与 VC 混合编程的一些方法。

需要特别说明的是:本文内容是针对MATLAB6.5和 VC6.0的,并不适应于其它版本的 MATLAB 。

关键词:混合编程 MATLAB VC 窗口嵌入一、 VC中使用编译得到的 C++源程序文件通过 MATLAB 的编译器我们可以将 m 代码编译为独立的可执行程序,从而达到脱离 MATLAB 、在未安装 MATLAB 的计算机上发布的目的。

但是这样做仍然不能满足如下要求: MATLAB设计的图形用户界面功能还不够强大,不支持表格、目录树以及分组单选按钮等控件;当在一个 GUI 中放置过多的控件时,速度会比较慢。

整个软件并不是以 MATLAB 为主开发的,需要把 MATLAB 编写的代码融合到软件主体中,而不是生成独立的程序。

需要修改 MALTAB 编译器自动生成的代码, 或在其中添加代码以实现特定的功能。

将 m 文件编译生成 C 或者 C ++代码,在 VC 中使用这些代码,就可以解决以上几个或者更多的问题。

在此之前,需要对 VC 的开发环境进行设置,添加MATLAB 的 Include 目录和 Library 目录,操作如下:启动 VC ,点击菜单 Tools-Options ,出现如下对话框:图表 1设置 Include 目录¾在 Show directories for下方的下拉框中选择 Include files,在 Directories 下方列表框的空白一行或者单击 Directories 右方的左起第一个按钮, 添加如下两个目录: $matlabroot\extern\include\cpp$matlabroot\extern\include¾在 Show directories for下方的下拉框中选择 Include files,在 Directories 下方列表框的空白一行或者单击 Directories 右方的左起第一个按钮, 添加如下两个目录: $matlabroot\extern\include\cpp$matlabroot\extern\include其中 $matlabroot为 MATLAB 的安装目录,如图表 2所示。

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++。

matlabcompiler与c语言混合编程

matlabcompiler与c语言混合编程

matlab compiler与c语言混合编程经过一个多月的努力,在老师的帮助和自己的琢磨之下,终于对vc与matlab的混合编程有所了解。

且举一例。

首先要在自己的matlab7.0上安装MEX和mBuilder,安装方法是在matlab命令窗口中输入mex-setup,按照一系列的步骤安装下去。

然后再在命令窗口中输入mbuilder-setup,同样的方法就可以安装mbuilder。

在matlab中打开一个空的m文件,向里面写下列代码,并将其保存为zhengtaifenbuhanshu.m:function y=zhengtaifenbuhanshu(x,u,d)%x为变量,u为均值,d为方差y=normcdf(x,u,d);我的目的是在c语言中可以调用matlab中的正态分布函数。

这个函数有三个输入参数,一个输出参数。

然后在matlab命令行中打入:mcc -l zhengtaifenbuhanshu.m -o dllnormcdf。

这样就生成c共享(动态)库文件。

其中zhengtaifenbuhanshu.m是要编译的m文件,最后编译的名称为dllnormcdf。

-o表示要编译成的名字,如果没有-o,则编译后生成的文件名是与第一个要编译的文件名一致,就是这里的zhengtaifenbuhanshu。

上面命令的作用是将zhengtaifenbuhanshu.m函数生成名字为dllnormcdf的c语言动态库。

注意编译的路径,如果zhengtaifenbuhanshu是你放在一个matlab中work的一个包中,那么matlab主窗口上面的Current Directory要选择好zhengtaifenbuhanshu.m这个m文件所在的地方。

按回车编译成功后,你会在编译的文件夹(默认的是work中)中看到多了几个生成的文件:dllnormcdf.cdllnormcdf.ctfdllnormcdf.dlldllnormcdf.expdllnormcdf.exportsdllnormcdf.hdllnormcdf.libdllnormcdf_mcc_component_data.c在生成的文件中,dllnormcdf.h文件是编译结果函数库的函数声明头文件,而dllnormcdf.lib文件是最终用户在编译自己的可执行应用程序所必须的库文件,dllnormcdf.dll 文件就是最终用户的可执行应用程序运行时所需要的动态库。

Matlab和Fortran的混合编程

Matlab和Fortran的混合编程
!程序段 2 X_temp=X P_temp=P J_temp=J JO_temp=JO rhs(1)=mxCreateFull(1,15,0) rhs(2)=mxCreateFull(1,20,0) rhs(3)=mxCreateFull(1,1,0) rhs(4)=mxCreateFull(1,1,0)
MexFunction 的作用分为两部分,将 Matlab 环境传入的参数转化为目标语言 的数据结构;调用目标语言的算法程序,并将返回值转化为 MxArray 数据,并 返回给 Matlab 环境。
Interface Fuction 是普通的目标语言函数格式,但是他的作用是如下两部分: 将目标语言的数据结构转化为 MxArray 数据;调用 Matlab 环境的算法程序,并 将返回值转化为目标语言的数据结构数据,并返回给计算程序。
Matlab 和 Fortran 的混合编程
1 概述 Matlab 的复数矩阵运算、符号运算、数据后处理等特点构成一个强大的数值
计算平台的基础。此外,巨大的并还在不断增加的数据分析算法库和各种应用工 具箱,扩展了该平台,开放的混合编程支持使其可以充分利用各种;从使用的角 度看,Matlab 语言考虑了工程应用的需要,融合了面向对象、函数式、动态语言 等的特点,编程十分简单,其交互界面友善,因此利用 Matlab 可以极其方便的 构建数字实验室。
类为转化后的变量,第三类为中间临时变量; 程序段 2 为参数有效性校核,当 Matlab 环境传入的参数不合法时,给出异
常,提高系统的稳定性; 程序段 3 将 Matlab 环境传入的 MxArray 变量转化为 Fortran 数据格式; 程序段 4 调用目标函数; 程序段 5 将目标函数生成的结果转化为 MxArray 数据结构,并返回给 Matlab
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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__。

相关文档
最新文档