科学计算中如果需要同时用到fortran和matlab,通常为在MATLAB中调用Fortran。由于compact fortran和powerstation等编译器在win环境下陆续无法兼容,目前一般使用visual studio(vs)加intel visual fortran(ivf)的组合编译环境。网上讲解调用方法语焉不详,以下是我自己探索的方式。 1. 版本选择
64Win7环境下,房东蒋先生可行的一种搭配是visual studio 2012+ivf2013xe+matlab2013a,似乎可以将vs和ivf同时降2年,matlab如使用matlab2012等可能需要修改环境路径,百度。Win8环境中则不可以使用vs2010(我尚未成功过0_0)。
2. 安装次序
先安装vs,再安装ivf,建议最后安装matlab。如果没有其他需求,vs可以不安装除c++之外的可选功能,matlab也可以自选。
3. 调用过程
a) 首先,通过开始栏的ivf来打开matlab,即:开始,intel parallel studio xe 2013,command prompt,parallel ……XE,打开窗口命令,输入matlab b) Matlab中输入mex –setup,注意有空格。给出编译器选择Please choose your compiler for building external interface (MEX) files: Would you like mex to locate installed compilers [y]/n?日产总统型房车
选择n,然后可以自选配置,如
Select a compiler:
[1] Borland C++Builder version 6.0
[2] Borland C++Builder version 5.0
[3] Borland C++Builder version 4.0
[4] Borland C++Builder version 3.0
……
这里输入数字,选择ivf2013(with visual C++ 2012 linker)
c) 弹出如下选择:
Your machine has a Digital Visual Fortran compiler located at
C:\Program Files\……. Do you want to use this compiler [y]/n?
选择n
自行到位置,方法是打开开始,intel parallel studio xe 2013,intel compiler xe,using VS2012,右键之,打开文件位置,复制即得到地址。 d) 若弹出done,加上一堆warning之类,成功。若不成功,尝试换编译环境。
e) 原炼钢脱氧剂Fortran需改写,原program需改为subroutine,首部添加代码如下并作相应修改如下:
#include "fintrf.h"
C Gateway routine ! 入口子程序
C 子程序必须取名mexFunction,类似于C语言的main函数
C 在Matlab中用mex编译后会生成一个与文件名同名的.mexw32或.mexw64文件
C 如:64,调用时将其看成是Matlab的函数即可,如
C
C y = mytest(x) % 这里 x 是一个向量
C
C-----------------------------------------------------------------------
subroutine mexFunction(nlhs, plhs, nrhs, prhs)
C
C 注意:子程序名必须为mexFunction
C nlhs:用于记录输出参数(left hand side)的个数
C plhs:用于记录输出的指针数组,指向各个输出参数的首地址
C nrhs:用于记录输入参数(right hand side)的个数
党政机关公务用车预算决算管理办法C prhs:用于记录输入的指针数组,指向各个输入参数的首地址
C
C-----------------------------------------------------------------------
C Declarations ! 变量声明
implicit none
C mexFunction arguments:
integer nlhs, nrhs
mwPointer plhs(*), prhs(*)
C Function declarations:
mwPointer mxGetPr, mxGetM, mxGetN
mwPointer mxCreateDoubleMatrix
C mxGetPi:获取数据的虚数部分,这里没有用到
C mxGetM:获取数据的行数
C mxGetN:获取数据的列数
C mxCreateDoubleMatrix:创建一个双精度Matlab矩阵
C
C Array information:
mwPointer x_pr, y_pr
mwPointer m, n
mwSize size
real*8 x(100), y
C 由于不知道 x 的长度,这里规定最长不超过100
C-----------------------------------------------------------------------
C 获取输入数据的行数与列数,并判断数据个数是否超过100
m = mxGetM(prhs(1))
n = mxGetN(prhs(1))
adizero crazy light size = m * n
C
C 获取从Matlab中输入的数据
x_pr = mxGetPr(prhs(1))
C 将数据转化为双精度,并复制给Fortran中的 x,size表示数据个数
call mxCopyPtrToReal8(x_pr,x,size)
C 调用计算子程序
call calc(x,y)
C 将计算结果传给 Matlab
C 先创建一个双精度实矩阵,这里是1x1的
plhs(1) = mxCreateDoubleMatrix(1,1,0) ! 如果第三个参数是1,则表示带虚部
y_pr = mxGetPr(plhs(1))
C
C 将y的值(实数部分)复制给 y_pr,也就是传给 Matlab
call mxCopyReal8ToPtr(y,y_pr,1)
return
end
f) 保证matlab欲调用的fortran文件在不含空格的文件路径下,输入施慧达mex 文件名.f 得到文件名.mexw64,完全类同m文件的使用即可。