2

2 つの行列が同じ要素を持っているかどうかをチェックする matlab 関数があるかどうか疑問に思っていましたが、それらは必ずしも順番通りではありませんでした。

例: A = [1,2,3] および B = [3,2,1]

関数 isequal(A,B) は 0 を返しますが、1 を返す関数またはコードが必要です。マトリックスを反復処理できることはわかっていますが、より高速な方法があるかどうか疑問に思っています。ありがとう、

4

4 に答える 4

2

ベクトルの簡単な方法は次のとおりです。

isequal(sort(A), sort(B))

行列用

isequal(sort(A(:)), sort(B(:)))

ただし、大規模な行列の場合、並べ替えが遅くなる場合があります。

于 2013-03-15T11:05:47.830 に答える
1

セット対マルチセット

これは、同じ数の複数の出現を個々のアイテムとして扱いたいか (マルチセット アプローチ)、そうでないか (セット アプローチ) によって異なります。

[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を使用するよりも遅くなります。sortunique

于 2013-03-15T13:48:24.613 に答える
0

最も効率的な方法は、次の空をチェックすることですsetxor

isempty(setxor(set1,set2))

sortただし、これがオプションよりも速いかどうかはわかりません...

于 2013-03-15T13:27:04.127 に答える
-1

試す

setdiff(A,B)

これは、求めるもののほとんど逆です。

于 2013-03-15T11:14:01.500 に答える