如何在 Matlab 中创建此代码的矢量化版本
How to create a vectorized version of this code in Matlab
我试图对我的代码进行矢量化,但遇到了这个障碍,找不到解决办法。
我有这个 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 循环的问题是它非常慢。对于大型 array01 需要很多秒,我很确定有一种聪明的方法可以做到这一点,但我太笨了看不到它。
感谢您的帮助!
这是一种基于稀疏矩阵的向量化方法:
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));
我试图对我的代码进行矢量化,但遇到了这个障碍,找不到解决办法。
我有这个 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 循环的问题是它非常慢。对于大型 array01 需要很多秒,我很确定有一种聪明的方法可以做到这一点,但我太笨了看不到它。
感谢您的帮助!
这是一种基于稀疏矩阵的向量化方法:
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));