我已经制定了一个等式,但我需要找到更通用的公式。我的计划如下:
p2=[];
W=3;
i=6;
for a1=1:W
for a2=a1:W
for a3=a2:W
for a4=a3:W
for a5=i-a4-a3-a2-a1;
if(a4 <= a5 && a5<=W)
p2=[p2;a1,a2,a3,a4,a5];
end
end
end
end
end
end
此处如果a1=1
然后a2=1,2,3
,a1=2
然后是a2=2,3
,如果a1=3
则a2=3
。同样的条件适用于a3
&amp; a4
。
现在我想让这个程序仅取决于W
和i
,我不想写a1
,a2
,a3
,{{1 }},a4
而我只想宣布a5
。
我已经尝试但无法取得丰硕成果。
Matlab专家我真的需要你的帮助。
提前致谢。
答案 0 :(得分:1)
我认为这可以满足您的需求:
[a5 a4 a3 a2 a1]=ndgrid(1:W,1:W,1:W,1:W,1:W);
ind = find(a2>=a1&a3>=a2&a4>=a3&a5>=a4&a1+a2+a3+a4+a5==i)
p2 = [a1(ind) a2(ind) a3(ind) a4(ind) a5(ind)]
答案 1 :(得分:0)
我假设您要将代码扩展为大数字,因此我提议的可能不是最好的方法。但是,您可以尝试首先枚举k = 4个元素的所有组合。对于每种组合,您可以根据您的条件计算您的第5个元素。
这种方法类似于Luis Mendo的方法,但避免产生k ** n种可能性。通过采用所有组合并对它们进行排序,您将获得所有有效序列。您应该将每个组合(例如(2 1 2 1))解释为一个序列(例如[1 1 2 2])。这允许您避免评估像[2 1 1 2]这样的序列,因为每个组合都映射在1个有效序列上(反之亦然)。您不必评估无效序列。
您可以使用combnk(v,k)生成组合。然后,您可以使用a5的所有可能值展开找到的列表。
答案 2 :(得分:0)
对于任意数量的“a”变量,您可以构造类似于我之前的解决方案的字符串,然后eval
这些字符串:
num = 5; % number of "a" variables
W = 3;
i = 6;
string1 = '[';
for n = num:-1:1
string1 = [ string1 'a' num2str(n) ' '];
end
string1 = [ string1 '] = ndgrid(1:W);'];
string2 = 'ind = find(';
for n = 2:num
string2 = [ string2 'a' num2str(n) '>=a' num2str(n-1) '&' ];
end
for n = 1:num
string2 = [ string2 'a' num2str(n) '+'];
end
string2 = [ string2(1:end-1) '==i);' ];
string3 = 'p2 = [ ';
for n = 1:num
string3 = [ string3 'a' num2str(n) '(ind) ' ];
end
string3 = [ string3 ']' ];
eval(string1);
eval(string2);
eval(string3);