Matlab 排列组合
1. n的阶乘:factorial(n)
n 为标量、向量、实数数组、非负整数。
2. 组合数:
2.1 nchoosek
n 取 m 的值(即二项式系数):nchoosek(n,m)
b = nchoosek(5,4);
% b = 5
向量 v 中一次取 k 个的所有可能:nchoosek(n,m)
v = 2:2:10;
C = nchoosek(v,4)
C = 5×4
2 4 6 8
2 4 6 10
2 4 8 10
2 6 8 10
4 6 8 10
b = nchoosek(size(v,2),4);
b = 5
3. 排列数
3.1 perms(v) 向量不重复所有元素排列
v = [2 4 6];
P = perms(v)
P = 6×3
6 4 2
6 2 4
4 6 2
4 2 6
2 6 4
2 4 6
官方提示,length(v)<10 比较实用。
3.2 permn(v,n) 可重复抽取向量 v 中 n 个元素的所有可能
非matlab自带,需下载附加功能
b = permn([1,2,3],2)
b = 9x2
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
3.2 其他遇见的问题
e.g. [0 0 0 1]四个数的排列问题
如果直接用 perms([0 0 0 1]), matlab 会把三个 0 当成不一样的元素。加上 unique 函数就可以了。
perms([0 0 0 1])
ans =
1 0 0 0
1 0 0 0
1 0 0 0
1 0 0 0
1 0 0 0
1 0 0 0
0 1 0 0
0 1 0 0
0 0 1 0
0 0 0 1
0 0 1 0
0 0 0 1
0 1 0 0
0 1 0 0
0 0 1 0
0 0 0 1
0 0 1 0
0 0 0 1
0 1 0 0
0 1 0 0
0 0 1 0
0 0 0 1
0 0 1 0
0 0 0 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
unique(perms([0 0 0 1]),"rows")
ans =
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0