matlab和fortran混合編程

matlab2016b+vs2010+ivf2013+f90數組

其實默認是f77語法,但經過配置能夠改變爲自由格式。函數

默認只能f77代碼,怎樣修改:

 

 

 

 

找到:mex_FORTRAN_win64,刪掉fixed就能夠用f90了。post

 


 

大致過程:spa

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.mex64code

在matlab命令行窗口輸入:blog

x=[1 2 3];接口

a=2;

y=Add(x,a)

---

我把Add.f90改成multiple.f90的話:

 

效果同樣。

一樣的功能的m文檔,會優先調用.mexw64,且速度很快。因此能夠寫一個同名的m文檔,只有函數名,以後全是註釋文檔,用以查閱。

相關文章
相關標籤/搜索