Re: [請益]for迴圈內差法過慢

作者: sunev (Veritas)   2017-06-23 18:18:39
※ 引述《s455164 (夢想家)》之銘言:
: 有點卡關..
: 我有三個陣列:
: 三維陣列A(100,100,51)、二維陣列B(100,100)、一維陣列C(1,51)
: 其中A陣列的第三個維度是與C互相呼應的(A(:,:,1)是對應C(1,1))
: 想要利用B陣列與C陣列之間的比例關係去對A陣列
: 內插出一個新的二維陣列A'(100,100)
: 我自己的寫法是這樣的
: A' = zeros(100,100);
A'這變數名稱應該不合法吧?
以下改稱AA
另外AA與k無關嗎?
這樣k迴圈不是只要跑最後一次就好?
先假設AA的大小為100*100*50;
首先把C的第二維換到第三維與A對齊
C=permute(C,[1 3 2]);
: for i = 1:100
: for j = 1:100
: for k = 1:51-1
先忽略條件式
: if ((B(i,j)>=C(k)) && (B(i,j)<=C(k+1))) || (((B(i,j)>=C(k)) && (B(i,j)>=C(k+1)
: A'(i,j) = (A(i,j,k+1)-A(i,j,k)) * (B(i,j)-C(k))/(C(k+1)-C(k)) + A(i,j,k);
此行可直接改寫如下
AA1=A(:,:,1:end-1)+...
diff(A,1,3)*bsxfun(@rdivide,bsxfun(@minus,B,C(1,1,1:end-1)),diff(C,1,3));
: elseif (B(i,j) <= C(k)) && (B(i,j) < = C(k+1))
: A'(i,j) = A(i,j,k+1) - (A(i,j,k+1)-A(i,j,k)) * (C(k+1)-B(i,j))/(C(k+1)-C(k))
此行可直接改寫如下
AA2=A(:,:,2:end)-...
diff(A,1,3)*bsxfun(@rdivide,bsxfun(@minus,C(1,1,2:end),B),diff(C,1,3));
: end
: end
: end
: end
: 可是發現計算時間真的太長了,要花到3個多小時...不知道可以如何改善
: 想請教如何解決,麻煩大家了
條件一似乎可化簡成 (B(i,j)>=C(k))
現在想辦法把AA1和AA2在我們想要的條件下合併起來
AA=zeros(size(AA1));
ind1=bsxfun(@ge,B,C(1,1,1:end-1));
ind2=bsxfun(@le,B,C(1,1,1:end-1))&bsxfun(@le,B,C(1,1,2:end));
AA(ind2)=AA2(ind2); AA(ind1)=AA1(ind1);
最後可把C的維度轉回來,如果你怕之後會忘記的話
C=permute(C,[1 3 2]);
作者: s455164 (夢想家)   2017-06-23 22:52:00
阿不好意思 對其實以matlab的寫法 應該要表示為AA好的 那我回去試看看 感謝你AA不會隨k變動但是AA上的元素,例如AA( 1 , 2 )是先判斷 B陣列的B( 1 ,2 ) 的值是介在C陣列中的哪個位置後[假如是C(4) < B(1,2 ) < C(5)],再提出相對應位置的A(1,2,4)&A(1,2,5)去內插出AA(1,2)這樣
作者: sunev (Veritas)   2017-06-24 07:40:00
所以在所有k裡取最後條件成立的值?
作者: s455164 (夢想家)   2017-06-24 09:13:00
取最後k維度出來的值 再丟回相對應的AA( i , j )之中所以AA陣列上的每個元素需要用到的C(k)都是不一樣的,我有想過是讓A陣列以A(:,:,K)計算到一個新的陣列A1裡,再只挑要的位置出來提到AA中[AA(i,j)=A1(i,j]但是這樣好像更慢..就不行了
作者: sunev (Veritas)   2017-06-24 11:49:00
你的C是排序過的嗎?
作者: s455164 (夢想家)   2017-06-24 12:14:00
對喔 C是已經整理過的http://i.imgur.com/tMCtsR4.jpg

Links booklink

Contact Us: admin [ a t ] ucptt.com