Ash*_*Ash 4 matlab combinations permutation
如何生成一个矩阵,其中所有可能的数字组合总和为重复的总和?
基本上,组合x1,x2,x3使得x1 + x2 + x3 = n.
例如: n =3
0 1 2
0 2 1
1 0 2
1 2 0
1 1 1
Run Code Online (Sandbox Code Playgroud)
有没有使用预定义的Matlab函数执行此操作的简单方法?
我试过了
n=6;
nchoosek(0:n,3)
Run Code Online (Sandbox Code Playgroud)
这给了我
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
Run Code Online (Sandbox Code Playgroud)
如何提取总数等于的所有行n?我认为线性索引或find应该使它成为可能,但我不知道如何去做.
问候
具体来说,让我们看看3个值加起来为6的例子.这样做的标准方法是考虑将2个'分隔符'放入6行相同的"对象"中:然后将这些分隔符分成3组,你可以读出每组的长度.所以我们需要做的就是列举放置这些分隔线的所有方法.您可以使用nchoosek(1:8, 2)此:矩阵的每一行描述一个除法,通过描述2 + 6 == 8对象+分频器中2个分频器的位置.
这比枚举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
Run Code Online (Sandbox Code Playgroud)
以下是本网站提供的结果:
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
Run Code Online (Sandbox Code Playgroud)