我试图对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
答案 0 :(得分:1)
嗯,原因很明显。 return
已添加到循环中,在第一次迭代后将其分解。我发现此代码所在的the answer,您可能已经注意到了这一点:
返回用于在第一次迭代后将其分解,因为它看起来与其余的迭代类似。
更一般地说:
在循环中添加tic/toc
实际上会减慢速度。打印到屏幕上的任何内容都会减慢代码的速度。 MATLAB和Octave中都有inbuilt profiling,用于试图弄清楚你的瓶颈是什么。
此外,此行在循环期间不会发生变化,因为inner_freq
并非ind
而length(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"
}
。