MATLAB从字符串生成组合

时间:2012-05-06 16:39:38

标签: string matlab permutation

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

2 个答案:

答案 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不是你想要的。请注意,下面的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'