【问题标题】:how do I combine only the vectors - Matlab我如何只组合向量 - Matlab
【发布时间】:2015-04-16 20:50:35
【问题描述】:

如何在 Matlab 中将所有向量组合成小的向量子集?

a= [5 6 7] b = [8 9 10] c=[11 12 13] d=[14 15 16] e=[17 18 19]

a 与 b 和 c 结合:

结果:

M1= [ 5 6 7 8 9 10 11 12 13]

a 与 b 和 d:

M2 = [5 6 7 8 9 10 14 15 16]

等等.....

【问题讨论】:

  • 那么,以 3 人一组的方式组合而不重复?所有这些向量的长度都是 3 吗?

标签: arrays matlab


【解决方案1】:

这个答案涵盖了任意数量的向量的情况。这些向量被假定为等长的行向量。

让您的示例数据定义为

a = [5 6 7]; b = [8 9 10]; c = [11 12 13]; d = [14 15 16]; e = [17 18 19];
vectors = {a, b, c, d, e}; %// cell array with any number of row vectors of equal size
n = 3; %// desired subset size

然后:生成所有索引组合,用它来索引vectors,连接成一个大行向量,并对其进行整形以获得所需的结果:

combs = nchoosek(1:numel(vectors), n);
result = reshape([vectors{combs.'}], numel(vectors{1})*n, []).';

这给出了一个矩阵,其第一行是你的M1,第二行是M2 等等:

result =
     5     6     7     8     9    10    11    12    13
     5     6     7     8     9    10    14    15    16
     5     6     7     8     9    10    17    18    19
     5     6     7    11    12    13    14    15    16
     5     6     7    11    12    13    17    18    19
     5     6     7    14    15    16    17    18    19
     8     9    10    11    12    13    14    15    16
     8     9    10    11    12    13    17    18    19
     8     9    10    14    15    16    17    18    19
    11    12    13    14    15    16    17    18    19

【讨论】:

  • 是的,如我的代码中所述。 OP示例似乎表明了这一点。但问题不清楚
  • 你不需要处理元胞数组然后我猜:A = cat(1,a,b,c,d,e).'; out = reshape(A(:,nchoosek(1:5,3).'),9,[]).';?与您现有的非常相似。
  • @Divakar 是的,我同意 5 向量的情况。我试图使它更通用,以便它适用于任意数量的向量。我会在我的回答中更清楚地说明这一点
  • Luis Mendo 的答案正是我想要的。相同大小向量的通用方法。非常感谢。
【解决方案2】:

你可以使用cat函数:

res = cat(2,a,b,c);

或者只是[] 语法:

res = [a b c];

在这两种情况下,res 都将包含[5 6 7 8 9 10 11 12 13]

最好的,

【讨论】:

    【解决方案3】:

    使用nchoosek

    a = [5 6 7]; b = [8 9]; c = [11 12 13]; d = [14 15 16]; e = [17 18 19];
    N = 3;
    x = {a,b,c,d,e};
    y = nchoosek(x,N);
    

    并且您在单元格数组中一次获取了N 的所有数组组合。单元格x 的每一行i 是一个组合,因此要将其作为行向量返回即可

    horzcat(y{i,:})
    

    或者,如果您想将它们全部获取并放入大小为 n_combs 的元胞数组中

    n_combs = size(y,1);
    out = cell(0,n_combs);
    for i = 1 : n_combs
        out{i} = horzcat(1, y{i,:});
    end
    

    你想要组合的数组的大小没有限制,例如,你可以组合

    a = [5 7]; b = [8 9]; c = [11]; d = [20 14 15 16]; e = [17 18 19];
    

    但是,如果您必须将所有组合放在一个矩阵中,则数组必须具有相同的大小。在这种情况下,Luis Mendo 的回答就可以了。

    最后,如果允许重复使用nmultichoosek 而不是nchoosek

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多