2011-04-11 81 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