各位先進好
小弟用matlab寫FDTD(一種將電磁波的偏微分方程離散化求解的數值方法)
這個程式的架構很簡單
一開始先定義完各項參數後最後以一個for迴圈作結
迴圈裡面做的事情為矩陣運算
大概長得像這樣
for t=1:tnum %tnum大約為10000~50000
Ez(a:b,c:d)=A.*Ez(a:b,c:d)+B.*(Hx(a+1:b+1,c:d)-Hx(a:b,c:d));
Hx(a:b,c:d)=C.*Hx(a:b,c:d)+D.*(Ez(a+1:b+1,c:d)-Ez(a:b,c:d));
end
Ez,Hx,A,B,C,D都是矩陣
他們的大小視運算需求為定
迴圈裡面沒有其他迴圈
就只是把幾個矩陣做疊代運算而已
當然實際的code迴圈裡不是只有兩行而已
大約有10行左右,全都是這類的運算
一般來說這些矩陣的大小在600*600以內的計算速度都還可以接受
但是到1000*1000以上後又要跑較大的tnum時就會滿慢的了
最大的問題是這個程式寫到三維版本時,這些矩陣全部變成三維矩陣
迴圈仍然為單一迴圈裡,但運算式的量也大約變成三倍,其計算速度令人難以接受
曾經跑過一個三維的版本,矩陣大小約為500*400*100
一跑下去沒個三天以上是不會好的
最近在想因為matlab可以使用以C/C++編譯的.mex檔函數
我想知道若把這個for迴圈全部包成一個.mex檔執行的話能明顯提升運算速度嗎
雖然在simulink的時候把一些功能包成C的S-function的確大大提升速度
但二維矩陣運算用C的話每個運算都會變成兩層的迴圈
三維就變成三層...我實在不確定這樣能否提升效率
因為這是一個滿浩大的工程所以不想要到最後做半天反而速度更慢
有大大能提供意見嗎?感激不盡