Вы можете использовать cellfun, но, как указано здесь, это не очень хорошо идея.
Для этого с помощью одного цикла:
c{1}=[1 2 3 4 5 6]; c{2}=[1 3 5 7];c{3}=[2 4 6 8];
c{4}=[1 4 6];c{5}=[3 7];
cSize = numel( c);
isect=cell(1,cSize)
for k=1:cSize
isect{k}=cellfun(@(in) intersect(in,c{k}),c,'UniformOutput',false);
end
Эта процедура может быть повторена, чтобы исключить другую для:
c{1}=[1 2 3 4 5 6]; c{2}=[1 3 5 7];c{3}=[2 4 6 8];
c{4}=[1 4 6];c{5}=[3 7];
isect=cellfun(@(in) cellfun(@(in2) intersect(in,in2),c,'UniformOutput',false),c,'UniformOutput',false);
isect{i}{j}
это перекресток от c{i}
до {j}
Примечание: cellfun будет выполнять внутренний цикл по значению ячейки, поэтому на самом деле вы не удаляете циклы.
Хотя это был не первоначальный вопрос, поиск подмножеств:
c{1}=[1 2 3 4 5 6]; c{2}=[1 3 5 7];c{3}=[2 4 6 8];
c{4}=[1 4 6];c{5}=[3 7];c{6}=[];
isSubset=cell2mat(cellfun(@(in) cellfun(@(in2) isequal(intersect(in,in2),in)|isempty(in),c),c,'UniformOutput',false)');
Результаты:
подмножество =
1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0
1 0 0 1 0 0
0 1 0 0 1 0
1 1 1 1 1 1
Что возвращает логическое значение, если k
является подмножеством m
, выполнив isSubset(k,m)
.
person
Werner
schedule
17.08.2013