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
拜托,您能否提出最有效的方法?
答案 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