2015-10-18 73 views
1

我有這個代碼運行速度非常慢。有人可以幫我矢量化它。向量化廣義Hebb算法

for ii=1:K, 
    y=w*x(ii,:)'; % y is N by 1 
    u=zeros(N,M); 
    disp(num2str(ii)); 
    for jj=1:N, 
     u(jj,:)=y(jj)*(x(ii,:)-y(1:jj)'*w(1:jj,:)); 
    end 
    wold=w; 
    w=wold+eta*u; % updated weight matrix 
end 

內循環花費的時間最多。該代碼用於廣義hebb算法。

輸入尺寸:

M=153600; 
K=5000; 
N=400; 
eta=0.004; 

size(w)=5000x153600 
size(x)=400x153600 

回答

3

可以內環得到ubsxfun -

yN = y(1:N); 
u = bsxfun(@times,yN,bsxfun(@minus,x(ii,:),cumsum(bsxfun(@times,w(1:N,:),yN)))) 

對於外循環,由於與迭代之間的數據依賴性在w上的更新,可能很難對其進行矢量化。

+0

感謝您的回答!這大大減少了時間。雖然它似乎有點慢(一次迭代274.285267秒)。你認爲改變:'wold = w; w = wold + eta * u;'到'w = w + eta * u'會有所幫助。 –

+1

@AhishekBhatia是的!這應該有很大的幫助。你說它在274秒慢,那麼矢量化之前的運行時間是多少? – Divakar

+0

我之前沒有測量過它,但如果不是更多,它會提高3倍左右。你有什麼改進建議嗎?我把它改成了'w = w + eta * bsxfun(@ times,w * x(ii,:)',x - cumsum(bsxfun(@ times,w,w * x(ii ,: )'),1));'。可讀性對我來說並不重要。 –