matlabで2つの配列を持つゼロペアをすべて削除するにはどうすればよいですか?
x = [0 0 0 1 1 0 5 0 7 0]
y = [0 2 0 1 1 2 5 2 7 0]
私たちが得るように
x2 = [0 1 1 0 5 0 7]
y2 = [2 1 1 2 5 2 7]
?
これは、論理インデックスを使用して非常に簡単に解決できます。
x = [0 0 0 1 1 0 5 0 7 0]
y = [0 2 0 1 1 2 5 2 7 0]
idx = ~(x==0 & y==0);
x2 = x(idx)
y2 = y(idx)
配列idx
には0
wherex
とy
があり、両方ともゼロであり、1
それ以外の場合です。このような配列を使用してインデックスを作成すると、インデックスがtrue(1
)の値のみが返されます。
編集:それを繰り返したい場合は、そのfor
周りにループを置くだけです。難しいことではありませんが、あいまいな説明では、あいまいなコード(または、実際に必要なものには複雑すぎるセル配列を含む非常に複雑なコード)しか提供できません。
for i = ...
x = % dependent on i
y = % dependent on i
idx = ~(x==0 & y==0);
x2 = x(idx)
y2 = y(idx)
end
あなたは書くことができます:
idx = any([x;y]);
またはさらに良い
idx = x|y;
次に、論理インデックスを適用して要素を選択します。
x2 = x(idx)
y2 = y(idx)
論理インデックス、追加のみ、およびインプレース変更を使用したポジティブのコンパクトな代替手段:
idx = ~(x+y);
x(idx)=[];
y(idx)=[];
編集: 2 つの配列の対応する要素の合計がゼロになる可能性がある符号付き整数の場合、==
またはの~=
比較 を回避できます。
idx = ~(abs(x)+abs(y))