我有一个像“FBECGHD”这样的字符串,我需要使用 MATLAB 并生成所有必需的可能排列?那里有一个执行此任务的特定 MATLAB 函数,还是我应该定义一个执行此任务的自定义 MATLAB 函数?
问问题
1672 次
2 回答
5
使用perms函数。matlab 中的字符串是一个字符列表,因此它将排列它们:
A = 'FBECGHD';
perms(A)
您还可以存储输出(例如P = perms(A)
),并且,如果 A 是 N 个字符的字符串,则 P 是一个 N!-by-N 数组,其中每一行对应一个排列。
如果您对独特的排列感兴趣,可以使用:
unique(perms(A), 'rows')
删除重复项(否则 'ABB' 之类的结果会给出 6 个结果,而不是您可能期望的 3 个)。
于 2012-05-06T17:07:43.123 回答
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
其中不正确的排列。所写的 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'
于 2016-05-21T17:52:01.450 回答