2011-04-11 36 views
3

例如,我有套文字像这样: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

密切相关:[Matlab的 - 生成一些向量的元素的所有可能组合(http://stackoverflow.com/q/4165859/ 52738),[MATLAB:枚举任意数量的集合中的所有项目的组合](http://stackoverflow.com/q/6607355/52738),[MATLAB:任意数量的单元阵列的组合](http:///stackoverflow.com/q/8492277/52738)。 – gnovice 2011-12-13 17:35:15

回答

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,并从计算combMat中移除C{3}(index3(:))

如果您不想让C成为字符串的单元数组的单元数组,而不是字符数组的单元数组,您仍然可以使用上面完全相同的代码。唯一的区别是combMat将最终成为字符串的单元数组而不是字符数组。

UPDATE:

我实际上创建了一个广义的解决方案,可以计算组合为任意数量的组(或者字符数组或字符串的单元阵列)。你可以在this answer找到closely-related question。为了再现上述例子中,只需要调用它像这样:

combMat = allcombs(C{:}); 
+0

谢谢......现在,怎么样,如果我的文字不仅仅是从1个字符的立场,我的意思是,像文本列如下1: 一个 列2: 汽车 球 表 第3列: 玩 坐我还可以使用meshgrid功能吗? – playcode 2011-04-12 06:23:36

+0

@ user699844:我已更新我的答案以解决您的新示例。 – gnovice 2011-04-12 17:34:23

+0

非常感谢您的帮助。如果我希望输出不是char,而是作为单元阵列,我应该怎么做?由于我使用你的代码,我只是得到了字符类型。我想要这样的输入:[MAT,idx] = meshgrid([PrefixCombination(1:5,1),PrefixCombination(1:5,2)])。我可以使用此代码吗? PrefixCombination是列数可以随相关变量的变化而变化的单元阵列。它们在每个单元格中包含一个单词并包含许多单元格。我希望输出包含与输入相同数量的列。每列的行数相同。感谢您的帮助。 – playcode 2011-04-13 19:21:25