行列に特定のベクトルが含まれているかどうかを確認するための高速で簡潔な方法を探しています。例:
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
そのような関数/演算子はありますか、それともループが必要ですか?
行列に特定のベクトルが含まれているかどうかを確認するための高速で簡潔な方法を探しています。例:
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
そのような関数/演算子はありますか、それともループが必要ですか?
私は次の解決策を提案します:
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のベクトル化されたコードは、かつての聖杯ではなくなりました。