Re: [請益]for迴圈內差法過慢
※ 引述《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
06/23 22:52, 1F
推
06/23 23:13, , 2F
06/23 23:13, 2F
推
06/23 23:30, , 3F
06/23 23:30, 3F
→
06/23 23:30, , 4F
06/23 23:30, 4F
→
06/23 23:30, , 5F
06/23 23:30, 5F
→
06/23 23:30, , 6F
06/23 23:30, 6F
→
06/23 23:30, , 7F
06/23 23:30, 7F
→
06/24 07:40, , 8F
06/24 07:40, 8F
推
06/24 09:13, , 9F
06/24 09:13, 9F
→
06/24 09:21, , 10F
06/24 09:21, 10F
→
06/24 09:21, , 11F
06/24 09:21, 11F
→
06/24 09:21, , 12F
06/24 09:21, 12F
→
06/24 09:21, , 13F
06/24 09:21, 13F
→
06/24 11:49, , 14F
06/24 11:49, 14F
推
06/24 12:14, , 15F
06/24 12:14, 15F
推
06/24 12:37, , 16F
06/24 12:37, 16F
討論串 (同標題文章)
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章