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