2012-05-06 132 views
1

我有一個像這樣的字符串「FBECGHD」,我需要使用MATLAB並生成所有需要的可能排列?在那裏有一個特定的MATLAB函數來完成這個任務,或者我應該定義一個執行這個任務的自定義MATLAB函數?MATLAB從字符串生成組合

回答

5

使用perms函數。在MATLAB字符串是字符的列表,所以它會置換他們:

A = 'FBECGHD'; 
perms(A) 

您還可以將輸出(如P = perms(A)),並且,如果A是一個N個字符的字符串,P是N! N數組,每行對應於一個置換。

如果你有興趣的獨特排列,你可以使用:

unique(perms(A), 'rows') 

刪除重複(否則像「ABB」將給予6分的結果,而不是您所期望的3)。

0

正如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不是你想要的。請注意,以下給出999191作爲排列199,這是不正確的。作爲編寫的重塑功能似乎運行「按列」上A

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

C = 

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

下面不會產生999191

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'