抱歉,我不会提供编码解决方案,更多的是我将使用的过程,以便您可以开始编码,如果您有任何具体问题,请随时发布问题
我会用它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 解决方案,但我希望这足以让您入门。