在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' s Permutations[list,{n}]
?
答案 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