如何在matlab中计算for循环中的值

时间:2013-08-06 15:50:57

标签: matlab

我已经制定了一个等式,但我需要找到更通用的公式。我的计划如下:

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,3a1=2然后是a2=2,3,如果a1=3a2=3。同样的条件适用于a3&amp; a4。 现在我想让这个程序仅取决于Wi,我不想写a1a2a3,{{1 }},a4而我只想宣布a5。 我已经尝试但无法取得丰硕成果。

Matlab专家我真的需要你的帮助。

提前致谢。

3 个答案:

答案 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);