MATLAB 板


LINE

前言:(都是廢話~可以跳過XD) MATLAB提供了向外窗口給C語言及FORTRAN語言,使得這兩種語言可以直接調動MATLAB的函 數來使用,C/MATLAB混編的教學很多,但關於FORTRAN/MATLAB,台灣用FORTRAN的本來就 少,而專精FORTRAN的人也有他們自己的一套系統,譬如TecPlot以及很多免費的FORTRAN 繪圖函數庫,所以其實真正有教怎麼用FORTRAN呼叫MATLAB函數的中文教學很少,尤其是 針對不同編譯器的設定上,最常找到的教學是CVF編譯32位元程式的設定,而IVF幾乎沒有 中文的,英文的又閱讀的很辛苦。MATLAB雖然有內建FORTRAN呼叫MATLAB的範例程式碼, 但是那是使用FORTRAN77寫成的。 也許很懂程式設計的人不用什麼教學就知道該怎麼設定,但是我想還是有很多研究生跟 我一樣上研究所才開始學程式,所以除了會寫CODE外,很多關於編譯器方面該怎麼設定也 都一知半解,尤其現在IVF跟經典教科書使用的CVF已經長得不太一樣了,所以我終於成功 能夠在FORTRAN程式呼叫MATLAB的一些函數後,想說放到網路上讓有需要使用到MATLAB及 FORTRAN的苦命菸酒生們參考如何設定。 其實大部分都是網路上東蒐集一點西蒐集一點最後整理出來的東西,而我主要是針對如何 設定及一些該注意的地方來分享,至於詳細的語法,我想有空再說吧,而且語法方面其實 都是由MATLAB提供的,所以可以參考C怎麼呼叫MATLAB函數。或是GOOGLE '調用MATLAB計 算引擎',也可以找到關於語法上的介紹。 編譯一個有呼叫到MATLAB的FORTRAN原始碼有兩種方法: (MATLAB跟FORTRAN編譯器都必須安裝) 1.使用MATLAB編譯,這個最簡單,幾乎不用設定,但是MATLAB只能懂FIX格式(77)的 FORTRAN,要讀FREE格式的,必須要在某個.bat檔裡面去修改,在此不去說明,因為 我想應該也沒人用FORTRAN寫了一個程式後還特地使用MATLAB編譯吧... (這方法需要MATLAB能辨別出使用的FORTRAN編譯器,但似乎MATLAB只認識CVF跟IVF, 其他如PGI等等其他廠牌編譯器他都不認得) 2.使用FORTRAN的編譯器去編譯,我想菸酒生們大部分應該都是使用WINDOW系統,所以下 面講的也是這個方法。會用LINUX的人都是專業的,我想應該他們都會這些了~囧 3.把MATLAB的函式庫編譯成.dll,不過這太專業了,實際上怎麼做我也不懂,我只知道 這方法可以讓程式在沒安裝MATLAB的電腦上執行。 正文: 首先是我的操作環境,我想如果操作環境不同,可能也會有些不同,所以有可以依照操 作環境不同來調整設定方式: 作業系統:Windows 7 64位元 MATLAB版本:R2010a 64位元 安裝路徑C:\Program Files\MATLAB\R2010a FORTRAN編譯器:Intel Visual Fortran 11 使用IDE介面 IDE介面是用Microsoft Visual Studio 2008 編譯組態: Debug x64 前置作業: 1.設定Win7環境變數: 控制台->系統及安全性->系統->進階系統設定->環境變數 出現的頁面會有上下兩大區塊,在下方的系統變數區塊中的變數欄尋找PATH這 項,點選後按下方的編輯鈕,在變數值那欄應該已經有很多路徑了,在最後加 上";",然後再加上下面這個路徑 C:\Program Files\MATLAB\R2010a\bin\win64 一直按確定關掉所有頁面後,重新開機(一定要重新開機!) (若程式可以編譯,但執行時卻會出現找不到XXX.dll,通常都這步驟的問題) 2.設置專案屬性: 開啟會使用到MATLAB計算引擎的FORTRAN專案,記得組態要改成x64,至於是 Debug或Release我想都沒差。 (若組態是win32,我不確定能不能呼叫64位元的MATLAB) a.專案->屬性->FORTRAN->GENERAL,在Additional Include Directories那欄 填上C:\Program Files\MATLAB\R2010a\extern\include b.專案->屬性->FORTRAN->PREPROCESSOR,在Preprocess Source Files那欄 選擇YES (這步驟重要~我卡很久後才知道要做這步驟) c.專案->屬性->LINKER->GENERAL,在Additional Library Directories那欄 填上C:\Program Files\MATLAB\R2010a\extern\lib\win64\microsoft d.專案->屬性->LINKER->INPUT,在Additional Dependencies那一欄填上 libmx.lib libmat.lib libeng.lib 確定,關掉屬性視窗。 (對於a、c、d若是不想針對特定專案,而是所有專案都可以呼叫MATLAB,可從 工具->選項裡去設定,請自行找編譯器教學......) 3.在程式碼最開頭加上 #INCLUDE "fintrf.h" 4.接著就可以用MATLAB針對FORTRAN呼叫MATLAB計算引擎的一些特定函數來寫程 式,跟在C裡呼叫的方式差不多,我個人是覺得必須要有指標的觀念才行,才 比較好懂跟自行運用。 因為這篇主要是針對64位元作業系統及64位元程式的設定及需要注意的事項 ,所以關於語法請自行參考MATLAB的說明。 以一個在FORTRAN程式呼叫MATLAB畫圖的程式碼為例,前面數字為行號: (若要把行號也寫進程式碼的話,記得#INCLUDE "fintrf.h"這行不能加行號) #INCLUDE "fintrf.h" 1 PROGRAM main 2 IMPLICIT NONE 3 INTEGER*8,EXTERNAL:: engOpen,engClose,mxCreateDoubleMatrix 4 INTEGER*8,EXTERNAL:: mxGetPr,engPutVariable,engEvalString 5 INTEGER*8::ep,T,status 6 INTEGER*8::i,j,k 7 REAL*8::nodes(2,400) 8 DO i=1,400 9 nodes(1,i)=2d0*3.1415926/400d0*DBLE(i) 10 ENDDO 11 CALL RANDOM_SEED() 12 CALL RANDOM_NUMBER( nodes(2,:) ) 13 nodes(2,:)=nodes(2,:)*2d0-1d0 14 i=2 15 j=400 16 k=0 17 ep=engOpen(' ') 18 T=mxCreateDoubleMatrix(i,j,k) 19 CALL mxCopyReal8toPtr(nodes,mxGetPr(T),2*400) 20 status=engPutVariable(ep,'voronoi_nodes',T) 21 status=engEvalString(ep,'for i=1:1:400, & plot(voronoi_nodes(1,i),voronoi_nodes(2,i),''*''); & hold on; & end') 22 status=engEvalString(ep,'axis equal') 23 status=engEvalString(ep,'axis([0,2*3.1415926,-1.1,1.1])') 24 CALL mxDestroyArray(T) 25 PAUSE '按任意鍵結束' 26 status = engClose(ep) 27 END PROGRAM main 如果程式碼正確執行,應該會出現一張用MATLAB畫的圖,上面很多*號.... 如圖http://ppt.cc/Jbsq 注意: 1.在64位元下,MATLAB的整數是8 bytes的資料型態,所以第3、4、5行可以看到 他們被宣告成8 bytes整數,第3、4行是呼叫MATLAB以及與MATLAB做資料交換 要用到的MATLAB引擎函數,簡單說就是FORTRAN與MATLAB溝通的橋樑,功能請自 行參考MATLAB的HELP,而第5行雖然不是宣告成指標變數,但其實它們的功用很 類似於指標。 2.(這點是我自己猜測的) 有些MATLAB的引擎函數是類似於傳址型態,而不能傳 值,所以像第18行的T=mxCreateDoubleMatrix(i,j,k),功能是在記憶體中 ALLOCATE一塊空間用來存放2*400的陣列,而k=0則表示此陣列都是純實數。 理論上應該寫成T=mxCreateDoubleMatrix(2,400,0)也可以(一些C語言的範例 好像也是這樣寫),但實際上會發現無法ALLOCATE,無法ALLOCATE時T會回傳0 ,所以要先令i=2,j=400,k=0,然後寫成T=mxCreateDoubleMatrix(i,j,k)才 能ALLOCATE成功。原因只是我自己的猜測,真正的原因我也不清楚。總之遇到 這種MATLAB引擎指令可用回傳的值為多少來判斷是否執行成功,若執行成功, 回傳的為一個非0值,因為回傳的是類似於記憶體位置的資料(指標),若執行 失敗,會回傳0,可以依此點來判斷MATLAB引擎指令有沒有成功被執行。 3.為了避免混亂,所以我沒加上判斷MATLAB指令是否成功執行的語句。 4.有時候雖然成功執行指令,但其實只是說成功把東西從FORTRAN傳送到MATLAB ,而MATLAB那邊若是語法錯誤,FORTRAN這邊卻不會知道(不像直接操作 MATLAB時,若語法錯誤會出現錯誤訊息),所以跑出來的結果不一定會正確。 以上,以後畫圖就不用再另外輸出數據,然後再打開MATLAB讀入數據來畫了 除了畫圖外,我想MATLAB還有很多東西可以被FORTRAN拿來使用 像我研究這個也不是因為要畫圖,其實我是要使用MATLAB內建的建Delaunay三角形的函數 因為FORTRAN的建Delaunay三角形程式碼都是外國人寫的,使用教學都英文,根本看不懂 怎麼用,所以我才會把主意打到MATLAB上。我想有些人應該跟我一樣,雖然FORTRAN資源 豐富,但是卻因為看不懂英文所以不會使用=..= 我不是專門玩程式的人,只是因為研究所需要才開始學寫程式 所以如果有什麼東西是本來就該知道的基礎知識而我不知道,請見諒>//////< 希望有多點人一起玩玩看,不要輸給C/C++了XDDDD --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.46.73 ※ 編輯: callmei 來自: 140.112.46.73 (05/14 22:41)
1F:推 kobenein:推 之前用MATLAB寫一個程式 跑起來太慢 就打算核心部分 05/15 00:16
2F:→ kobenein:用FORTRAN來寫 不過搞FORTRAN COMPILER搞好久 05/15 00:16
3F:→ kobenein:我就投靠C了 PS本來不會C 為了寫MEX檔才學的 05/15 00:17
4F:→ kobenein:本來是學FORTRAN 05/15 00:17
5F:推 imys:大推 回去試試看 謝謝分享! 05/15 00:48
6F:推 lenakaho:推~好棒!! 05/15 19:17
7F:→ JUSTNONE:各有優點吧 要速度 我可能也不會用MATLAB...... 05/17 12:02
8F:→ JUSTNONE:寫了海上路徑自動規劃 台灣到非洲跑了10分鐘 = = 05/17 12:02







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP