この「FBECGHD」のような文字列があり、MATLAB を使用して必要なすべての可能な順列を生成する必要がありますか? このタスクを実行する特定の MATLAB 関数がありますか、それともこのタスクを実行するカスタム MATLAB 関数を定義する必要がありますか?
2 に答える
パーマ機能を使います。matlab の文字列は文字のリストであるため、それらを並べ替えます。
A = 'FBECGHD';
perms(A)
出力を格納することもできます (例: P = perms(A)
)。A が N 文字の文字列の場合、P は N! 行 N 列の配列で、各行が順列に対応します。
一意の順列に興味がある場合は、次を使用できます。
unique(perms(A), 'rows')
重複を削除します (そうしないと、「ABB」のようなものを使用すると、予想される 3 つではなく、6 つの結果が得られます)。
Richanteが答えたように、これにP = perms(A)
は非常に便利です。P
また、それはタイプchar
であり、個々の順列をサブセット化/選択するのは便利ではないことに気付くかもしれません。以下は私のために働いた:
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
あなたの望むものではないようです。999
以下のと191
の順列は199
真ではないことに注意してください。書かれている reshape 関数は、次の場合に「列単位」で動作するように見えますA
。
>> str = '199';
A = perms(str);
B = cellstr(reshape(A,3,[])');
C = unique(B);
>> C
C =
'191'
'199'
'911'
'919'
'999'
以下は生成されません999
or 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'