置换字符串并取回唯一的行值

Permuting strings and getting the unique rows values back

我正在尝试置换一个字符串单元格并取回唯一的行。 示例:我给出了四个值,它排列这些值并将这些值以两行的形式返回。这在下面有效,但我注意到这些行在某些区域重复。我尝试添加唯一命令 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

注意:以下代码适用于 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'