许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  Matlab与Fortran交互(MEX)详解:常用函数及实例

Matlab与Fortran交互(MEX)详解:常用函数及实例

阅读数 8
点赞 0
article_banner

1. mexCallMATLAB

用于调用Matlab的内建函数、运算符,用户自定义的Matlab M文件以及MEX文件。

语法:integer*4

function mexCallMATLAB(nlhs,plhs,nrhs,prhs,name)

integer*4

nlhs,nrhs,plhs(*),prhs(*)

character* (*)

name

解析:它是一个函数子程序,其四个形式参数的含义分别为:

name为字符串类型,是用户希望执行的Matlab内建函数或其他一些文件和命令的名字。

nlhs为整数类型,是用户执行name所包含的命令时期望输出的参数的个数,系统规定nlhs不超过50。

plhs(*)为包含命令name输出参数内存地址的整数类型的数组,其中数组元素plhs(nlhs)包含了name第nlhs个输出参数的内存地址。

nrhs为整数类型,是用户期望执行的命令name的输入元素的个数,nrhs不超过50。

prhs(*)为包含命令name输入参数内存地址的整数类型的数组,其中数组元素prhs(nrhs)包含了name第nrhs个输入参数的内存地址。

如果mexCallMATLAB调用的命令正确执行,返回值为0;反之,返回值为非0。

以MATLAB里的disp函数为例:

INTEGER*4

::

rhs ! 声明输入指针 (如64位系统为INTEGER*8)

... ...

CALL

mexCallMATLAB(0,NULL(),1,rhs,'disp')

!NULL()

为FORTRAN

95添加的函数,会返回一个不能使用的内存地址

... ...

2. mexEvalString

用于输入一个表达式命令到Matlab工作环境中执行。

语法:integer*4

function mexEvalString (command)

character* (*)

command

解析:这个函数与函数mexCallMATLAB的功能大致相同,不同的是函数mexCallMATLAB不但可以用来执行Matlab命令,而且可以通过参数nlhs和plhs从Matlab环境中得到计算的结果,用于MEX文件的后续计算;而函数mexEvalString则没有这个功能,只能用于向Matlab发送计算指令,无法取得计算结果,且出现命令右侧的参数必须在当前的mex文件的工作空间中已经存在。

以MATLAB里的drawnow函数为例:

INTEGER*4

:: k

INTEGER*4

:: mexEvalString

... ...

k=mexEvalString('drawnow')

... ...

如果调用的MATLAB函数里有变量,如sum(x),以上功能同样适用,只应注意x为MATLAB工作区间里的变量,而不是Fortran程序里的变量。

3. mexGetFull

用于从Matlab工作空间中获得一个双精度类型阵列的全部数据,包括实部和虚部。

语法:integer*4

function mexGetFull (name,m,n,pr,pi)

integer*4

m,n,pr,pi

character* (*)

name

解析:其五个形式参数的含义分别为

name是一个字符串变量,为希望获取阵列的名字。

m为整型变量,为name代表的阵列的行向量数。

n为整型变量,为name代表的阵列的列向量数。

pr为整型变量,为name代表的阵列的实部数据的指针。

pi为整型变量,为name代表阵列的虚部数据的指针。

它为用户提供了一种直接从Matlab工作空间获得双精度类型阵列的方法,它通过mxArray结构体,将阵列的维数和数据指针存入变量m、n、pr和pi中,接下来可用API函数mxCopyPtrToReal8就可以获得变量pr、pi所存在内存地址的数据了。在阵列为实数类型时,变量pi中虚部数据的指针为0。

如果函数子程序mexGetFull成功执行,其返回值为0;反之,则为1。

这个函数目前还没有接触,例子暂无。

4. mxCalloc

动态分配内存

语法:integer*4

function mxCalloc (n,size)

integer*4

n,size

解析:通过函数mxCalloc,用户可以在Matlab接口应用程序中方便的完成动态内存分配任务。形参n指明了所分配的内存中存放元素的数量,而形参size则说明了每一个元素所占用的字节数,所以实际分配内存的字节数为n*size。

如果函数执行成功,将返回一个指向所分配内存起始字节地址的指针;如果函数执行失败,在mex文件中,函数将终止整个程序的运行,并将控制返回到Matlab命令提示符下。

函数Malloc的执行,将自动完成下面3个任务

分配足够的堆内存;将内存中所有n个元素初始化为0;在Matlab的内存自动管理机制中对分配的内存进行注册,以便于在程序结束时进行自动释放。

这个函数目前也还没有接触,例子暂无。

5. mxCopyPtrToReal8

将某个阵列的实数或虚数部分的数据复制到一个Fortran语言的实数类型的数组中

语法:subroutine mxCopyPtrToReal8 (px,y,n)

real*8

y(n)

integer*4

px,n

解析:函数mxCopyPtrToReal8在Matlab接口应用程序中可直接用call进行调用。通过它,用户可以将某个阵列的实数或虚数部分的数据复制到一个Fortran语言的实数类型的数组中,函数的三个形参的含义为

px为指向某个阵列的实数或虚数部分的数据的指针

y为一个Fortran语言的实数类型数组

n为希望复制的元素的个数

由于mxCopyPtrToReal8与mxCopyReal8ToPtr常配对使用,例子将放到mxCopyReal8ToPtr后。

6. mxCopyReal8ToPtr

将一个Fortran语言的实数类型数组中的数据复制到某个阵列的实数部分或虚数部分中。

语法:subroutine mxCopyReal8ToPtr (y,px,n)

real*8

y(n)

integer*4

px,n

解析:函数mxCopyReal8ToPtr在Matlab接口应用程序中可直接用call进行调用。通过它,用户可以将一个Fortran语言的实数类型数组中的数据复制到某个阵列的实数部分或虚数部分中,函数的三个形参的含义为

y为一个Fortran语言的实数类型数组

px为指向某个阵列的实数或虚数部分的数据的指针

n为希望复制的元素的个数

它与函数mxCopyPtrToReal8互为逆函数,它们的功能正好相反。

以timestwo这个函数为例:

#include "fintrf.h"

C======================================================================

#if 0

C C timestwo.F

C .F file needs to be preprocessed to generate .for equivalent

C #endif

C C timestwo.f

C

C Computational function that takes a scalar and doubles it.

C This is a MEX-file for MATLAB.

C Copyright 1984-2009 The MathWorks, Inc.

C 𝑅𝑒𝑣𝑖𝑠𝑖𝑜𝑛:1.12.2.8  Revision:1.12.2.8

C======================================================================

C Gateway routine

subroutine mexFunction(nlhs, plhs, nrhs, prhs)

C Declarations

implicit none

C mexFunction arguments:

mwPointer plhs(*), prhs(*)

integer nlhs, nrhs

C Function declarations:

mwPointer mxGetPr

mwPointer mxCreateDoubleMatrix

integer mxIsNumeric

mwSize mxGetM, mxGetN

C Pointers to input/output mxArrays:

mwPointer x_ptr, y_ptr,z_ptr

C Array information:

mwSize mrows, ncols, size

C Arguments for computational routine:

double precision,dimension(:,:),

allocatable :: x, y ,z

C-----------------------------------------------------------------------

C Check for proper number of arguments.

if(nrhs .ne. 2) then

call mexErrMsgIdAndTxt ('MATLAB:timestwo:nInput',

+ 'two input required.')

elseif(nlhs .gt. 1) then

call mexErrMsgIdAndTxt ('MATLAB:timestwo:nOutput',

+ 'Too many output arguments.')

endif

C Validate inputs

C Check that the input is a number.


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空