【发布时间】:2015-06-25 09:42:21
【问题描述】:
我正在尝试矢量化并拆分 FOR 循环以使其运行得更快,但变量“aa_sig_combined_vect”在单元格 5569 之后开始返回除了零任何想法如何解决这个问题?请参阅下面的代码用户 krisdestruction 帮助我:
请注意,我使用的是带有 Octave 3.8.1 的 Ubuntu 14.04,这类似于 matlab,但遗憾的是缺少一些命令 parfor 命令在此版本的 octave 中没有完全实现。
t=rand(1,556790);
inner_freq=rand(8193,6);
N=100; % use N chunks
nn = int32( linspace(1, length(t)+1, N+1) );
aa_sig_combined_vect=zeros(size(t));
total_time_so_far=0;
D = diag(inner_freq(1:end-1,2));
A = inner_freq(1:end-1,1);
for ii=1:N
ind = nn(ii):nn(ii+1)-1;
tic;
cosPara = 2 * pi * A * t(ind);
toc;
cosResult = cos( cosPara );
sumParaA = D * cosResult;
toc;
sumParaB = repmat(inner_freq(1:end-1,3),[1 length(ind)]);
toc;
aa_sig_combined_vect(ind) = sum( sumParaA + sumParaB );
toc;
total_time_so_far=total_time_so_far+sum(toc)
return;
end
fprintf('- Complete test in %4.4fsec or %4.4fmins\n',total_time_so_far,total_time_so_far/60);
我试图提高速度的原始工作循环如下
clear all,
t=rand(1,556790);
inner_freq=rand(8193,6);
N=100; # use N chunks
nn = int32(linspace(1, length(t)+1, N+1))
aa_sig_combined=zeros(size(t));
total_time_so_far=0;
for ii=1:N
tic;
ind = nn(ii):nn(ii+1)-1;
aa_sig_combined(ind) = sum(diag(inner_freq(1:end-1,2)) * cos(2 .* pi .* inner_freq(1:end-1,1) * t(ind)) .+ repmat(inner_freq(1:end-1,3),[1 length(ind)]));
toc
total_time_so_far=total_time_so_far+sum(toc)
end
fprintf('- Complete test in %4.4fsec or %4.4fmins\n',total_time_so_far,total_time_so_far/60);
RMSERepmat = sqrt(mean((aa_sig_combined-aa_sig_combined_vect).^2)) %root men square error between two arrays lower is better
【问题讨论】:
标签: arrays matlab for-loop octave vectorization