Re: [求救]三重迴圈

作者: sunev (Veritas)   2017-11-16 04:24:45
※ 引述《MarchinOn (寶寶不說)》之銘言:
: K、N為已知且固定的數值
: R_m_theta是一個用來儲存資料的0矩陣
: 程式碼如下
: for m=1:K*N-1
: for n=1:K*N-m
: for theta=1:K*N-n-m
: if n+theta<K*N & n+m+theta<K*N
: R_m_theta(m,theta)=R_m_theta(m,theta)+conj(Rx(n+theta))*Rx(n+m+theta);
: else
: break
: end
: end
: end
: end
: 這個三重迴圈有辦法用甚麼方法寫成比較好嗎?
: 目前在K*N=512都要跑個幾小時實在是很久
: 想請問大家有甚麼建議或方法嗎?
: 謝謝大家!
y_{i,j}=conj(Rx_i * Rx_j)
R_{m,\theta} = \sum_{k=\theta+1}^{KN-m-1} y_{k+m,k}
可以看得出來是對y這個矩陣沿著diagonal的不同band做cumsum
如果 size(Rx)==[KN-1 1]
先做出y
y = conj(Rx)*Rx';
沿diagonal取出不同band,這邊我們只需要上三角部份
[y,d] = spdiags(triu(y,1));
這邊要特別注意的是,如果某條band全是0,spdiags就不會取
Y=zeros(K*N-2,K*N-2);
Y(:,d)=y;
Y(:,end)=[];
做cumsum
Rx = cumsum(flipud(Y));
Rx(end,:) = [];
Rx = flipud(Rx).';
作者: MarchinOn (寶寶不說)   2017-11-18 12:25:00
請問關於最後的Y矩陣 我想將y的值傳入 但是會遇到矩陣大小不合的問題 是我缺少了什麼語法嗎?y矩陣的確是我所需要的現在想要沿著diagonal取值有什麼特殊的語法能避免迴圈嗎?
作者: sunev (Veritas)   2017-11-19 10:43:00
y=conj(Rx(2:end))*Rx(2:end)';[y,d]=spdiags(tril(y,-1));y(end,:)=[];Y=zeros(l-2,l-2);Y(:,-d)=y;R=cumsum(flipud(Y));R=flipud(R).';改成這樣不好嗎?
作者: williswait (一閃一閃派大星)   2017-11-23 10:28:00
晚看到了,目前跑起來可以,謝謝你!
作者: sunev (Veritas)   2017-11-24 17:40:00
方便的話可以回報速度嗎?
作者: williswait (一閃一閃派大星)   2017-11-26 10:09:00
K*N=512時現在只需要400多秒了
作者: sunev (Veritas)   2017-11-26 23:11:00
你是不是哪裡搞錯了,我跑只要一秒不到照著你原來的例子也只要不到4秒.....

Links booklink

Contact Us: admin [ a t ] ucptt.com