4

これは私の非常に一般的な問題のようです:

data = [1 2 3; 4 5 6];
mask = [true false true];

mask = repmat(mask, 2, 1);

data(mask) ==> [1; 4; 3; 6]

私が欲しかったのは[1 3; 4 6]

はい、私はreshapeそれを適切なサイズにすることができますが、それは間違った方法のようです。もっと良い方法はありますか?data(mask)実際に長方形であるのに、なぜ行列を返さないのですか?一般的なケースではそうではないかもしれませんが、私の場合、元のマスクは配列であるため、常にそうなります。

当然の結果

回答ありがとうございます。これは、、、、などの数値インデックスを返すものでも機能することを指摘したいとismember思いsortますunique

以前は、この概念を使用して1回のショットで実行できる場合に、から2番目の戻り値を取得しsort、それをすべての列に手動で適用していました。

4

1 に答える 1

12

これはあなたが望むものをあなたに与えるでしょう:

>> data = [1 2 3; 4 5 6];
>> mask = [true false true];
>> data(:,mask)

ans =

     1     3
     4     6

maskこれが機能するのは、論理インデックスを列に適用し、ですべての行を選択できるためです:

2次元論理配列が入力に使用されている場合でも、出力はインデックス値の列配列になります。これは、インデックス付けされた要素が2次元(つまり長方形)の出力に編成できるという保証がないためです。2Dマスクが次のとおりであるかどうかを検討してください。

mask = [true false true; true false false];

これにより、3つの値にインデックスが付けられ、出力の行または列ベクトル以外に編成することはできません。別の例を次に示します。

mask = [true true true; true false false];

これは4つの値にインデックスを付けますが、3つは最初の行からのもので、1つは2番目の行からのものです。これらの値をどのように長方形の出力マトリックスに整形する必要がありますか?一般に、任意の2次元インデックス行列に対してこれを行う明確な方法がないため、インデックス付きの値の列ベクトルが返されます。

于 2010-04-29T17:55:13.507 に答える