您仍然可以像稍作修改一样使用 ISMEMBER 函数:
arraysAreEqual = all(ismember(a,b)) && all(ismember(b,a))
另外,你可以用 STRCMP 将循环版本写成一行:
arraysAreEqual = all( cellfun(@(s)any(strcmp(s,b)), a) )
编辑:我正在添加第三个解决方案,改编自另一个SO question:
g = grp2idx([a;b]);
v = all( unique(g(1:numel(a))) == unique(g(numel(a)+1:end)) );
本着同样的精神,我进行了时间比较(使用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