2

在 Wolfram Mathematica 中,有一个名为Permutations( http://reference.wolfram.com/mathematica/ref/Permutations.html ) 的函数。它可以给出恰好包含 n 个元素的所有排列。

例如:Permutations[{1,2,3,4}, {2}]

{{1, 2}, {1, 3}, {1, 4}, {2, 1}, {2, 3}, {2, 4}, {3, 1}, {3, 2}, {3, 4}, {4, 1}, {4, 2}, {4, 3}}

我知道 Matlab 有一个类似的功能perms,但它只接收一个参数并给出所有可能的排列。有没有其他类似 Mathematica 的函数Permutations[list,{n}]?</p>

4

2 回答 2

2

如果顺序无关紧要,请查看nchoosek.

如果确实如此(似乎是这种情况),则存在一种效率低下、丑陋但不依赖工具箱的单线:

>> unique(builtin('_paren', perms(1:4), :,1:2), 'rows')
ans =
      1     2
      1     3
      1     4
      2     1
      2     3
      2     4
      3     1
      3     2
      3     4
      4     1
      4     2
      4     3

(这真的是一个被黑的两条线)。

我建议你combnk从统计工具箱中使用。

于 2013-10-22T11:58:24.910 回答
2

您可以使用获得所需大小的所有组合,nchoosek然后使用perms. k这意味着对于向量的长度排列,v您可以使用

A=nchoosek(v,k);
P=reshape(A(:,perms(1:k)), [], k);

请注意, 的行P不会被排序,您可以使用sortrows它来排序:

P=sortrows(reshape(A(:,perms(1:k)), [], k));

使用您的示例

v = 1:4;
k = 2;
A=nchoosek(v,k);
P=sortrows(reshape(A(:,perms(1:k)), [], k))

返回:

P =
     1     2
     1     3
     1     4
     2     1
     2     3
     2     4
     3     1
     3     2
     3     4
     4     1
     4     2
     4     3
于 2013-10-22T15:32:55.317 回答