在Matlab中查找但不删除重复项

时间:2012-04-27 11:08:39

标签: string matlab duplicates cell

我在Matlab中有一个大数组:

A =

{1x5  cell}
{1x7  cell}
{1x27 cell}
{1x11 cell}
  ...

细胞看起来像这样:

  
    

13 C {1}

  

ans = 'apple''bana''kiwi''orange'

我想在A中查找包含双重信息的单元格,例如:

  
    

13 C {27}

  

ans = 'turtle''kiwi'''狐狸''獾'

即。在这里,我想看看C(1)和C(27)是否有重复的单词'kiwi'。 所以我可以手动查看它们,并决定在我认为合适的地方删除副本的位置。

1 个答案:

答案 0 :(得分:0)

抱歉,我不打算提供编码解决方案,更多我将使用的流程,以便您可以开始编码,如果您有任何具体问题可以随意发布问题

我会使用nchoosek生成一个包含单元格数组C的所有排列的数组,所以

nCells = length(C);
nPerms = nchoosek(1:nCells,2);

然后,您可以使用intersect循环遍历所有排列,以查看是否存在常见字符串。

result(i) = intersect(C{nPerms(i,1)},C{nPerms(i,2)});

这将为您提供一个列出所有常见字符串的数组,并且使用nPerms数组,您将拥有带有公共字符串的两行。但是,如果您尝试运行它,它将失败,因为intersect喜欢在每个单元格数组中具有相同数量的元素。

因此,我创建了一个用空白单元格填充的临时单元格数组,以便C中的每个元素在循环之前具有相同的长度。

这将通过计算每个单元格中的元素数量(@numel),然后计算最大值来计算数组C中最长的单元格。

cSize = cellfun(@numel,C);
maxSize = max(cSize);

然后我们可以定义一个填充空白单元格的函数

fcn = @(x) [x cell(1,maxSize - numel(x))];
paddedC = cellfun(fcn,C,'UniformOutput',false);

这应该为您提供每个单元格中具有相同数量元素的单元格数组。然后,您可以在循环中使用此单元格数组测试每个排列。

毫无疑问,有人会出现一个单行的cellfun解决方案,但我希望这足以让你开始。