【发布时间】:2021-11-15 15:56:36
【问题描述】:
我在Matlab中定义了两个相同大小的向量t和coverage,我需要定义第三个向量n_steps。
特别是我需要加快以下循环:
t = 1:100000;
coverage = double(rand(size(t)) > 0.9);
for j=1:(length(t)-1)
n_steps(j)=0;
while coverage(j+n_steps(j)+1)==0 && j+n_steps(j)+1<length(t)
n_steps(j)=n_steps(j)+1;
end
end
t是一个时间向量,每个时间步的coverage可以为1或0。
对于每个瞬间t(j),我必须找到时间步数n_steps(j) 在第一个1 出现在向量coverage(j+1:length(coverage)) 之前等待,
【问题讨论】:
-
为什么要矢量化该循环?你喜欢难以阅读的代码吗? MATLAB 循环已经很久没有变慢了。您可以改进您的代码逻辑,首先提取所有
coverage为非零的索引(find),然后为每个j找到大于j的第一个值。 -
你好克里斯·伦戈。我需要矢量化只是因为它需要很长时间才能运行。我想矢量化以更快地获得它。我正在使用 Matlab 2013,您认为这可能是问题所在吗?
-
一般来说,您可以使用
values = coverage(j+index+1)==0 && j+index+1<length(t);将while coverage(j+index+1)==0 && j+index+1<length(t);转换为位掩码。我不知道你在做什么,因为我没有t、index或coverage。 -
你应该问“我怎样才能加快这个循环?”矢量化有时会使代码更快一些,有时会使代码变慢很多。在 2006 年左右引入 JIT 之前,矢量化非常重要,但现在不再如此。为矢量化而矢量化使您看起来像是在遵循 15 年的习惯。当你写
coverage(j+index+1)时,你的意思是coverage(j+index(j)+1)吗?您是否预先分配了index?如果您提供minimal reproducible example,人们会更容易帮助您。 -
谢谢大家的回复。我试图为这个问题提供更多细节。希望你现在能更好地帮助我。
标签: matlab vectorization