我在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'。 所以我可以手动查看它们,并决定在我认为合适的地方删除副本的位置。
答案 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解决方案,但我希望这足以让你开始。