2

行列に特定のベクトルが含まれているかどうかを確認するための高速で簡潔な方法を探しています。例:

 bigMatrix = [1 1 1; 2 2 2; 4 4 4; 5 5 5];

 someFunction(bigMatrix, [1 1 1]) % = true
 someFunction(bigMatrix, [3 3 3]) % = false

そのような関数/演算子はありますか、それともループが必要ですか?

4

1 に答える 1

10

私は次の解決策を提案します:

bigMatrix = [1 1 1; 2 2 2; 4 4 4; 5 5 5];
Vec = [2 2 2];
Index = ismember(bigMatrix, Vec, 'rows');

結果?

Index =

 0
 1
 0
 0

ismemberは、あるセットの要素が別のセットにあるかどうかをチェックする非常に便利な関数です。ここでは、rowsオプションを利用して、個々の要素ではなく、関数に行を比較させます。

更新:一方、いくつかの速度テストを行うことは常に価値があります!ismemberこのアプローチを次の代替方法と比較しました。

N = size(bigMatrix, 1);
Index2 = zeros(N, 1);
for n = 1:N
    if all(bigMatrix(n, :) == Vec)
        Index2(n) = 1;
    end
end

私の発見?問題のサイズbigMatrix!特に、bigMatrixが小さい側(多少誤称)の場合、ループははるかに高速です。bigMatrix最初のアプローチは、大きくなった場合にのみ推奨されます。bigMatrixさらに、結果は、行だけでなく、列の数にも依存します。アプリケーションの両方のアプローチをテストしてから、どちらか速い方を使用することをお勧めします。(編集:これはR2011aにありました)

一般的な注意:ここ数年でMatlabのループがどれほど速くなったかに絶えず驚いています。Methinksのベクトル化されたコードは、かつての聖杯ではなくなりました。

于 2012-10-29T11:51:37.523 に答える