例如,我有这样的文本集:
第1栏:
a
b
第2栏:
l
m
n
第3栏:
v
w
x
y
我希望将它们组合起来得到这样的输出:
alv
alw
alx
aly
amv
amw
amx
amy
...
将输出24个文本组合。如果我只使用前两列,它将输出2 * 3 = 6种组合。
我无法弄清楚如何在MATLAB中执行此操作。有什么建议吗?
答案 0 :(得分:3)
一种解决方案是使用函数NDGRID生成集合中所有索引的组合:
C = {'ab' 'lmn' 'vwxy'}; %# Cell array of text sets
sizeVec = cellfun('prodofsize',C); %# Vector of set sizes
[index3,index2,index1] = ndgrid(1:sizeVec(3),... %# Create all the index
1:sizeVec(2),... %# combinations for
1:sizeVec(1)); %# the sets
combMat = [C{1}(index1(:)); ... %# Index each corresponding cell of C and
C{2}(index2(:)); ... %# concatenate the results into one matrix
C{3}(index3(:))].';
你应该为combMat
获得以下内容:
alv
alw
alx
aly
amv
amw
amx
amy
anv
anw
anx
any
blv
blw
blx
bly
bmv
bmw
bmx
bmy
bnv
bnw
bnx
bny
如果您只想获得第1列和第2列的组合,请从调用NDGRID中删除第一个输入和输出参数,并从C{3}(index3(:))
的计算中删除combMat
。< / p>
如果您希望C
是字符串单元格数组的单元格数组而不是字符数组的单元格数组,您仍然可以使用上面完全相同的代码。唯一的区别是combMat
最终将成为字符串的单元格数组而不是字符数组。
<强>更新强>
我实际上创建了一个通用解决方案,可以计算任意数量的集合(字符数组或字符串的单元格数组)的组合。您可以在this answer到closely-related question找到它。要重现上面的例子,你可以这样称呼它:
combMat = allcombs(C{:});