【问题标题】:Matlab: dividing a cell array into permutations of two column cellMatlab:将一个单元格数组划分为两列单元格的排列
【发布时间】:2017-09-26 15:14:14
【问题描述】:

假设我有这个元胞数组:

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

我想在两列中获得\t 的可能in 的分离排列:

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'。如何为长度为n的任何单元格in获取out

请注意AB 等是输入示例。该代码通常可以处理字符串。 'Alice02' '_Tom'等可以是输入单元格in而不是'A' 'B'中的元素示例。

【问题讨论】:

  • 您正在寻找permutations,而不是组合。
  • @beaker 是的,修改它。我需要一种特定格式的输出,它分为两列,元素由\t 分隔。
  • 第一种情况可以分3列吗?
  • @emanbap 我在找什么,应该只有两列输出。
  • 这将是一个用于输入36*2 单元格,一个用于输入414*2 单元格,一个用于输入530*2 单元格,依此类推。

标签: arrays matlab cell


【解决方案1】:

这是一个可能的解决方案:

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
}

*Octave 中的等效解:

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

【讨论】:

  • outn/2 返回真值,n 是输出行数。另一半将是相同的 - 你通过交换列。但是,您能否改进代码以将这些空格 \t 作为分隔符(如问题描述中所述)?它应该能够处理与字母A-D 相同的单词,中间有制表符分隔符。
  • 此解决方案无法将“字符串”作为任何类型的单词处理。例如,当我用str = {'John02' 'Alice_' '4_Tom'}替换第一行时,它不会返回这些字符串的排列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多