所有可能的字符串组合MATLAB

时间:2014-03-11 15:10:24

标签: string matlab permutation

UPD:我想对StackOverflow社区提出问题表示抱歉,他自己提出问题而没有努力解决问题。从现在开始,只有在我真的遇到严重问题时才会提问。

我现在正在开发生成字符串元素的所有可能排列的程序:

我开始时:

A = ['Bridge','No Bridge'];
B = ['Asphalt','Concrete','Combined'];
C = ['Fly Ash',' Sulphur','Nothing'];
D = ['Two lanes','Four lanes with barriers'];
E = ['Paid','Non-paid'];
F = ['Mobile','Non-mobile'];
N = length(A)*length(B)*length(C)*length(D)*length(E)*length(F);
out = zeros(N,6);

但现在我仍然坚持下一步该做什么。所需的输出类似于:

out = 

    'Bridge' 'Asphalt' 'Fly Ash' 'Two lanes' 'Paid' 'Mobile'
    'Bridge' 'Asphalt' 'Fly Ash' 'Two lanes' 'Paid' 'Non-mobile'
    'Bridge' 'Asphalt' 'Fly Ash' 'Two lanes' 'Non-paid' 'Mobile'
    'Bridge' 'Asphalt' 'Fly Ash' 'Two lanes' 'Non-paid' 'Non-mobile' etc

拜托,您能否提出最有效的方法?

3 个答案:

答案 0 :(得分:5)

使用ndgrid生成索引的所有组合,然后使用这些索引从字符串构建结果:

A = {'Bridge','No Bridge'};
B = {'Asphalt','Concrete','Combined'};
C = {'Fly Ash',' Sulphur','Nothing'};
D = {'Two lanes','Four lanes with barriers'};
E = {'Paid','Non-paid'};
F = {'Mobile','Non-mobile'}; %// data. Cell arrays of strings

[a b c d e f] = ndgrid(1:numel(A),1:numel(B),1:numel(C),1:numel(D),1:numel(E),1:numel(F));
out = [A(a(:)).' B(b(:)).' C(c(:)).' D(d(:)).' E(e(:)).' F(f(:)).'];

或者,如果您需要按照示例的顺序显示结果:

[f e d c b a] = ndgrid(1:numel(F),1:numel(E),1:numel(D),1:numel(C),1:numel(B),1:numel(A));
out = [A(a(:)).' B(b(:)).' C(c(:)).' D(d(:)).' E(e(:)).' F(f(:)).'];

这给出了

out = 

    'Bridge'       'Asphalt'     'Fly Ash'     'Two lanes'    'Paid'        'Mobile'    
    'Bridge'       'Asphalt'     'Fly Ash'     'Two lanes'    'Paid'        'Non-mobile'
    'Bridge'       'Asphalt'     'Fly Ash'     'Two lanes'    'Non-paid'    'Mobile'    
    'Bridge'       'Asphalt'     'Fly Ash'     'Two lanes'    'Non-paid'    'Non-mobile'
    ...

答案 1 :(得分:2)

首先,请注意,在Matlab中,以下方括号表示法['Hello', 'World']实际上并不创建字符串数组,而是将字符串“Hello”和“World”连接起来以产生“HelloWorld”。因此,在这种情况下,您应该使用Cell Arrays代替:A = {'Hello', 'World'}(请注意大括号)。

回答你的问题:
虽然你可以选择更通用的东西(你应该在现实代码中),但是现在,既然你知道了手的数组,你可以简单地创建嵌套的{{1像这样的循环:

for

使用ouput:

  

桥,沥青
  拱桥,混凝土
  桥,组合
  没有桥梁,沥青
  无桥,混凝土
  没有桥梁,合并

答案 2 :(得分:0)

虽然在问题中并非如此,但如果A,B,C,D,E和F是两个元素单元阵列,那么我们可以使用一些肮脏的技巧 -

num1 = (num2str(111111+str2num(dec2bin(0:63))) - '0')';
comp1 = cell(size(num1,2),6);
for k = 1:size(num1,2)
    comp1(k,:) = [A(num1(1,k)) B(num1(2,k)) C(num1(3,k)) D(num1(4,k)) E(num1(5,k)) F(num1(6,k))];
end