Algorithm Matlab中的置换函数
在Wolfram Mathematica中,有一个函数称为Algorithm Matlab中的置换函数,algorithm,matlab,wolfram-mathematica,permutation,Algorithm,Matlab,Wolfram Mathematica,Permutation,在Wolfram Mathematica中,有一个函数称为置换()。 它可以给出正好包含n个元素的所有置换 例如:置换[{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的置换[list,{n}]的函数?如果顺序不重要,请查看nchoosek
置换
()。
它可以给出正好包含n个元素的所有置换
例如:置换[{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的置换[list,{n}]
的函数?如果顺序不重要,请查看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
。如果顺序不重要,请查看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
。您可以使用nchoosek
获得所需大小的所有组合,然后使用perms
进行排列。这意味着对于向量v
中长度k
的排列,您可以使用
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
您可以使用
nchoosek
获得所需大小的所有组合,然后使用perms
进行排列。这意味着对于向量v
中长度k
的排列,您可以使用
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
FEX上有一个:FEX上有一个:+1,但我建议您也添加两行等效线以确保易读性。+1,但我建议您也添加两行等效线以确保易读性。