拆分FOR循环进行矢量化,使其运行更快的编码问题

时间:2015-06-25 09:42:22

标签: arrays matlab for-loop octave vectorization

我试图对FOR循环进行矢量化和拆分以使其运行得更快但变量" aa_sig_combined_vect "在单元格5569 之后开始返回除了零之外什么都不知道怎么解决这个问题?请参阅下面的代码用户 krisdestruction 帮助我:

请注意我使用Ubuntu 14.04和Octave 3.8.1这就像matlab一样,但遗漏了一些命令,遗憾的是parfor命令在这个八度音阶版本中没有完全实现。

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

1 个答案:

答案 0 :(得分:1)

嗯,原因很明显。 return已添加到循环中,在第一次迭代后将其分解。我发现此代码所在的the answer,您可能已经注意到了这一点:

  

返回用于在第一次迭代后将其分解,因为它看起来与其余的迭代类似。

更一般地说: 在循环中添加tic/toc实际上会减慢速度。打印到屏幕上的任何内容都会减慢代码的速度。 MATLAB和Octave中都有inbuilt profiling,用于试图弄清楚你的瓶颈是什么。

此外,此行在循环期间不会发生变化,因为inner_freq并非indlength(ind)确实如此,repmat(inner_freq(1:end-1,3),[1 length(ind)]); 应该相同:

repmat

因此,您也可以将其移出,并避免多次调用array(4) { [0]=> string(14) "Bergen op Zoom" [1]=> string(9) "jan steen" [2]=> string(7) "culture" [3]=> string(11) "Netherlands" } array(8) { [0]=> string(14) "fasion" [1]=> string(9) "conceptial" [2]=> string(7) "industrial" [3]=> string(11) "Netherlands" }