如何在文本集中创建所有字符组合?

时间:2011-04-11 14:50:01

标签: matlab text combinations

例如,我有这样的文本集:

第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中执行此操作。有什么建议吗?

1 个答案:

答案 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 answerclosely-related question找到它。要重现上面的例子,你可以这样称呼它:

combMat = allcombs(C{:});