如何识别从仅由零和一组成的第一个元素开始的向量中至少出现 10 个相邻的“1”?
A=[0 1 0 0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 1]
代码应返回 A 的索引(在此示例中为 12),其中一系列 1 开始。
最佳答案
总结:循环比 arrayfun
领先一英里!
这是一种使用经典旧循环的方法:
function x = test_loop(A)
for ii = 1:numel(A)-9
x = ii*(all(A(ii:ii+9)));
if x
break;
end
end
end
现在,让我们研究
arrayfun
与经典 for
-loops 的性能: arrayfun 方法:
test_array = @(A)find(arrayfun(@(x) all(A(x:x+9)==ones(1,10)), 1:numel(A)-9)==1,1)
A = [0 1 0 0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 1];
B = repmat(A,1,10); %% 1x300 array
f = @() test_array(A);
g = @() test_loop(A);
阵列的基准测试结果 (1x30):
timeit(f)
ans =
2.1397e-04
timeit(g)
ans =
2.6224e-05
大小为 1x300 的数组的基准测试结果:
f = @() test_array(B);
g = @() test_loop(B);
timeit(f)
ans =
0.0021
timeit(g)
ans =
2.6598e-05
如果在向量中找到第一个序列的后期,循环会慢一点,但仍然比 arrayfun 快:
B(1:220) = 0;
f = @() test_array(B);
g = @() test_loop(B);
timeit(f)
ans =
0.0021
timeit(g)
ans =
4.5033e-04
编辑:
为什么每次迭代都将计数器加 1?下面的循环大约是 for 循环的两倍,这取决于序列在向量中出现的位置以及零之间的间距。
conv
仍然较慢,但认为无论如何都值得分享:function x = test_loop(A)
ii = 1;
x = false;
while ~x
k = find(A(ii:ii+9)~=1, 1, 'last');
x = isempty(k)*ii;
ii = ii + k;
end
end
关于matlab - 如何在 MATLAB 中的向量中识别至少 10 个相邻 '1' s的第一次出现?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37980581/