【问题标题】:How to create a vectorized version of this code in Matlab如何在 Matlab 中创建此代码的矢量化版本
【发布时间】:2021-05-21 19:16:44
【问题描述】:

我试图对我的代码进行矢量化,但遇到了这个障碍,找不到答案。

我有这个由 0 和 1 组成的数组,它就像秒表一样工作。我创建它的方式已经被矢量化了。这是它的一个示例:

array of 0 and 1

现在,只要数组为 1,就必须启动一个计数器乘以一个采样率,才能得到当前测量的时间。并且每次第一个数组为0时,秒表必须为下一组1重置。这是它的结果。

array of calculated time

代码是这样的:

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


【解决方案1】:

这是一种基于稀疏矩阵的向量化方法:

array01 = [0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0].'; % example data
sample_period = 0.005;                                       % example data
t = sparse(1:numel(array01), cumsum([true; diff(array01(:))>0]).', array01);
timearray = sample_period*full(max(cumsum(t, 1).*t, [], 2));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    相关资源
    最近更新 更多