2 つの行列が同じ要素を持っているかどうかをチェックする matlab 関数があるかどうか疑問に思っていましたが、それらは必ずしも順番通りではありませんでした。
例: A = [1,2,3] および B = [3,2,1]
関数 isequal(A,B) は 0 を返しますが、1 を返す関数またはコードが必要です。マトリックスを反復処理できることはわかっていますが、より高速な方法があるかどうか疑問に思っています。ありがとう、
ベクトルの簡単な方法は次のとおりです。
isequal(sort(A), sort(B))
行列用
isequal(sort(A(:)), sort(B(:)))
ただし、大規模な行列の場合、並べ替えが遅くなる場合があります。
これは、同じ数の複数の出現を個々のアイテムとして扱いたいか (マルチセット アプローチ)、そうでないか (セット アプローチ) によって異なります。
[1, 2, 3]
と同じ (セット アプローチ)か[1, 2, 3, 3]
、そうでない (マルチセット アプローチ) か?
reverse_engineer の提案によると:
f_xor = @(x, y) isempty(setxor(x, y))
H. Muster のアプローチのセットバリアント:
f_sortu = @(x, y) isequal(sort(unique(x(:))), sort(unique(y(:))))
H.Muster の提案によると:
f_sort = @(x, y) isequal(sort(x(:)), sort(y(:)))
ここでは、個々のバリアントのタイミングを示します。
>> A = rand(1, 1000);
>> B = A; B(end) = B(end) - 1; % Make vectors almost equal
>> N = 10000;
>> tic; for i = 1 : N; f_sort(A, B); end; toc/N
ans =
1.6892e-04
>> tic; for i = 1 : N; f_sortu(A, B); end; toc/N
ans =
3.5647e-04
>> tic; for i = 1 : N; f_xor(A, B); end; toc/N
ans =
5.4098e-04
set アプローチは、重複を削除する必要があるため、処理が遅くなります。興味深いことに、+setxor
を使用するよりも遅くなります。sort
unique
最も効率的な方法は、次の空をチェックすることですsetxor
。
isempty(setxor(set1,set2))
sort
ただし、これがオプションよりも速いかどうかはわかりません...
試す
setdiff(A,B)
これは、求めるもののほとんど逆です。