0

我在 Matlab 中有一个大数组,如下所示:

一个=

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

细胞看起来像这样:

C{1}

ans = '苹果' '香蕉' '猕猴桃' '橙子'

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

C{27}

ans = '乌龟' '猕猴桃' '狐狸' '獾'

即在这里我想看看C(1) 和C(27) 是否有重复的单词'kiwi'。所以我可以手动查看它们并决定我应该在哪里删除我认为合适的重复项。

4

1 回答 1

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 解决方案,但我希望这足以让您入门。

于 2012-04-27T14:03:12.170 回答