Re: [運算] 多層for迴圈簡化 與 GPU加速

看板MATLAB作者 (別再睡了起床了愛麗)時間7年前 (2017/12/20 05:04), 7年前編輯推噓5(5013)
留言18則, 4人參與, 7年前最新討論串2/2 (看更多)
真不好意思,才隔一天就又上來問.. 昨天問的東西其實是我要算的東西的第二步,原本他才是瓶頸,但是板上高手一下就解決 了,我現在想不用for處理第一步,也就是求出昨天的atot (m*n,k) atot中的元素是用一個m*n二維座標(x,y)和三個一組的數字(a1,a2,a3)帶入一個函數 f(x,y,a1,a2,a3)求得,三個一組的數字共有k組,所以最後atot的維度是(m*n,k) https://imgur.com/CTjyecs
程式上先用meshgrid建立座標,再產生k組數字 m=15; n=19; k=10000; [X,Y]=meshgrid(1:m,1:n); ini=randn(k,3); 為了方便起見這裡f就先用sin和多項式來舉例 f(x,y,a1,a2,a3)=sin(x+y^2+a1+a2^2+a3^3) 目前想了一個辦法是用arrayfun配上reshape atotpr=arrayfun(@(x,y) sin(x+y^2+ini(:,1)+ini(:,2).^2+ini(:,3).^3),X,Y,'un',0); atotmid=cell2mat(atotpr); atot=reshape(atotmid,k,m*n); 這樣確實比用三層for loop快很多了,隨便試幾個m,n,k都快一個數量級以上,不過想知道 有沒有更好的方法。另外這樣寫gpu也沒有辦法算,matlab的gpu不接受non UniformOutput ,雖然說以目前的速度來看,gpu似乎也不是很有必要了....但還是希望能多學一點 感恩 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.114.253.151 ※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1513717470.A.F95.html ※ 編輯: Absolitude (140.114.253.151), 12/20/2017 05:06:43

12/20 07:50, 7年前 , 1F
這裡xy和a剛好可以拆開,所以
12/20 07:50, 1F

12/20 07:51, 7年前 , 2F
atot=bsxfun(@plus,X(:)+Y(:).^2,(ini(:,1)+ini(:,2).^2)')
12/20 07:51, 2F

12/20 07:52, 7年前 , 3F
atot=reshape(sin(atot),[m*n k]);
12/20 07:52, 3F

12/20 07:58, 7年前 , 4F
另外我印象中arrayfun沒有比for-loop快,你可以check一下
12/20 07:58, 4F

12/20 22:11, 7年前 , 5F
原來可以用(:),我要算的有交叉項,不過剛剛弄出來了
12/20 22:11, 5F

12/20 22:12, 7年前 , 6F
感恩!!
12/20 22:12, 6F

12/20 22:12, 7年前 , 7F
晚點再看看FOR的
12/20 22:12, 7F

12/22 16:13, 7年前 , 8F
真要快還是得用C,不然就是用gpu
12/22 16:13, 8F

12/22 20:02, 7年前 , 9F
2016b以後的matlab不用bsxfun也可以做到2F的事情了
12/22 20:02, 9F

12/22 20:03, 7年前 , 10F
直接X(:)+Y(:).^2+(ini(:,1)+ini(:,2).^2)'應該就可以
12/22 20:03, 10F

12/24 01:31, 7年前 , 11F
對程式語言的本質不瞭解 C真的一定比MATLAB快嗎
12/24 01:31, 11F

12/24 02:19, 7年前 , 12F
P大感恩,不過我目前的版本沒那麼新
12/24 02:19, 12F

12/24 15:06, 7年前 , 13F
如果要跟文獻拼速度可能需要計較(在同一個環境下) 但如
12/24 15:06, 13F

12/24 15:06, 7年前 , 14F
果只是要結果 時間基本不會差到哪(order of 1) 就看程
12/24 15:06, 14F

12/24 15:06, 7年前 , 15F
式的寫法 那些arrayfun背後也都是迴圈寫成的 只是經過
12/24 15:06, 15F

12/24 15:06, 7年前 , 16F
優化而已
12/24 15:06, 16F

12/24 15:07, 7年前 , 17F
可以到mathworks的論壇去看看 很多高手在那討論
12/24 15:07, 17F

12/24 18:23, 7年前 , 18F
用bsxfun的話應該不會比C慢
12/24 18:23, 18F
文章代碼(AID): #1QENxU-L (MATLAB)
文章代碼(AID): #1QENxU-L (MATLAB)