我能夠得到矢量化這個for循環的幫助,但如果我嘗試運行它時,array1/xfreq_orig有500,000行或t_rebuilt有500,000我跑了我跑出來的公羊我有16gig。加速循環,因爲我向量化時內存不足
array1=[xfreq_orig,yamp_orig,yamp_inv,phase_orig] %frequency, amplitudes, phases to use
t_rebuilt=linspace(0,2*pi,44100)
aa_sig_rebuilt_L=zeros(1,length(t_rebuilt));
aa_sig_combined_L=zeros(1,length(t_rebuilt));
sig_full_L=zeros(1,length(t_rebuilt));
for kk=1:1:numel(xfreq_orig);
aa_sig_rebuilt_L = array1(kk, 2)*cos ((array1(kk,1))*t_rebuilt+(array1(kk, 4)));
aa_sig_combined_L = aa_sig_combined_L + aa_sig_rebuilt_L;
end
sig_full_L=(aa_sig_combined_L/max(abs(aa_sig_combined_L))*.8);
這裏是向量化版本,但我用完存儲器時ARRAY1/xfreq_orig行的是大像500000或者如果t_rebuilt是大陣列等t_rebuilt = linspace(0,2 * PI, 544100)
a = array1;
t = t_rebuilt;
aa_sig_rebuilt_L = bsxfun(@times, a(:,2) , ...
cos(bsxfun(@plus, bsxfun(@times, a(:,1), t), a(:,4))));
aa_sig_combined_L = sum(aa_sig_rebuilt_L);
這就是爲什麼從克里斯·泰勒答案的解釋。 「請記住,這將使用比循環更多的內存(它將使用numel(xfreq_orig)乘以更多的內存,因爲它在對它們進行求和之前計算aa_sig_rebuilt_L的每一行,而循環計算每一行,並將其添加到總和然後丟棄它)。「
vectorizing a matlab/octave FOR loop
有沒有人對如何加快for循環起來,因爲如果我vectorise它,我會用盡內存有什麼建議?有另一種方式來vectorise它,所以我不會出來的內存使用大量行的時獲得陣列1/xfreq_orig運行或t_rebuilt