gpt4 book ai didi

matlab - 总和的组合

转载 作者:太空宇宙 更新时间:2023-11-03 19:52:28 26 4
gpt4 key购买 nike

如何生成一个矩阵,其中包含所有可能的数字总和重复总和的组合?

基本上,x1x2x3 的组合使得 x1 + x2 + x3 = n

例如:n =3

0 1 2 
0 2 1
1 0 2
1 2 0
1 1 1

是否有使用预定义的 Matlab 函数执行此操作的简单方法?

我试过了

n=6;
nchoosek(0:n,3)

这给了我

 0     1     2
0 1 3
0 1 4
0 1 5
0 1 6
0 2 3
0 2 4
0 2 5
0 2 6
0 3 4
0 3 5
0 3 6
0 4 5
0 4 6
0 5 6
1 2 3
1 2 4
1 2 5
1 2 6
1 3 4
1 3 5
1 3 6
1 4 5
1 4 6
1 5 6
2 3 4
2 3 5
2 3 6
2 4 5
2 4 6
2 5 6
3 4 5
3 4 6
3 5 6
4 5 6

如何提取总数等于 n 的所有行?我认为线性索引或 find 应该可以实现,但我不知道该怎么做。

问候

最佳答案

为了具体起见,让我们以 3 个值加起来等于 6 为例。执行此操作的标准方法是考虑将 2 个“分隔线”放入一行 6 个相同的“对象”中:然后这些分隔线将对象分开分成 3 组,你可以读出每组的长度。所以我们需要做的就是列举所有放置这些分隔线的方法。您可以为此使用 nchoosek(1:8, 2):该矩阵的每一行通过描述 2 + 6 == 8< 中两个分隔符的位置来描述一个除法 对象 + 分隔符。

与枚举所有整数 0-6 的三元组然后挑选出那些相加到正确的总数相比,这是一种更有效的方法。

我真的不会说 MATLAB,所以以下内容可能不合常理(欢迎提出改进建议!),但像这样的东西应该可行:

% Total we're aiming for.                                                             
n = 6;
% Number of pieces to divide that total into.
k = 3;
% All possible placements of internal dividers.
dividers = nchoosek(1:(n+k-1), k-1);
ndividers = size(dividers, 1);
% Add dividers at the beginning and end.
b = cat(2, zeros(ndividers, 1), dividers, (n+k)*ones(ndividers, 1));
% Find distances between dividers.
c = diff(b, 1, 2) - 1

这里是结果,由 this site 提供:

c =

0 0 6
0 1 5
0 2 4
0 3 3
0 4 2
0 5 1
0 6 0
1 0 5
1 1 4
1 2 3
1 3 2
1 4 1
1 5 0
2 0 4
2 1 3
2 2 2
2 3 1
2 4 0
3 0 3
3 1 2
3 2 1
3 3 0
4 0 2
4 1 1
4 2 0
5 0 1
5 1 0
6 0 0

关于matlab - 总和的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21500539/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com