Re: [請益]for迴圈內差法過慢
※ 引述《sunev (Veritas)》之銘言:
: 標題: Re: [請益]for迴圈內差法過慢
: 時間: Fri Jun 23 18:18:39 2017
: ※ 引述《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);
: : 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);
: : 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))
: : end
: : end
: : end
: : end
: : 可是發現計算時間真的太長了,要花到3個多小時...不知道可以如何改善
: : 想請教如何解決,麻煩大家了
: --
: ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.37.138.130
: ※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1498213121.A.C13.html
: 推 s455164: 阿不好意思 對其實以matlab的寫法 應該要表示為AA 06/23 22:52
: 推 s455164: 好的 那我回去試看看 感謝你 06/23 23:13
: 推 s455164: AA不會隨k變動 06/23 23:30
: → s455164: 但是AA上的元素,例如AA( 1 , 2 )是先判斷 B陣列的B( 1 , 06/23 23:30
: → s455164: 2 ) 的值是介在C陣列中的哪個位置後[假如是C(4) < B(1, 06/23 23:30
: → s455164: 2 ) < C(5)],再提出相對應位置的A(1,2,4)&A(1,2,5)去內插 06/23 23:30
: → s455164: 出AA(1,2)這樣 06/23 23:30
: → sunev: 所以在所有k裡取最後條件成立的值? 06/24 07:40
: 推 s455164: 取最後k維度出來的值 再丟回相對應的AA( i , j )之中 06/24 09:13
: → s455164: 所以AA陣列上的每個元素需要用到的C(k)都是不一樣的,我 06/24 09:21
: → s455164: 有想過是讓A陣列以A(:,:,K)計算到一個新的陣列A1裡,再只 06/24 09:21
: → s455164: 挑要的位置出來提到AA中[AA(i,j)=A1(i,j]但是這樣好像更 06/24 09:21
: → s455164: 慢..就不行了 06/24 09:21
: → sunev: 你的C是排序過的嗎? 06/24 11:49
: 推 s455164: 對喔 C是已經整理過的 06/24 12:14
: 推 s455164: http://i.imgur.com/tMCtsR4.jpg
06/24 12:37
原來如此
這樣的話你if條件可再簡化
先把迴圈作法整理一次
AA=zeros(100,100);
for i = 1:100
for j = 1:100
for k = 2:51
if B(i,j)<=C(k)
AA(i,j) = A(i,j,k-1)...
+ (A(i,j,k)-A(i,j,k-1)) * (C(k)-B(i,j))/(C(k)-C(k-1));
break
end
end
end
end
這邊是假設B的值一定落在C裡面
如果B有可能跑到外面要再加例外控制
如果程式邏輯是這樣的話
能省的迴圈好像只有最裡面的k迴圈
for i = 1:100
for j = 1:100
k=find(B(i,j)<=C,1);
AA(i,j)=A(i,j,k-1) + (A(i,j,k)-A(i,j,k-1)) * (C(k)-B(i,j))/(C(k)-C(k-1));
end
end
這兩層迴圈可以想辦法用arrayfun取代
但應該不會比較快就是
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.37.138.130
※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1498280900.A.298.html
→
06/24 13:20, , 1F
06/24 13:20, 1F
推
06/24 15:57, , 2F
06/24 15:57, 2F
→
06/24 15:57, , 3F
06/24 15:57, 3F
→
06/25 19:30, , 4F
06/25 19:30, 4F
討論串 (同標題文章)
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章