这是一个使用的选项nchoosek
-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];
combs = nchoosek(1:numel(c),2);
subC = cell(size(combs,1),1);
for i = 1:size(combs,1)
subC{i} = intersect(c{combs(i,:)});
end
这导致单元格数组
subC =
[1x3 double]
[1x3 double]
[1x3 double]
[ 3]
[1x0 double]
[ 1]
[1x2 double]
[1x2 double]
[1x0 double]
[1x0 double]
每个单元格subC
对应于单元格索引的交集combs
(如果首选,可以在循环内轻松构建矩阵形式)。
编辑:如果您只是想知道一个向量是否是另一个向量的子集,那么您可以使用subC
and combs
from above 来确定或直接计算它
combs = nchoosek(1:numel(c),2);
isSubC = logical(eye(numel(c)));
for i = 1:size(combs,1)
subC = intersect(c{combs(i,:)});
isSubC(combs(i,1),combs(i,2)) = isequal(subC,c{combs(i,2)});
isSubC(combs(i,2),combs(i,1)) = isequal(subC,c{combs(i,1)});
end
whereisSubC(i,j)
指定是否 c{j}
是 的子集c{i}
。