Вы все еще можете использовать функцию ISMEMBER, как вы сделали с небольшой модификацией:
arraysAreEqual = all(ismember(a,b)) && all(ismember(b,a))
Также вы можете записать версию цикла с STRCMP в одну строку:
arraysAreEqual = all( cellfun(@(s)any(strcmp(s,b)), a) )
РЕДАКТИРОВАНИЕ: Я добавляю третье решение, адаптированное из другого ТАК вопрос :
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