置换字符串并获取唯一行值

时间:2017-09-06 15:24:29

标签: matlab octave permutation combinatorics

我试图置换字符串单元格并获取唯一的行。 示例:我给出了四个值,它会置换这些值并将这些值以两行的形式返回。这可以在下面工作,但我注意到某些区域的行重复。我尝试添加唯一命令 out = unique(perms(A),' rows'),但会返回错误。

clear all
more off
A={'(+)sig','(-)sig','(+)flip','(-)flip'}
out=perms(A);

for n=1:length(out)
  %fprintf([num2str(n), ',', out{n,1},',',out{n,2},',',out{n,3},'\n'])
  fprintf([num2str(n), ',', out{n,1},',',out{n,2},'\n'])
end

Results:

1,(+)sig,(-)sig
2,(-)sig,(+)sig
3,(+)sig,(+)flip
4,(-)sig,(+)flip
5,(+)flip,(+)sig
6,(+)flip,(-)sig
7,(+)sig,(-)sig
8,(-)sig,(+)sig
9,(+)sig,(+)flip
10,(-)sig,(+)flip
11,(+)flip,(+)sig
12,(+)flip,(-)sig
13,(+)sig,(-)flip
14,(-)sig,(-)flip
15,(+)sig,(-)flip
16,(-)sig,(-)flip
17,(+)flip,(-)flip
18,(+)flip,(-)flip
19,(-)flip,(+)sig
20,(-)flip,(-)sig
21,(-)flip,(+)sig
22,(-)flip,(-)sig
23,(-)flip,(+)flip
24,(-)flip,(+)flip

问题是某些值加倍,请参阅下面如何将行设为唯一行?

1,(+)sig,(-)sig
7,(+)sig,(-)sig
2,(-)sig,(+)sig
8,(-)sig,(+)sig 
etc..

Ps:我使用Octave 4.0,就像Matlab

1 个答案:

答案 0 :(得分:3)

注意:以下代码适用于MATLAB和Octave 4.0。

您的问题是您没有查看out整个内容。函数perms创建一个24乘4的单元阵列,而不是24乘2。如果你查看整行,你会发现每一行都是一个独特的排列:

A = {'(+)sig', '(-)sig', '(+)flip', '(-)flip'};
out = perms(A)

out =

  24×4 cell array

    '(-)flip'    '(+)flip'    '(-)sig'     '(+)sig' 
    '(-)flip'    '(+)flip'    '(+)sig'     '(-)sig' 
    '(-)flip'    '(-)sig'     '(+)flip'    '(+)sig' 
    '(-)flip'    '(-)sig'     '(+)sig'     '(+)flip'
    '(-)flip'    '(+)sig'     '(+)flip'    '(-)sig' 
    '(-)flip'    '(+)sig'     '(-)sig'     '(+)flip'
    '(+)flip'    '(-)flip'    '(-)sig'     '(+)sig' 
    '(+)flip'    '(-)flip'    '(+)sig'     '(-)sig' 
    '(+)flip'    '(-)sig'     '(-)flip'    '(+)sig' 
    '(+)flip'    '(-)sig'     '(+)sig'     '(-)flip'
    '(+)flip'    '(+)sig'     '(-)flip'    '(-)sig' 
    '(+)flip'    '(+)sig'     '(-)sig'     '(-)flip'
    '(-)sig'     '(-)flip'    '(+)flip'    '(+)sig' 
    '(-)sig'     '(-)flip'    '(+)sig'     '(+)flip'
    '(-)sig'     '(+)flip'    '(-)flip'    '(+)sig' 
    '(-)sig'     '(+)flip'    '(+)sig'     '(-)flip'
    '(-)sig'     '(+)sig'     '(-)flip'    '(+)flip'
    '(-)sig'     '(+)sig'     '(+)flip'    '(-)flip'
    '(+)sig'     '(-)flip'    '(+)flip'    '(-)sig' 
    '(+)sig'     '(-)flip'    '(-)sig'     '(+)flip'
    '(+)sig'     '(+)flip'    '(-)flip'    '(-)sig' 
    '(+)sig'     '(+)flip'    '(-)sig'     '(-)flip'
    '(+)sig'     '(-)sig'     '(-)flip'    '(+)flip'
    '(+)sig'     '(-)sig'     '(+)flip'    '(-)flip'

如果您想要生成从4个项目中选择的2个项目的所有排列,您可以使用nchoosek,如下所示:

p = nchoosek(1:4, 2);  % Unique combinations of 2
p = [p; flip(p, 2)];   % Add flipped version for all permutations
out = A(p)

out =

  12×2 cell array

    '(+)sig'     '(-)sig' 
    '(+)sig'     '(+)flip'
    '(+)sig'     '(-)flip'
    '(-)sig'     '(+)flip'
    '(-)sig'     '(-)flip'
    '(+)flip'    '(-)flip'
    '(-)sig'     '(+)sig' 
    '(+)flip'    '(+)sig' 
    '(-)flip'    '(+)sig' 
    '(+)flip'    '(-)sig' 
    '(-)flip'    '(-)sig' 
    '(-)flip'    '(+)flip'