【发布时间】:2018-01-20 18:36:54
【问题描述】:
我希望能够对这个函数的 for 循环进行矢量化,然后能够以八度音阶并行化它。这些 for 循环可以向量化吗?非常感谢您!
我附上函数的代码,注释每个for循环和if-else的开始和结束。
function [par]=pem_v(tsm,pr)
% tsm and pr are arrays of N by n. % par is an array of N by 8
tss=[27:0.5:32];
tc=[20:0.01:29];
N=size(tsm,1);
% main-loop
for ii=1:N
% I extract the rows in each loop because each one represents a sample
sst=tsm(ii,:); sst=sst'; %then I convert each sample to column vectors
pre=pr(ii,:); pre=pre';
% main-condition
if isnan(nanmean(sst))==1;
par(ii,1:8)=NaN;
else
% first sub-loop
for k=1:length(tss);
idxx=find(sst>=tss(k)-0.25 & sst<=tss(k)+0.25);
out(k)=prctile(pre(idxx),90);
end
% end first sub-loop
tp90=tss(find(max(out)==out));
% second sub-loop
for j=1:length(tc)
cond1=find(sst>=tc(j) & sst<=tp90);
cond2=find(sst>=tp90);
pem=zeros(length(sst),1);
A=[sst(cond1),ones(length(cond1),1)];
B=regress(pre(cond1),A);
pt90=B(1)*(tp90-tc(j));
AA=[(sst(cond2)-tp90)];
BB=regress(pre(cond2)-pt90,AA);
pem(cond1)=max(0,B(1)*(sst(cond1)-tc(j)));
pem(cond2)=max(0,(BB(1)*(sst(cond2)-tp90))+pt90);
clear A B AA BB;
E(j)=sqrt(nansum((pem-pre).^2)/length(pre));
clear pem;
end
% end second sub-loop
tcc=tc(find(E==min(E)));
% sub-condition
if(isempty(tcc)==1);
par(ii,1:9)=NaN;
else
cond1=find(sst>=tcc & sst<=tp90);
cond2=find(sst>=tp90);
pem=zeros(length(sst),1);
A=[sst(cond1),ones(length(cond1),1)];
B=regress(pre(cond1),A);
pt90=B(1)*(tp90-tcc);
AA=[sst(cond2)-tp90];
BB=regress(pre(cond2)-pt90,AA);
pem(cond1)=max(0,B(1)*(sst(cond1)-tcc));
pem(cond2)=max(0,(BB(1)*(sst(cond2)-tp90))+pt90);
RMSE=sqrt(nansum((pem-pre).^2)/length(pre));
% outputs
par(ii,1)=tcc;
par(ii,2)=tp90;
par(ii,3)=B(1);
par(ii,4)=BB(1);
par(ii,5)=RMSE;
par(ii,6)=nanmean(sst);
par(ii,7)=nanmean(pre);
par(ii,8)=nanmean(pem);
end
% end sub-condition
clear pem pre sst RMSE BB B tp90 tcc
end
% end main-condition
end
% end main-loop
【问题讨论】:
-
了解这段代码做了什么会有所帮助 - 我们需要示例输入和预期输出来验证任何建议。此外,您可以采取一些措施来加快代码速度,甚至无需尝试矢量化,例如删除
clear语句(并编写不需要它们的代码),因为clear很慢。 -
这是很多代码,希望人们在没有任何解释或任何尝试自己矢量化的情况下阅读。请添加对您的代码作用的说明。
-
@Wolfie JOSE 显然喜欢删除一些代码(例如 stackoverflow.com/questions/48273556/…)并询问“我如何对其进行矢量化和并行化”。显然他真正想要(但不是要求)是减少执行时间。还有一些其他相关的问题,但一旦有否定的 cmets,JOSE 就会删除它们
-
@Andy 感谢您提供信息。碰巧的是,JOSE 的代码 could be sped up 所以我给出了一些提示,以及修改后的代码,希望他们能在未来的编码中采用这些提示。虽然这不是一个很好的模式,但我敢肯定,随着时间的推移,愿意提供帮助的人会越来越少。
标签: matlab loops parallel-processing vectorization octave