matlab和fortran混合编程

   2023-02-09 学习力0
核心提示:matlab2016b+vs2010+ivf2013+f90其实默认是f77语法,但通过配置可以改变为***格式。默认只能f77代码,怎样修改:https://ww2.mathworks.cn/matlabcentral/answers/333875-i-am-trying-to-create-a-mex-file-for-fortran90-code-i-get-an-error-because-of-and

matlab2016b+vs2010+ivf2013+f90

其实默认是f77语法,但通过配置可以改变为***格式。

默认只能f77代码,怎样修改:
matlab和fortran混合编程

 

 matlab和fortran混合编程

 

 

找到:mex_FORTRAN_win64,删掉fixed就可以用f90了。

 


 

大体过程:

1.在matlab中配置fortran编译环境: mex -setup FORTRAN
2.写好源代码,自定义子函数仍可以像往常一样调用别的子函数
3.将matlab当前路径调整到当前源代码文档所在路径
4.在matlab命令行输入编译命令:mex csuherror.f90
5.像使用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等函数的申明 http://yuehongliang2000.lofter.com/post/1d001431_ab72071
  2 
  3 
  4       subroutine mexFunction(OutSum,OutVar,InSum,InVar)!函数接口名称必须为mexFunction,
  5 
  6 
  7     !OutSum:输出参数个数
  8 
  9 
 10     !OutVar:输出参数数组指针
 11 
 12 
 13     !InSum:输入参数个数
 14 
 15 
 16     !InVar:输入参数数组指针
 17 
 18 
 19     !参数顺序不能随意更改
 20       Integer InSum,OutSum
 21 
 22 
 23       mwPointer InVar(*),OutVar(*)                           !mwPointer专门用于表示指针变量,这个不能随意用Integer代替
 24 
 25 
 26       mwPointer mxGetPr, mxGetM, mxGetN,mxCreateDoubleMatrix !这个对返回指针函数的再次申明,
 27       integer, parameter :: fp = selected_real_kind(15,300)
 28       Integer , parameter :: myINT  = SELECTED_INT_KIND( 8 )
 29 
 30 
 31       Real(fp),Allocatable::x(:,:),y(:,:)
 32       real(fp)::z
 33 
 34 
 35       Integer m,n
 36 
 37 
 38     
 39 
 40 
 41       If(InSum/=2)Then
 42 
 43 
 44 call mexErrMsgIdAndTxt('MATLAB:InputTooBig','输入参数个数必须为2个')
 45 
 46 
 47       Return
 48 
 49 
 50       EndIf
 51 
 52 
 53     
 54 
 55 
 56       m=mxGetM(InVar(1))!获取第1个输入参数的行数
 57 
 58 
 59       n=mxGetN(InVar(1))!获取第1个输入参数的列数
 60 
 61 
 62       Allocate(x(m,n),y(m,n))
 63 
 64 
 65       Call mxCopyPtrToReal8(mxGetPr(InVar(1)),x,m*n)!将第1个参数数组赋值给x变量
 66 
 67 
 68       Call mxCopyPtrToReal8(mxGetPr(InVar(2)),z,1)!将第2个整数变量赋值给z
 69 
 70 
 71 
 72 
 73       Call Add(x,y,z,m,n)!调用内部函数
 74 
 75 
 76     
 77 
 78 
 79       OutVar(1)=mxCreateDoubleMatrix(m,n,0)!给返回参数分配内存
 80 
 81 
 82       Call mxCopyReal8ToPtr(y,mxGetPr(OutVar(1)),m*n)!将返回参数赋值给分配的内存
 83 
 84 
 85     
 86 
 87 
 88       DeAllocate(x,y)!释放临时分配的内存
 89 
 90 
 91       Return
 92 
 93 
 94       End SubRoutine
 95 
 96 
 97 
 98 
 99     !  SubRoutine Add(x,y,z,m,n)
100     !
101     !  Integer,Intent(In)::m,n
102     !  integer, parameter :: fp = selected_real_kind(15,300)
103     !
104     !  Real(fp),Intent(In)::x(m,n),z
105     !
106     !  Real(fp),Intent(Out)::y(m,n)
107     !
108     !  Integer i,j
109     !
110     !  Do i=1,m
111     !
112     !      Do j=1,n
113     !
114     !            y(i,j)=x(i,j)+z
115     !
116     !      EndDo
117     !
118     !  EndDo
119     !
120     !  Return
121     !
122     !End SubRoutine
123     
124         SubRoutine Add(x,y,z,m,n)
125 
126 
127         Integer,Intent(In)::m,n
128         integer, parameter :: fp = selected_real_kind(15,300)
129 
130 
131         Real(fp),Intent(In)::x(m,n),z
132 
133 
134         Real(fp),Intent(Out)::y(m,n)
135 
136 
137         Integer i,j
138 
139 
140         Do i=1,m
141 
142 
143         Do j=1,n
144 
145 
146         y(i,j)=x(i,j)+z
147 
148 
149         EndDo
150 
151 
152         EndDo
153 
154 
155         Return
156 
157 
158         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和fortran混合编程

 

效果一样。

同样的功能的m文档,会优先调用.mexw64,且速度很快。所以可以写一个同名的m文档,只有函数名,之后全是注释文档,用以查阅。

 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 如何在Abaqus的python中调用Matlab程序
    目录1. 确定版本信息2. 备份python3. 设置环境变量4. 安装程序5. 调试运行参考资料Abaqus2018操作系统Win10 64位Python版本2.7(路径C:\SIMULIA\CAE\2018\win_b64\tools\SMApy\python2.7)2. 备份python将上述的“python2.7”文件夹复制出来,避免因操作错误
    03-16
  • 如何将极坐标数据转换为笛卡尔坐标系并绘制[MATLAB]
    如何将极坐标数据转换为笛卡尔坐标系并绘制[MAT
    你想做的事考虑根据与原点的距离 $r$ 和 $xy$ 平面上的角度 $heta$ 绘制数据 $P(r, heta)$。例如,雷达获取的信号包含有关目标范围 $r$ 和方位角 $heta$ 的信息。就是下图。在本文中,$heta$ 是从 $x$ 轴测量的角度。显示示例考虑创建依赖于 $r, heta$ 的虚拟
    03-16
  • 【MATLAB与机械设计】一维优化进退法确定初始区间
    【MATLAB与机械设计】一维优化进退法确定初始区
    在讨论一维搜索时,首先保证搜索区间函数具有单峰性,也就是在区间[a,b]中函数是凸函数,对于求极小值问题,函数值具有高—低—高的特性,在区间[a,b]上有唯一的最小值。1,方法的建立2.进退法确定搜索区间的程序框图3,根据上述的程序框图,编写的MATLAB程序
    03-08
  • 用于微型四轮驱动的 6T 小齿轮原型和使用 MATLAB 的 FEM 结构分析
    用于微型四轮驱动的 6T 小齿轮原型和使用 MATLA
    介绍我使用迷你 4WD 套件使用 Raspberry Pi 制作机器人汽车。定制零件丰富且方便,因为它们在附近的商店很容易买到。但是,由于Mini 4WD的速度非常快,因此在低速时很难控制速度。因此,我使用 3D 打印机制作了自己的 6T 小齿轮,并尝试改变齿轮比。 成型小齿
    03-08
  • ROS与Matlab系列:一个简单的运动控制 基于matl
    转自:http://blog.exbot.net/archives/2594Matlab拥有强大的数据处理、可视化绘图能力以及众多成熟的算法函数,非常适合算法开发;在控制系统设计中,Simulink也是普遍使用的设计和仿真工具。而ROS系统,则是一种新的标准化机器人系统软件框架。通过ROS,你
    02-10
  • matlab 遍历结构体struc的成员
    MATLAB中专门用于对结构数组的操作的函数并不多,通过 help datatypes获取数据类型列表,可以看到其中的结构数据类型的有关的函数,主要如表4.3.1所示。表4.3.1 结构数组的操作函数函数名             功能描述 deal                 把输入处
    02-09
  • 02-09
  • schroeder reverb matlab实现
    schroeder reverb matlab实现
    原理参考:Natural sounding artificial reverberation combFilter.m:function output = combFilter(delay, gain, input)fs = 48000;delaySample = int32(delayTime * fs / 1000);B = [1 zeros(1, delaySample - 1)];A=[1 zeros(1, delaySample - 2) -gain];
    02-09
  • C/C++中调用matlab引擎计算 matlab转c
    原帖地址:http://blog.sina.com.cn/s/blog_6adcb3530101cvot.html一,在linux环境使用matlab引擎必须先进行一些必要的配置1,matlab引擎依赖/bin/csh启动,所以不管你使用何种shell,都必须安装csh。**2,matlab引擎依赖的动态库文件目录必须在系统当前的
    02-09
  • MATLAB 图像放大/缩小,双线性插值
    MATLAB 图像放大/缩小,双线性插值
    半年前写过matlab最邻近插值的图像缩放,没怎么考虑边界问题。更早之前用Opencv写过双线性插值图像放大,不过写的比较混乱。所以这里用matlab重新再清楚的写一遍。 1 close all; 2 clear all; 3 clc; 45 m=1.8;%放大或缩小的高度 6 n=2.3;%放大或缩小的宽度 7
    02-09
点击排行