【发布时间】:2013-12-10 12:58:12
【问题描述】:
我能够在矢量化这个 for 循环方面获得帮助,但是如果我尝试在 array1 / xfreq_orig 有 500,000 行或 t_rebuilt 有 500,000 行时运行它,我会用完 16gig 的 ram。
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 行像 500,000 一样大或者如果 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);
以下是 Chris Taylor 回答的原因解释。 “请记住,这将使用比版本循环更多的内存(它将使用 numel(xfreq_orig) 倍的内存,因为它在求和之前计算 aa_sig_rebuilt_L 的每一行,而循环计算每一行,将其添加到总和然后丢弃它)。”
vectorizing a matlab / octave FOR loop
有没有人对如何加快这个 for 循环有任何建议,因为如果我将它矢量化,我会耗尽内存?是否有另一种方法对其进行矢量化,以便在 array1 / xfreq_orig 或 t_rebuilt
使用大量行时不会耗尽内存【问题讨论】:
标签: matlab for-loop octave vectorization