1

我有一个像“FBECGHD”这样的字符串,我需要使用 MATLAB 并生成所有必需的可能排列?那里有一个执行此任务的特定 MATLAB 函数,还是我应该定义一个执行此任务的自定义 MATLAB 函数?

4

2 回答 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不是您想要的。请注意,下面给出了999191作为199其中不正确的排列。所写的 reshape 函数似乎在 上“按列”操作A

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

C = 

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

下面不产生999or 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 回答