【问题标题】:generate Combinations from a value in matlab从matlab中的值生成组合
【发布时间】:2015-01-22 12:39:48
【问题描述】:

如何为某个数字生成可能的不同组合 示例:

m=2 给出:

[1 1;1 2;2 1;2 2]

m=3 给出: [1 1;1 2;1 3;2 1;2 2;2 3;3 1;3 2;3 3] 等等……

使用perms([1 2]) 仅生成[1 2;2 1]

【问题讨论】:

  • 这些实际上是 not combinations 在数学意义上,因为 [1,2][2,1] 将是相同的。它们也不是排列,这就是perms 不起作用的原因。这些实际上只是笛卡尔积元组。这听起来可能过于精确,但如果您寻找解决此问题的方法,那么正确的名称会让您走得更远。
  • 您可以使用this answer 和输入vectors = { 1:m, 1:m } 来生成所有元组(“组合”)
  • 或等效地:这个答案this answer 输入vectors = {1:m 1:m}; combs = fliplr(combvec(vectors{end:-1:1}).') 做同样的事情。 ;-)
  • @Amira 如果答案帮助您解决了问题,请将其标记为已接受。谢谢!

标签: matlab combinations


【解决方案1】:

你可以使用ndgrid:

m = 3;

[A,B] = ndgrid(1:m);

这里的AB 看起来像这样:

A =

     1     1     1
     2     2     2
     3     3     3


B =

     1     2     3
     1     2     3
     1     2     3

因此您可以将它们垂直连接以获得组合。使用冒号运算符将矩阵转换为列向量,即按列列出所有元素。因此,您可以使用任一

P = sortrows([A(:), B(:)])

P = [B(:) A(:)] %// Thanks @knedlsepp :)

得到排序的组合。

P 现在看起来像这样:

P =

 1     1
 1     2
 1     3
 2     1
 2     2
 2     3
 3     1
 3     2
 3     3

请注意,您的问题与以下内容高度相关,其目标是从 2 个向量中找到组合。:How to generate all pairs from two vectors in MATLAB using vectorised code?。我建议你也看看它以获得更多想法。

话虽如此,这个问题可能是重复的......无论如何希望有所帮助。

【讨论】:

  • 您甚至可以简化 ndgrid 行,因为 [A, B] = ndgrid(1:m) 是等价的。
  • 正如我们所做的那样:[B(:) A(:)] 可以为您节省排序 ;-)
  • ndgrid 方法是否适用于说“4-over-3”?还是只是二维情况?无论如何 +1,因为它比我的更简单、更快。
  • @Benoit_11:由于thewaywewalk 也是德语母语人士,所以可能是“4 über 3”的翻译问题,应该翻译成“4 choose 3”,而不是“4 over 3”。
  • @thewaywewalk:要将这种方法应用于一般的k-值元组1:n,我想这可以使用:Cs = cell(1,k); [Cs{:}] = ndgrid(1:n); tuples = reshape(cat(n+1, Cs{:}),n^k,[]); 进行概括,但是,这比 OP 要求的要多...顺便说一句:我认为您的方法不适用于 1:5=n 的 k=3 元组。
【解决方案2】:

这有点棘手,因为nchoosek 不能直接开箱即用:

n = 3;
X = nchoosek([1:n, n:-1:1],2); 
Y = unique(X,'rows','legacy');

分别在一行中:

Y = unique(nchoosek([1:n, n:-1:1],2),'rows','legacy');

【讨论】:

  • 不错!我认为第三行有错字;不应该是unique(X,...) 而不是unique(Z,...) 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 2014-07-07
  • 2014-12-12
  • 2015-05-03
相关资源
最近更新 更多