これは簡単な質問のようですが、どこにも答えが見つかりませんでした。任意の数の行で構成されるMatlab行列がある場合、関数の値(引数が行ベクトル)にA
基づいてこれらの行をフィルター処理するにはどうすればよいですか?f
言い換えると、行列の行のみを保持するにはどうすればよいでしょA
うf
かtrue
。私は試した
A(f(A(:)), :)
しかし、成功しませんでした。どんな助けでも大歓迎です。
ダンが答えたように、論理ベクトルに従って行列の行をフィルタリングできます。行を保持し、行を破棄するselectRows
論理ベクトルとしnumel(selectRows) == size(A,1)
ます。それで:true
false
A( ~selectRows, : ) = [];
のすべての行を削除しますselectRows == false
。
さて、問題はselectRows
、関数f
?を使用して論理ベクトルを生成する方法です。
f
複数の行を処理する方法を知っていて、それに応じて複数のtrue
/false
値を返す場合、
selectRows = f(A);
トリックを行う必要があります。
ただし、f
一度に 1 つの行を処理する方法しか知らない場合は、行をループする必要があります。そうする1つの方法は
selectRows = cellfun( @f, mat2cell( A, ones(size(A,1)), size(A,2) ) );
質問は少し不明確です (フィルタリングの基準を提供する必要があります) が、Matlab の論理インデックスを利用する必要があるように思えます。
この非常に不自然な例を試してください:
A = rand(7)
A = A(logical([1 1 0 0 0 1 1]), :)
ここでは、保持する行と列 (この場合はすべて) を Matlab に指示して、行 3 ~ 5 を除外します。
ベクトルを条件として作成することで、見苦しいキャストを回避できます。
A = rand(5)
A([1 0 1 1 0] == 1, :)
もちろん、フィルター条件がわかっている場合は、この方法で論理インデックスを作成する方がはるかに簡単です。例として、合計が 10 より大きいすべての行をフィルター処理すると仮定します。ステップ 1 は、それらの行を見つけることです (保持する行またはフィルターする行のいずれかは関係ありません)。
rowsToFilter = sum(A, 2) > 10;
を使用せずにコマンド ラインで試してみると;
、行に沿って合計2
され (sum 引数の )、10
論理値のベクトル (Matlab のブール型) を作成することによってより大きいものだけが選択されることがわかります。A をフィルタリングするには、次のようにします。
A(rowsToFilter, :) = [];
= [] は、フィルター処理する行を空のベクトルに設定します。Matlab は、これらの要素を行列から削除すると認識します。
次のように保持する行を選択することで、同じことができます。
rowsToKeep = sum(A, 2) <= 10;
A = A(rowsToKeep, :);
この最後の形式は、試したものと非常に似ていることに気付くでしょう。f(A) = sum(A, 2) <= 10