2017-09-26 107 views
0

假設我有這樣的單元陣列:Matlab的:將一個單元陣列分成兩個列單元的排列

in={'A' 'B' 'C'}; 

我想獲得可能在兩列的in\t分離置換爲:

out= 
    'A' 'B  C' 
    'B' 'A  C' 
    'C' 'A  B' 
    'A B' 'C' 
    'A C' 'B' 
    'B C' 'A' 

對於長度爲4的單元in={'A' 'B' 'C' 'D'},在out中應該有14個不同的行,例如'A B' 'C D'。如何獲得out長度爲n的任何手機in

請注意,AB等都是輸入示例。預計該代碼通常會處理字符串。 'Alice02' '_Tom'等可以是輸入單元in中的元件的示例而不是'A' 'B'

+0

您正在尋找[permutations](https://www.mathworks.com/help/matlab/ref/perms.html),而不是組合。 – beaker

+0

@beaker是的,修改了它。我需要一個特定格式的輸出,它有兩列,元素用'\ t'分開。 – fhm

+0

第一種情況可以在3列嗎? – hello123

回答

2

這裏是一個可能的解決方案:

str = {'John02' 'Alice_' '4_Tom'} 
[x y]=find(dec2bin(0:2^numel(str)-1)=='1'); 
p = accumarray(x,y,[],@(z){sprintf('%s\t',str{z})}); 
out = [p(2:numel(p)/2) p(end-1:-1:numel(p)/2+1)]; 

如果你只用字母,則可以使用此:

str = 'ABCD'; 
[x y]=find(dec2bin(0:2^numel(str)-1)=='1'); 
p = accumarray(x,char(y+64),[],@(z){z.'}); 
out = [p(2:numel(p)/2) p(end-1:-1:numel(p)/2+1)]; 

結果:

out = 
{ 
    [1,1] = D 
    [2,1] = C 
    [3,1] = CD 
    [4,1] = B 
    [5,1] = BD 
    [6,1] = BC 
    [7,1] = BCD 
    [1,2] = ABC 
    [2,2] = ABD 
    [3,2] = AB 
    [4,2] = ACD 
    [5,2] = AC 
    [6,2] = AD 
    [7,2] = A 
} 

*等同於八度的解決方案:

p = powerset('A':'D'); 
out = [p(2:numel(p)/2) ;p(end-1:-1:numel(p)/2+1)].'; 
+0

'out'返回'n/2'的真實值,'n'是輸出行的數量。另一半將是相同的 - 你通過交換列。但是,你可以請改進代碼來將這些空格作爲分隔符(如問題描述中所述)嗎?它應該能夠像字母'A'-'D'那樣處理單詞,其間帶有製表符分隔符。 – fhm

+0

此解決方案無法將「字符串」處理爲任何類型的字詞。例如,當我用'str = {'John02''Alice_''4_Tom'}替換第一行時,它不會返回這些字符串的排列。 – fhm

+0

@fhm對不起,延遲迴復;答案已更新。 – rahnema1