排列功能在Matlab中

时间:2013-10-22 11:33:30

标签: algorithm matlab wolfram-mathematica permutation

在Wolfram Mathematica中,有一个名为Permutationshttp://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' s Permutations[list,{n}]

2 个答案:

答案 0 :(得分: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

(真的是a hacked two-liner)。

我建议你只使用统计工具箱中的combnk

答案 1 :(得分: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