【发布时间】:2021-05-21 19:16:44
【问题描述】:
我试图对我的代码进行矢量化,但遇到了这个障碍,找不到答案。
我有这个由 0 和 1 组成的数组,它就像秒表一样工作。我创建它的方式已经被矢量化了。这是它的一个示例:
现在,只要数组为 1,就必须启动一个计数器乘以一个采样率,才能得到当前测量的时间。并且每次第一个数组为0时,秒表必须为下一组1重置。这是它的结果。
代码是这样的:
timearray = zeros(size(array01));
for ii = 1:size(array01)
if (array01(ii) == 0)
timearray(ii) = 0;
else
timearray(ii) = 0.005 + timearray (ii-1);
end
end
这个 for 循环的问题是非常缓慢。对于大型数组01,它需要很多秒,我很确定有一个聪明的方法可以做到这一点,但我太笨了,看不到它。
感谢您的帮助!
【问题讨论】:
-
您确定这是您整个程序的速度瓶颈吗?另外,请包括一个示例
array01。如果array01是行向量而不是列向量,则将size替换为numel可能更有意义 -
这是一种矢量化方法。是不是更快了? (我怀疑)
t = sparse(1:numel(array01), cumsum([true; diff(array01(:))>0]).', array01); timearray = .005*full(max(cumsum(t, 1).*t, [], 2)); -
是的,瓶颈就在那里。速度差异很大。感谢您的代码!这个例子就像 array01 = [0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0, 0,0]问题是数组大小是500000个元素太感谢了!
-
我刚刚在这里测量,我的for循环:经过的时间是5.977770秒。您的矢量化代码:经过的时间是 0.002858 秒。这是一个巨大的差异。我有 4 个无法矢量化的 for 循环。而且我必须解析大约 150 个文件……时间太长了。再次感谢您!
标签: arrays matlab time vectorization