0

私はMatlabで簡単なスクリプトを書いています.隣接する要素を比較し、それらの間に違いがある場合はそれらの1つを削除します.

for i=1:length(Vector) - 1
if Vector(i+1) - Vector(i) == 1
    Vector(i) = [];
end
 if i == length(Vector) 
    break
 end

終わり

ただし、インデックスが範囲外であるというエラーが表示されます。理由はわかりませんが、私のアルゴリズムは機能するはずです。内部関数でこれを行う簡単な方法はありますか?

4

3 に答える 3

3

問題は、次の場合です。

Vector(i) = []

配列のサイズを変更すると、最初に探していない結果が生成され、次にコード内の if 条件がスクリプトの範囲外への移動を妨げません。これを解決する 1 つの方法は、補助ベクトルを使用することです。

Vector = [1,5,6,3,5,7,8,9];
tmp = [];
j = 1;

for i=1:length(Vector)-1
    if Vector(i+1) - Vector(i) == 1
        continue
    end
    tmp(j) = Vector(i);
    j = j + 1;
end

tmp(end+1) = Vector(end);
Vector = tmp

常に最後の要素を保持したいと思っていることに注意してください。

for ループを回避したい場合は、次のこともできます。

Vector = [1,5,6,3,5,7,8,9];
tmp = circshift(Vector, [0,-1]); %shifted version of Vector
tmp(end) = Vector(end)+2; %To ensure that the last element will be included
index = tmp-Vector ~= 1; %indices that satisfy the condition
Vector = Vector(index)
于 2013-08-25T20:57:50.743 に答える
0

こう思う

ベクトル(i+1) - ベクトル(i) == 1の場合

サイズ1のベクトルがある場合、インデックスi + 1が存在しない場合に問題になる可能性があります

于 2013-08-25T19:54:56.293 に答える