Arrays 如何在Matlab中创建此代码的矢量化版本

Arrays 如何在Matlab中创建此代码的矢量化版本,arrays,matlab,time,vectorization,Arrays,Matlab,Time,Vectorization,我试图矢量化我的代码,但遇到了这个障碍,找不到答案 我有一个0和1的数组,它像秒表一样工作。我创建它的方式已经矢量化了。下面是一个例子: 现在,每当数组为1时,计数器必须开始乘以采样率,以给出当前测量的时间。每次第一个数组为0时,必须为下一组1重置秒表。这是一个结果 代码如下: timearray = zeros(size(array01)); for ii = 1:size(array01) if (array01(ii) == 0) timearray(ii) =

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

我有一个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循环的问题是速度非常慢。对于一个大阵列来说,它需要很多秒,我很确定有一个聪明的方法可以做到这一点,但我太笨了,看不见它


谢谢你的帮助

以下是一种基于稀疏矩阵的矢量化方法:

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));

你确定这是你整个计划的速度瓶颈吗?另外,请包括一个示例
array01
。如果
array01
是行向量而不是列向量,那么将
size
替换为
numel
可能更有意义。快一点吗?(我怀疑)
t=sparse(1:numel(array01),cumsum([true;diff(array01(:)>0]),array01);timearray=.005*full(最大值(总和(t,1)。*t,[],2))是的,瓶颈就在那里。速度差很大。谢谢你的代码!示例类似于array01=[0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0]问题是数组大小是500000个元素,非常感谢!我刚刚在这里测量,我的for循环:经过的时间是5.977770秒。矢量化代码:运行时间为0.002858秒。这是一个巨大的差异。我有4个这样的循环,我无法矢量化。我必须解析大约150个文件。。。时间太长了。再次感谢你!