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

看板MATLAB作者 (Veritas)時間7年前 (2017/06/23 18:18), 編輯推噓6(6010)
留言16則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《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]); -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.37.138.130 ※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1498213121.A.C13.html

06/23 22:52, , 1F
阿不好意思 對其實以matlab的寫法 應該要表示為AA
06/23 22:52, 1F

06/23 23:13, , 2F
好的 那我回去試看看 感謝你
06/23 23:13, 2F

06/23 23:30, , 3F
AA不會隨k變動
06/23 23:30, 3F

06/23 23:30, , 4F
但是AA上的元素,例如AA( 1 , 2 )是先判斷 B陣列的B( 1 ,
06/23 23:30, 4F

06/23 23:30, , 5F
2 ) 的值是介在C陣列中的哪個位置後[假如是C(4) < B(1,
06/23 23:30, 5F

06/23 23:30, , 6F
2 ) < C(5)],再提出相對應位置的A(1,2,4)&A(1,2,5)去內插
06/23 23:30, 6F

06/23 23:30, , 7F
出AA(1,2)這樣
06/23 23:30, 7F

06/24 07:40, , 8F
所以在所有k裡取最後條件成立的值?
06/24 07:40, 8F

06/24 09:13, , 9F
取最後k維度出來的值 再丟回相對應的AA( i , j )之中
06/24 09:13, 9F

06/24 09:21, , 10F
所以AA陣列上的每個元素需要用到的C(k)都是不一樣的,我
06/24 09:21, 10F

06/24 09:21, , 11F
有想過是讓A陣列以A(:,:,K)計算到一個新的陣列A1裡,再只
06/24 09:21, 11F

06/24 09:21, , 12F
挑要的位置出來提到AA中[AA(i,j)=A1(i,j]但是這樣好像更
06/24 09:21, 12F

06/24 09:21, , 13F
慢..就不行了
06/24 09:21, 13F

06/24 11:49, , 14F
你的C是排序過的嗎?
06/24 11:49, 14F

06/24 12:14, , 15F
對喔 C是已經整理過的
06/24 12:14, 15F

06/24 12:37, , 16F
文章代碼(AID): #1PJEi1mJ (MATLAB)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 2 之 3 篇):
文章代碼(AID): #1PJEi1mJ (MATLAB)