2017-11-08 14 views
0

の大きなアレイからの最大差と連続するベクトルの間の1以上の値を無視:スキップ/次の配列を指定し、MATLAB

[158 159 159 160 162 163 161 162 162 168 169 163 164 164 165 171 177 178 166 167] 

どのように迅速に同じ順序を維持しかしと値をスキップし、配列を再作成することができ連続するベクトル間の最大差は1より大きいか?

所望の結果である:

[158 159 159 160 161 162 162 163 164 164 165 166 167] 
+1

、あなたがしようとしたコードを追加してください。 。 – sschunara

答えて

0
A= [158 159 159 160 162 163 161 162 162 168 169 163 164 164 165 171 177 178 166 167]; 

for i=2:length(A) 
    if i>length(A) 
     break 
    end 
    while abs(A(i)-A(i-1))>1 
     A(i) = []; 
    end 
end 
  • 開始length(A)は20ですが、それは短縮されます。したがって、必要に応じて条件を確認してループをbreakする必要があります。
  • ifの代わりにwhileを使用して、連続する要素があるかどうかを確認します。たとえば、160と162の違いを確認してから、162が削除されました。それから私は
+0

バグがあります。 'A = 1:2:100'で配列' A'を変更すると、 'Index exceeds matrix dimensions .'というエラーが表示されます。 – m3tho

0

これは再帰的な解決策である。

a= [158 159 159 160 162 163 161 162 162 168 169 163 164 164 165 171 177 178 166 167]; 
ii=1; 
while true 
    l= length(a); 
    csa = circshift(a,1); 
    csa(1)=NaN; 
    a(a - csa >1) = []; 

    if l == length(a) 
     break; 
    end 
end 
disp(a) 

aアルゴリズムによって修正された入力配列です。 あなたがそれを実行すると、結果は次のとおりです。

a = [158 159 159 160 161 162 162 163 164 164 165 166 167] 

必要に応じて。

0

あなたはlogical indexingとともにdiffを使用することができます160と163の違いを確認しておく必要があります。

a = [158 159 159 160 162 163 161 162 162 168 169 163 164 164 165 171 177 178 166 167]; 

test = [false diff(a)>1]; 
while any(test) 
    a = a(~test); 
    test = [false diff(a)>1]; 
end 

返す:

a = 

    158 159 159 160 161 162 162 163 164 164 165 166 167 
+1

' test'が論理配列の場合、より長い配列でより良いパフォーマンスが得られます。 – m3tho

+0

私にヒントを与えていただきありがとうございますが、まだ、私はエラーが発生しています。これは、 'test = [0 diff(a)> 1]私は、要素の数が1536の大きな配列を使用しています。エラー:連結されている行列の次元が一貫していません。 –

+0

おそらく列ベクトルで、行ベクトルではありません。 'test = [false; diff(a)> 1];代わりに。 – excaza

関連する問題