2014-12-02 5 views
0

Я бы выделил число первых последовательных нулевых элементов. Например, в [0 0 1 -5 3 0] мы имеем два нулевых последовательных элемента, которые появляются сначала в векторе.Подсчитайте число первых нулевых элементов

Не могли бы вы предложить способ без использования для петель?

+0

После того, как последовательность нулей concecutive первым номером нет необходимости 1. Может быть любое количество, например [0 0 4 5 0 2], [0 0 0 0 3]. – Thoth

+0

Это не обязательно 1, '1' в приведенных ниже кодах для индекса, а не для значений. – Adiel

+0

Я вижу несколько интерпретаций вопроса. Будет ли «[6 4 3 0 1 2 0 0 5]' ouput '1',' 2', '4' или' 7'? –

ответ

4
V=[0 0 1 -5 3 0] ; 
k=find(V); 
Number_of_first_zeros=k(1)-1; 

Или

Number_of_first_zeros=find(V,1,'first')-1; 

Для решения @The миньон комментарий (если это была цель):

Number_of_first_zeros=find(V(find(~V,1,'first'):end),1,'first')-find(~V,1,'first'); 
+0

работает, только если данные начинаются с набора нулей. нет, если это так, как '[1 2 0 0 0 3 5123 ...]' –

1

Вы могли бы найти положение первого ненулевого элемента с помощью функции поиска.

I=find(A, 1); 

Число ведущих нулей тогда I-1.

+0

работает, только если данные начинаются с набора нулей. нет, если он похож на '[1 2 0 0 0 3 5123 ...]' –

0

Мое решение довольно сложно, но оно не использует петли, и это делает трюк. Я уверен, что существует более прямой подход. На всякий случай никто больше не говорит о рабочем решении здесь моя идея.

x=[1 2 4 0 20 0 10 1 23 45]; 
x1=find(x==0); 
if numel(x1)>1 
    x2=[x1(2:end), 0]; 
    x3=x2-x1; 
    y=find(x3~=1); 
    y(1) 
elseif numel(x1)==1 
    display(1) 
else 
    display('No zero found') 
end 

x - это набор данных. x1 содержит индекс всех нулевых элементов. x2 содержит все те индексы, за исключением первого (поскольку размеры матрицы должны совпадать, добавлен один ноль). - это разница между индексом и предыдущим индексом нулей в вашем наборе данных. Теперь я нахожу все эти отличия, которые не являются 1 (do не соответствуют последовательностям нулей), а первый индекс (из этих данных является требуемым результатом. Случай if необходим, если у вас всего один или вообще нет нуля.

1

Используйте логический массив, чтобы найти нули и а затем посмотреть на то, где нули и единицы чередуются.

V=[1 2 0 0 0 3 5123]; 
diff(V==0) 
ans = 

    0 1 0 0 -1 0 

Создать образец йа ta

V=[1 2 0 0 0 3 5123]; 

Найти нули. Результат будет логический массив, в котором 1 представляет расположение нулей

D=V==0 
D = 

    0 0 1 1 1 0 0 

Возьмите разницу этого массива. 1 будет представлять начало, а -1 будет представлять конец.

T= diff(D) 
ans = 

    0 1 0 0 -1 0 

find(T==1) даст вам старт и find(T==-1) даст вам конец. Первым индексом + 1 T==1 было бы начало первого набора нулей, и первый индекс T==-1 был бы концом первого набора нулей.

0

Я предполагаю, что ваш вопрос следующий: для следующего вектора [0 0 1 -5 3 0] я хотел бы найти индекс первого элемента пары значений 0. Это верно? Следовательно, желаемый результат для вашего вектора будет «1»?

Чтобы расширить другие ответы, чтобы найти любые такие пары, а не только 0 0 (например, 0 1, 0 2, 3 4 и т. Д.), Это может помочь.

% define the pattern

ptrn = [ 0 0 ];

difference = ptrn(2) - ptrn(1)

V = [0 0 1 -5 3 0 0 2 3 4 0 0 1 0 0 0]

x = diff(V) == difference

indices = find(x)

индексы =

1  6 11 14 15 
Смежные вопросы