小さな変更を加えた場合と同じように、ISMEMBER関数を引き続き使用できます。
arraysAreEqual = all(ismember(a,b)) && all(ismember(b,a))
また、STRCMPを使用してループバージョンを1行で記述できます。
arraysAreEqual = all( cellfun(@(s)any(strcmp(s,b)), a) )
編集:私は別のSOの質問から適応した3番目のソリューションを追加しています:
g = grp2idx([a;b]);
v = all( unique(g(1:numel(a))) == unique(g(numel(a)+1:end)) );
同じ精神で、Imは(TIMEIT関数を使用して)時間比較を実行しました。
function perfTests()
a = cellstr( num2str((1:10000)') ); %#' fix SO highlighting
b = a( randperm(length(a)) );
timeit( @() func1(a,b) )
timeit( @() func2(a,b) )
timeit( @() func3(a,b) )
timeit( @() func4(a,b) )
end
function v = func1(a,b)
v = isempty(setxor(a,b)); %# @gnovice answer
end
function v = func2(a,b)
v = all(ismember(a,b)) && all(ismember(b,a));
end
function v = func3(a,b)
v = all( cellfun(@(s)any(strcmp(s,b)), a) );
end
function v = func4(a,b)
g = grp2idx([a;b]);
v = all( unique(g(1:numel(a))) == unique(g(numel(a)+1:end)) );
end
結果は同じ順序の関数になります(低いほど良い):
ans =
0.032527
ans =
0.055853
ans =
8.6431
ans =
0.022362