总和为总和的组合

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应该使它成为可能,但我不知道如何去做.

问候

Mar*_*son 7

具体来说,让我们看看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)