matlab2016b+vs2010+ivf2013+f90數組
其實默認是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文檔,只有函數名,以後全是註釋文檔,用以查閱。