Быстрый тест времени:
method1
- это цикл в OP.
method2
- это фиксированная версия этого ответа с использованием find
и копированием массива.
(я не добавил bwconncomp
ответ, потому что он значительно медленнее).
Результаты теста зависят, конечно, от ожидаемого количества элементов, которые нужно посетить до того, как будет найден ненулевой элемент, а также от длины массива n
. q
- местоположение первого ненулевого элемента. Я всегда беру p=10
. Время в секундах:
n q method1 method2
------ ------ ---------- ----------
1e3 p+5 5.9714e-07 2.8644e-06
1e3 end-5 3.9806e-06 3.3714e-06
1e6 p+5 6.4526e-07 0.0027
1e6 end-5 0.0029 0.0033
Таким образом, метод find
имеет время выполнения, продиктованное накладными расходами на копирование массива и вызов find
, тогда как время метода цикла определяется количеством элементов массива, которое нужно посетить, чтобы найти первый не нулевой элемент.
Тестовый код:
N = 1e6;
p = 10;
x = zeros(1,N);
%x(p+5) = 1;
x(end-5) = 1;
timeit(@()method1(x,p))
timeit(@()method2(x,p))
function ind = method1(x,p)
for ii = p:length(x)
if x(ii)~=0
ind = ii;
break
end
end
end
function ind = method2(x,p)
ind = find(x(p:end),1) + p-1;
end