如何生成数字组合(排列和组合)

时间:2016-09-03 13:26:39

标签: matlab octave

我有以下6乘2矩阵:

1 9
2 3
5 6
8 7
3 4
5 1

我想使用所有可能的组合在每列中添加任意三个数字。我知道每列中可能的组合总数是20,因为我将在任何时候从6个数字中选择3个数字(即6个组合3)。所以,我希望有一个20乘2的矩阵作为我的输出。

例如,在第1列中,如果我在前3行中添加数字,我将得到8.同样,如果我在第2列的前三行中添加数字,我将得到18.所以我的外出这种情况将是8 18.类似地,如果我选择第2行到第4行,我的输出将是15 16,第3行到第5行将给出16 17.所以将具有类似的内容:

8 18
15 16
16 17
  .
  .
etc

我的最终输出是20乘2矩阵。

拜托,有人可以提供帮助吗?

1 个答案:

答案 0 :(得分:3)

您可以获取每个唯一组合的索引,然后将它们用作原始矩阵的线性索引,以获得您想要的内容,如下所示:

% your input matrix
A = [1, 9; 2, 3; 5, 6; 8, 7; 3, 4; 5, 1];

% find indices for unique combinations (i.e. order doesn't matter)
n = size(A,1);   B = zeros(nchoosek(n,3), 3);   counter = 0;
for i = 1 : n, for j = i+1 : n, for k = j+1 : n      
  counter = counter + 1;
  B(counter,:) = [i,j,k];
end; end; end

% apply as linear indices to original matrix and collect
C = [sum(A(B), 2), sum(A(B + size(A,1)), 2)]

C =
    8   18
   11   19
    6   16
    ⋮   ⋮
   13   11
   16   12