【问题标题】:Given a cell array of vectors, delete vectors that are subsets of any other vector给定一个向量元胞数组,删除作为任何其他向量子集的向量
【发布时间】:2014-02-20 21:13:57
【问题描述】:

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

【问题讨论】:

  • 你能指定删除的标准吗?它取决于位置,还是取决于单元格内容?

标签: matlab cell


【解决方案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] 也应该被删除。

【讨论】:

  • 关键是我不知道那些子集,我需要先找到它们,然后删除它们。
  • 如果不知道要删除哪些子集,如何找到或删除?
  • 可能我没有解释清楚,我有一些细胞向量,其中一些是其他细胞向量的子集,我想先找到它们,然后删除它们。
  • @Yevis 既然您已经提出了 6 个关于元胞数组的问题,您是否尝试编写向量化代码?
【解决方案2】:

您可以使用以下方法找到与特定输入向量 s1 完全匹配的单元格:

indx = find(cell2mat(cellfun(@(x)strcmp(num2str(x),num2str(s1)),c,'un', 0)));

然后您可以遍历匹配项(现在应该是一个更小的集合),并通过将其内容设置为空集合来删除它们:

for ii=1:length(indx)
    c{:,ii} = [];
end

【讨论】:

  • 重点是我不知道s1,我需要找到它们并删除它们,知道吗?
  • 您如何确定需要删除哪些集合?
猜你喜欢
  • 2013-12-25
  • 2019-02-26
  • 1970-01-01
  • 2015-04-21
  • 2017-03-28
  • 1970-01-01
  • 2011-03-04
  • 2011-01-06
  • 1970-01-01
相关资源
最近更新 更多