2012-05-06 15 views
1

私はこの "FBECGHD"のような文字列を持っており、MATLABを使用して必要なすべての順列を生成する必要がありますか?このタスクを実行する特定のMATLAB関数、またはこのタスクを実行するカスタムMATLAB関数を定義する必要がありますか?MATLABは文字列から組み合わせを生成します

答えて

5

perms機能を使用してください。それはそれらを入れ替えますので、MATLABの文字列は、文字のリストです:

A = 'FBECGHD'; 
perms(A) 

ます。また、出力(例えばP = perms(A))を格納することができ、かつ、AがN文字の文字列である場合、PはNです! -by-N配列であり、各行は順列に対応する。

あなたはユニークな順列に興味がある場合は、使用することができます。

unique(perms(A), 'rows') 

を重複を削除する(それ以外の場合は「ABB」のような何かが6つの結果、代わりにあなたが期待するかもしれない3を与えるだろう)。

0

リチャードが答えたので、P = perms(A)はこれに非常に便利です。 Pcharであり、個々の順列をサブセット化/選択するのは便利ではないことに気付くかもしれません。以下は私の仕事:

str = 'FBECGHD'; 
A = perms(str); 
B = cellstr(reshape(A,7,[])'); 
C = unique(B); 

をまたunique(A, 'rows')が重複する値を削除していないことが表示されます:

>> A=[11, 11]; 
>> unique(A, 'rows') 
ans = 

    11 11 

しかし、unique(A)が希望:

>> unique(A) 

ans = 

    11 

私はどんなことでMATLABのプロではありませんよ私はこれを徹底的に調査しなかったが、少なくともいくつかのケースでは、reshapeがあなたの望むものではないと思われる。以下は、999191の順列が199であり、これは真ではないことに注意してください。書かれた関数reshapeは "列方向" A上で動作するように見える:以下

>> str = '199'; 
A = perms(str); 
B = cellstr(reshape(A,3,[])'); 
C = unique(B); 
>> C 

C = 

    '191' 
    '199' 
    '911' 
    '919' 
    '999' 

が生成されません999または191

B = {}; 
index = 1; 
while true 
    try 
     substring = A(index,:); 
     B{index}=substring; 
     index = index + 1; 
    catch 
     break 
    end 
end 
C = unique(B) 

C = 

    '199' '919' '991' 
関連する問題