Мне удалось получить помощь в векторизации этого цикла, но если я попытаюсь запустить его, когда 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);
Вот vectorised версия, но я бегу из памяти, когда array1/xfreq_orig Роу велики, как 500000 или если t_rebuilt большой массив как t_rebuilt = LINSPACE (0,2 * пи, 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
Кто-нибудь есть какие-либо предложения о том, как ускорить этот процесс для контура вверх, так как если я vectorise это я убегу из памяти? Есть еще один способ vectorise это, так что я не буду бежать из памяти при использовании большого количества строк для array1/xfreq_orig или t_rebuilt