2017-09-26 108 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