我想删除细胞c的所有子集,假设我有6个细胞载体:c {1} = [1 2 3]; c {2} = [2 3 4]; c {3} = [1 2 3 4 5 6]; c {4} = [2 3 4 7]; c {5} = [2 3 7]; c {6} = [4 5 6];然后我想删除[1 2 3],[2 3 4]和[4 5 6]。我使用两个for循环来查找所有这些子集,但对于大型数据集来说它太慢了,有没有简单的方法可以做到这一点?
答案 0 :(得分:1)
如果向量是任何其他向量的子集,则以下代码将删除该向量。该方法与my answer to this other question非常相似:
n = numel(c);
[i1 i2] = meshgrid(1:n); %// generate all pairs of cells (their indices, really)
issubset = arrayfun(@(k) all(ismember(c{i1(k)},c{i2(k)})), 1:n^2); %// subset?
issubset = reshape(issubset,n,n) - eye(n); %// remove diagonal
c = c(~any(issubset)); %// remove subsets
请注意,在您的示例中,还应删除[2 3 7]
。
答案 1 :(得分:0)
您可以使用以下方法找到与特定输入向量s1完全匹配的单元格:
indx = find(cell2mat(cellfun(@(x)strcmp(num2str(x),num2str(s1)),c,'un', 0)));
然后你可以循环匹配(现在应该是一个小得多的集合),并通过将它们的内容设置为空集来删除它们:
for ii=1:length(indx)
c{:,ii} = [];
end