3行と多数の列を持つ大きな行列があります。最初のオカレンス以外のすべての行でゼロを持つ列を削除したい。最初のオカレンス以外のすべての行エントリがゼロである列を削除する
例えば、以下の行列所与:
1 1 0 0 0 0 0 0
A = 1 0 0 1 0 0 0 0
1 0 1 1 0 0 0 0
それは、このように変換されるであろう:
1 1 0 0 0
A = 1 0 0 1 0
1 0 1 1 0
3行と多数の列を持つ大きな行列があります。最初のオカレンス以外のすべての行でゼロを持つ列を削除したい。最初のオカレンス以外のすべての行エントリがゼロである列を削除する
例えば、以下の行列所与:
1 1 0 0 0 0 0 0
A = 1 0 0 1 0 0 0 0
1 0 1 1 0 0 0 0
それは、このように変換されるであろう:
1 1 0 0 0
A = 1 0 0 1 0
1 0 1 1 0
一つのアプローチは次のようになりall
を使用し、すべての列をすべての行に沿って検索して、列内のすべての要素これらの列の位置は、find
を使用して決定します。すぐにあなたがそうであるように、元の行列のコピーを作成しておくこと、そして私たちは、このような列に遭遇した最初の時間を除いてゼロを持っているすべての列ダンプ:あなたの例では
ind = find(all(A == 0, 1));
out = A;
out(:,ind(2:end)) = [];
を、我々が得る:
>> out
out =
1 1 0 0 0
1 0 0 1 0
1 0 1 1 0
完全なゼロの列がなくても、find
は空の配列を返し、空の配列にスライスすると空の配列も生成されます。したがって、最後のコード行での削除手順は効果がなく、前と同じ行列を維持します。制約があなただけの行列の末尾にゼロの列が表示され、それらが有効なデータの間には表示されませんように維持されている場合は
、我々は論理的インデックスでany
とall
を組み合わせることにより、これを行うことができます:
out = A(:,any(A,1) | diff([false all(A == 0, 1)]));
マスクの最初の部分が非ゼロのすべての列で構成されるマスクを作成します。この文脈におけるany
は、ゼロでないすべての列を見つける。これは、データの最初の段階で発生し、マスクの前半を構築する必要があります。次の部分はdiff
を使用して、前に見た同じall
呼び出しによって出力された配列との組み合わせでペアの違いを見つけます。最初の列はゼロではないことが想定されているので、最初の要素がfalse
に続いて同じall
が呼び出される配列を埋め込むと、の1つだけの論理配列が決定されます。最初にゼロの列が返される点であるゼロ以外の値が返されます。マスク内のこの位置を真であるように設定し、他のゼロ以外の位置に設定して、最終的にマトリックスにサブセットを設定して結果を達成します。
あなたの例はまだゼロの列を持っていますが、これは意図的ですか? – excaza
はい、ゼロの開始位置から最初の列を保持したい –
いつもすべてゼロの列が必要ですか? – TroyHaskin