如何(在MATLAB中)生成n个1:v子集的所有集合?
例如,给定 n=3 及 v=2, 然后我希望函数生成:如何(在MATLAB中)生成n个1:v子集的所有集合?,matlab,Matlab,例如,给定 n=3 及 v=2, 然后我希望函数生成: {[1],[1],[1]} {[1],[1],[2]} {[1],[2],[2]} {[2],[2],[2]} {[1],[1],[1,2]} {[1],[1,2],[2]} {[1],[1,2],[1,2]} {[1,2],[1,2],[1,2]} {[1,2],[1,2],[2]} {[1,2],[2],[2]} 正如你所看到的,我想允许重复 N 每个集合的元素,但在每个子集内不重复(即 {[1],[1]} 允许但 {[1,1]}
{[1],[1],[1]}
{[1],[1],[2]}
{[1],[2],[2]}
{[2],[2],[2]}
{[1],[1],[1,2]}
{[1],[1,2],[2]}
{[1],[1,2],[1,2]}
{[1,2],[1,2],[1,2]}
{[1,2],[1,2],[2]}
{[1,2],[2],[2]}
正如你所看到的,我想允许重复
N
每个集合的元素,但在每个子集内不重复(即
{[1],[1]}
允许但
{[1,1]}
不是)
非常感谢您的帮助。您可以使用
nchoosek
使用生成重复的:
k = 2
%n is directly determined by k. for k = 3 you will already have 92378 collections of subsets.
%for k = 4, you better have the fastest supercomputer on earth...
n = nchoosek(2*k-1,k)
%generate all possible combination with repetition for n = 3
comb1 = nchoosek(1:2*n-1,n)-[0:n-1]
%generate all possible combination with repetition for k = 2
comb2 = nchoosek(1:2*k-1,k)-([0:k-1]+[k-1:-1:0])
%All the combination are know transformed into cell of size 1 x (nchoosek(2*k-1,k))
comb2 = mat2cell(uint8(comb2),ones(nchoosek(2*k-1,k),1),k)
%uint8 to convert negative value to 0, you can also use uint16, uint32...
res = reshape(comb2(comb1,:),nchoosek(2*n-1,n),n).';
注意,使用此方法,每个单元格的大小都相同,为1 x k,并且可以包含零。比如这个
单元格{[1]、[1]、[1,2]}
将{[0,1]、[0,1]、[1,2]}
res:
{[0 1][0 1][0 1]}
{[0 1][0 1][0 2]}
{[0 1][0 1][1 2]}
{[0 1][0 2][0 2]}
{[0 1][0 2][1 2]}
{[0 1][1 2][1 2]}
{[0 2][0 2][0 2]}
{[0 2][0 2][1 2]}
{[0 2][1 2][1 2]}
{[1 2][1 2][1 2]}
如果你真的想去掉0值,那么一个小的cellfun
就可以了:
res = cellfun(@(x)nonzeros(x),res,'UniformOutput',0)
res:
{[1][1][1]}
{[1][1][2]}
{[1][1][1 2]}
{[1][2][2]}
{[1][2][2]}
{[1][2][1 2]}
{[2][2][2]}
{[2][2][1 2]}
{[2][1 2][1 2]}
{[1 2][1 2][1 2]}
而且
n
不能随机设置n
应等于comb2
的组合数。那么为什么{1,[1,2],2}是唯一没有排序的值呢?这是一个错误吗?@obchardon函数输出集合的顺序并不重要,但在我的上下文中,{2,[1,2],[1,2]}为什么不是集合的一部分呢?(例如)对不起,应该是,我忘记了一些元素。非常感谢,这是一个巨大的帮助!:)抱歉,有一件小事-出于某种原因,当我运行这个函数时,我得到了两个{[1][1][1]}的副本,而没有{[1][1][2]}的副本,你知道为什么吗?错过了一个矩阵转置,现在已经修复了。顺便说一句,n
不能随机设置,n
应该是n=nchoosek(2*k-1,k)