我有一个类似“FBECGHD”的字符串,我需要使用MATLAB并生成所有必需的排列?在那里有一个特定的MATLAB函数来完成这个任务,还是我应该定义一个执行这个任务的自定义MATLAB函数?
答案 0 :(得分:5)
使用perms功能。 matlab中的字符串是一个字符列表,因此它将置换它们:
A = 'FBECGHD';
perms(A)
您还可以存储输出(例如P = perms(A)
),如果A是N字符串,则P是N!-by-N数组,其中每行对应一个排列。
如果您对独特的排列感兴趣,可以使用:
unique(perms(A), 'rows')
删除重复项(否则类似'ABB'会提供6个结果,而不是您可能期望的3个结果。)
答案 1 :(得分: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
不是你想要的。请注意,下面的999
和191
作为199
的排列,并非真实。所写的重塑功能似乎按照列方式操作"在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'