给定矢量的单元阵列,删除作为任何其他矢量的子集的矢量

时间:2014-02-20 21:13:57

标签: matlab cell

我想删除细胞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循环来查找所有这些子集,但对于大型数据集来说它太慢了,有没有简单的方法可以做到这一点?

2 个答案:

答案 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