0

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

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

这里 if a1=1then a2=1,2,3, if a1=2thena2=2,3和 if a1=3then a2=3a3&的条件相同a4。现在我想让这个程序只依赖于Wandi我不想写a1, a2, a3, a4,a5而我只想声明 then a(1:5)。我已经尝试过,但无法取得丰硕的成果。

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

提前致谢。

4

3 回答 3

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)]
于 2013-08-06T16:10:25.637 回答
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);
于 2013-08-07T09:55:04.083 回答
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 的所有可能值展开找到的列表。

于 2013-08-06T16:24:59.163 回答