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