2017-09-06 8 views
1

文字列のセルを並べ替えて一意の行を取得しようとしています。 例:4つの値を与えています。これらの値を並べ替え、2つの行に戻します。これは下で動作しますが、私はいくつかの領域で行が繰り返されることに気付きます。私はユニークなコマンドを追加しようとしました=ユニークな(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両方のための作品次のコード:私はMatlabの

+0

あなたは4つの要素のすべての順列を取得した後、最初の2つの列を取っている - そうout' 'の行が一意であるが、out''の最初の2つの列の行がありますない。 4つの要素のすべての組み合わせが欲しいですか? – Wolfie

答えて

3

ノートのようなものであるオクターブ4.0を使用しています。

あなたの問題は、あなたがout全体コンテンツを見ていないということです。関数permsは、24行2列ではなく24行4列のセル配列を作成します。あなたは4つの項目から選ばれた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' 

、あなたが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 /その他のリーダの場合、[2つのベクトルのすべての組み合わせを見つけるためのいくつかの方法]があります(https://stackoverflow.com/questions/7446946/how-to-generate-all-pairs-from-two-vectors-あなたの最後のコードブロックに見られるように 'p'を生成するために使用することができます。 – Wolfie

関連する問題