2017-09-06 2 views
1

문자열 셀을 순열 바꾸고 고유 한 행을 다시 가져 오려고합니다. 예 : 4 개의 값을 지정하고 해당 값을 순열하여 2의 행으로 다시 값을 제공합니다. 이것은 아래에서 작동하지만 일부 영역에서는 행이 반복되는 것을 보았습니다. 나는 유일한 명령을 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.. 

시 : 코드 아래 MATLAB과 옥타브 4.0 모두 작동 : 나는

+0

당신은 4 개 요소의 모든 순열을 받고, 다음 첫 번째 두 개의 열 복용 - 그래서 고유 out''의 행을하지만,'out'의 첫 번째 두 열의 행은 아니. 4 가지 요소의 모든 조합을 원하십니까? – Wolfie

답변

3

참고 matlab에처럼 옥타브 4.0을 사용하고 있습니다.

콘텐츠가 out이 아닌 것을 보는 것이 문제입니다. perms 함수는 24x4가 아닌 24x4 셀 배열을 만듭니다. 당신이 4 개 항목에서 선택이 개 항목의 순열을 모두 생성하려는 경우

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' 

, 당신은 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' 
+0

OP/기타 판독기의 경우 [두 벡터의 모든 조합을 찾는 몇 가지 방법]이 있습니다 (https://stackoverflow.com/questions/7446946/how-to-generate-all-pairs-from-two-vectors- in-matlab-using-vectorsised-code)를 사용하여 마지막 코드 블록에서 볼 수있는'p'를 생성 할 수 있습니다. – Wolfie

관련 문제