2016-12-10 9 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

あなたは*完全なベクトルから 'A3'だけを計算するので、十分な値を取り除くと' A3'で指定されたインデックスが 'L'を越える位置を潜在的に参照できるように、' L'から要素を削除しています – Suever

+0

ah yes、あなたが正しいです!ありがとう – jdoubleu

答えて

1
あなたが削除のためindecesをマークして、ループの後にそれらを削除するには、論理インデックスを使用することができ

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

関連する問題