【问题标题】:How to generate the combination of numbers (Permutation and combination)如何生成数字的组合(排列组合)
【发布时间】:2016-09-05 01:04:18
【问题描述】:

我有以下 6 x 2 矩阵:

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

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

例如,在第 1 列中,如果我将前 3 行中的数字相加,我将得到 8。同样,如果我将第 2 列中的前三行中的数字相加,我将得到 18。所以我的 out in这种情况将是 8 18。同样,如果我选择第 2 到 4 行,我的输出将是 15 16,第 3 到 5 行将给出 16 17。所以会有类似的东西:

8 18
15 16
16 17
  .
  .
etc

我的最终输出将是一个 20 x 2 的矩阵。

请问,有谁能帮忙吗?

【问题讨论】:

    标签: matlab octave


    【解决方案1】:

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

    % 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
    

    【讨论】:

    • 谢谢!有用!虽然,我试图理解代码背后的逻辑:)
    • 如果您想更好地了解最后一步发生了什么,请阅读此处的“线性索引”和“访问多个元素”段落:uk.mathworks.com/help/matlab/math/matrix-indexing.html
    • 我意识到当数据增加到 10 x 2 矩阵时,perms 命令不起作用。例如使用以下数据给了我错误:A = [1, 1; 1、5; 3、9; 4、2; 4、6; 6、2; 7、6; 6、9; 9, 9; 4, 5];
    • 感谢 Tasos,您是一位非常耐心和彻底的老师。你是最棒的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    相关资源
    最近更新 更多