Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何(在MATLAB中)生成n个1:v子集的所有集合?_Matlab - Fatal编程技术网

如何(在MATLAB中)生成n个1:v子集的所有集合?

如何(在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]}

例如,给定 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]} 不是)


非常感谢您的帮助。

您可以使用
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)