2016-12-10 15 views
0

私はvector array要素をチェックし、現在の要素が以前のx(m)=x(m+1)と等しいかどうかをチェックしたい場合はコードを作成しています。 。 どうやってするか?私がしようとしたものをここでMATLABのベクトル配列からインデックスを選択または除外します

、:

vg=vg1(441777:448207); 

j=zeros(size(vg)); 

for m=1:6431; 
    if m+1<6432 
     if vg(m)==vg(m+1) 
      j(m)=[]; 
     else 
      j(m)=vg(m); 
     end 
    end 
end 

しかし、それは動作していないと、それはエラーになります,,だから私はそれを行う方法を知っているかもしれませんか?

答えて

0

ループ内の要素を積極的に削除していて、後でその要素にアクセスしようとしている可能性があります。代わりに、NaNの値でいっぱいになったjをして、最後にNaNの値を削除する必要があります。

j = nan(size(vg)); 

% Go ahead and keep the first value 
j(1) = vg(1); 

% Just start at 2 and look backwards rather than using an if statement 
% every time through the loop 
for m = 2:numel(vg) 
    % Only change the value in j to a number if it's new 
    if vg(m - 1) ~= vg(m) 
     j(m) = vg(m); 
    end 
end 

% Remove all of the NaN values (the duplicates) 
j = j(~isnan(j)); 

良好ベクトル化手法は、異なる数の連続する要素間の差を計算し、ある場所を識別するためにdiffを使用(diff結果~= 0である)と論理としてdiff(values) ~= 0の出力を用いて、それらの要素のみを維持するであろうインデックスはvaluesになります。

values = [1 1 2 3 4 4 4 5 5 1 2 2]; 
result = values([true, diff(values) ~= 0]); 
%  1  2  3  4  5  1  2 

我々は常に最初の要素を含めることになるでしょうので、diff(values) ~= 0の出力の先頭にtrueを付加する必要があります注意してください。

0

ベクトルjの長さがループ内で変化するため、上記のコードは機能しません。したがって、ある程度のステップmでは、誤差が大きくなる長さ(j)が大きくなります。

また、matlabのforループは非常に遅いため、行列形式の計算が望ましい(そしてクリアな)方法です。

vg = [1 1 2 3 4 4 4 5 5 1 2 2]; 
df = [1 diff(vg)]; 
vg(df == 0) = []; 
関連する問題