2016-12-10 4 views
0

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

Index exceeds matrix dimensions.

Error in bereinigen (line 9) C1=L(A1+1);

L=[-300 100  0 200 -100 100 0 -300 ]; 

A3=find(L==0); 
U=length(A3); 
for x=1:U 
    A1=A3(x); 
    C1=L(A1+1); 
    C2=L(A1-1); 
    B1=sign(C1); 
    B2=sign(C2); 
    if B1==B2 
     D1=min(C1,C2); 
      if D1==C1 
       L(A1+1)=[]; 
       E1=find(L==0); 
       E1=E1(1); 
       L(E1)=[]; 
      elseif D1==C2 
       L(A1-1)=[]; 
       E1=find(L==0); 
       E1=E1(1); 
       L(E1)=[]; 
      end 
    else 
     return 
    end 
end 

Благодарим за помощь

+2

Вы удаляете элементы из 'L', поэтому индексы, заданные' A3', могут ссылаться на позиции за пределами 'L', если вы удаляете достаточно значений, поскольку вы только вычисляете' A3' из * всего * vector – Suever

+0

ах да, Ты прав! Спасибо – jdoubleu

ответ

1

Вы можете использовать логическую индексацию, чтобы пометить для удаления индексов, а затем удалить их после цикла

L=[-300 100 0 200 -100 100 0 -300 ]; 
Inds = true(size(L)); 
A3=find(L==0); 
U=length(A3); 
for x=1:U 
    A1=A3(x); 
    C1=L(A1+1); 
    C2=L(A1-1); 
    B1=sign(C1); 
    B2=sign(C2); 
    if B1==B2 
     D1=min(C1,C2); 
     if D1==C1 
      Inds(A1+1)=false; 
      Inds(A1)=false; 
     elseif D1==C2 
      Inds(A1-1)=false; 
      Inds(A1)=false; 
     end 
    else 
     break 
    end 
end 
L = L(Inds); 

Остерегайтесь, что L(A1+1) также может привести к ошибке за пределами границ. Вы должны попытаться справиться с этой возможностью.

+0

спасибо это помогает! – jdoubleu

Смежные вопросы