matlab调用fortran

  科学计算中如果需要同时用到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 2013command promptparallel ……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 mxGetPr:获取数据的实数部分
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文件的使用即可。

本文发布于:2024-09-22 10:07:03,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/444446.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:环境   输入   数据   文件   调用   编译
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议