分区数量成正实数

6视图(30天)
你好,
我有一个向量V = 0:0.1: M。我有' w ', ' x ', ' y ',和' z ', w, x, y, z属于诉我希望所有w, x, y, z,这样w + x + y + z = m .另外, 。我知道穷举搜索方法但是我感兴趣的更有效的方法计算。

接受的答案

Wan霁
Wan霁 2021年8月20日
编辑:Wan霁 2021年8月22日
嗨,朋友!我想到一个搜索方法,节省了很多时间。
首先,这个问题可以转化成 V = 1:1: M,存在‘w’,‘x’,‘y’,、“z”w, x, y, z属于诉计算所有w < x < < z, w + x + y + z = M。 因为你可以让M = 10 * M, x, y, z, w都是正整数,你只需要使用(x, y, z, w) = 0.1 * (x, y, z, w),也提到了 @the骑自行车 。在这里我提供整数的解决方案。我相信你能理解我。
代码说话!看看我写的代码为这个问题。
搜索功能
函数结果= searchPartition (M)
α= 1;α= 4 *;
R = 0 (M ^ 3、4);%如果你有足够的内存,时间不是一个问题
数= 0;
(—> = 6)
β= 1;B = 3 *β;
(M-A-B > = 3)
γ= 1;C = 2 *伽马;
(M-A-B-C > = 1)
δ= M-A-B-C;
如果(δ> = 1)
数=计数+ 1;
R(计数:)=(α,β,γδ);
其他的
打破;
结束
γ=伽马+ 1;
C = 2 *伽马;
结束
β=β+ 1;
B = 3 *β;
结束
α=α+ 1;
α= 4 *;
结束
R = R(1:统计:);
结果= cumsum (R, 2);
结束
验证其正确性,在这里我执行一个测试
结果= searchPartition (20)
然后得到结果
结果=
1 2 3 14
1 2 4 13
1 2 5 12
1 2 6日11
1 2 7 10
1 2 8 9
1 3 4 12
1 3 5 11
1 3 6 10
1 3 7 9
1 4 5 10
1 4 6 9
1 4 7 8
1 5 6 8
2 3 4 11
2 3 5 10
2 3 6 9
2 3 7 8
2 4 5 9
2 4 6 8
2 5 6 7
3 4 5 8
3 4 6 7
23个结果,从左到右列是w, x, y, z。
验证其效率,这里我们选择范围和间隔从200年到1000年的200,并计算成本!
函数主要
M_array = 200:200:1000;你可以根据需要改变M_array百分比
Time_array = 0(大小(M_array));
ResultSize_array = 0(大小(M_array));
我= 1:1:元素个数(M_array)
抽搐%计算时间
M = M_array(我);
结果= searchPartition (M);%使用我的方法
时间= toc;
Time_array (i) =时间;
ResultSize_array (i) =(结果,1)大小;
结束
%的情节人物
图(100)
clf
次要情节(1、2、1)
情节(M_array Time_array,“r”,“线宽”,2)
包含(“M值”);
ylabel (花费时间(s)的);
标题(花费时间和M”)
次要情节(1、2、2)
情节(M_array ResultSize_array,“b”,“线宽”,2)
包含(“M值”);
ylabel (“结果大小”);
标题(“结果的大小和M”)
图(200)
clf
重对数(ResultSize_array Time_array,“ro - - - - - -”,“线宽”,2)
包含(“结果大小”);
ylabel (“时间成本”);
标题(“时间成本和结果大小重对数图”)
结束
发现当M = 1000,所花费的时间在我的方法是小于2秒,虽然结果规模达到7000,000年,这是一个相当大的数量!我希望你喜欢它的蛋
4评论
VIVEK CHAUDHARY
VIVEK CHAUDHARY 2021年8月23日
非常感谢。很感激的帮助。

登录置评。

答案(1)

骑自行车的人
骑自行车的人 2021年8月20日
这相当于分区正整数和10 *米。下载 @John d # 39; Errico 的优秀 分区代码 从文件交换。以下将做你想做的事情。
%的总和
M = 20;
%计算所需的元素
N = 4;
%所有分区
p =分区(M);
%只包括没有重复值的行
p = p(所有((p = = 1) | (p = = 0), 2),:);
%只包括行与正确的元素的数量
p = p ((p, 2) = = N,:);
%显示结果。每一行是一个解。在每一行,有一个1
当n % n列是一组的成员(w x, y, z),你想要的。
disp (p)
在这个例子中,我发现和20的4的整数。第一行的解决方案 p (3、4、6、7)
这相当于(0.3,0.4,0.6,0.7),金额为2。
1评论
骑自行车的人
骑自行车的人 2021年8月20日
看这一点后,我意识到约翰的代码更有效的调用语法当你知道你想要多少个元素:
%的总和
M = 20;
%计算所需的元素
N = 4;
%所有分区
p =分区(M, [], [], N);
%只包括没有重复值的行
p = p(所有((p = = 1) | (p = = 0), 2),:);
%显示结果。每一行是一个解。在每一行,有一个1
当n % n列是一组的成员(w x, y, z),你想要的。
disp (p)

登录置评。

类别

找到更多的在输入命令帮助中心文件交换

标签

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!