Этот подход находит различия между тем, когда A идет от 0 до 1 (нарастающий фронт) и от 1 до 0 (нарастающий фронт). Это дает длины последовательных 1 в каждом блоке. Затем разделите эти числа на 3 и округлите, чтобы получить количество прогонов 3.
Заполнение A
с 0 в начале и в конце просто гарантирует, что у нас будет передний фронт в начале, если A начинается с a 1, и у нас есть падающий фронт в конце, если A заканчивается 1.
A = round(rand(1,1000));
% padding with a 0 at the start and end will make this simpler
B = [0,A,0];
rising_edges = ~B(1:end-1) & B(2:end);
falling_edges = B(1:end-1) & ~B(2:end);
lengths_of_ones = find(falling_edges) - find(rising_edges);
N = sum(floor(lengths_of_ones / 3));
или в гораздо менее читаемых 2 строках:
A = round(rand(1,1000));
B = [0,A,0];
N = sum(floor((find(B(1:end-1) & ~B(2:end)) - find(~B(1:end-1) & B(2:end))) / 3));