在 Matlab 中生成矩阵的所有可能组合

Posted

技术标签:

【中文标题】在 Matlab 中生成矩阵的所有可能组合【英文标题】:Generate All Possible combinations of a Matrix in Matlab 【发布时间】:2014-10-27 18:14:16 【问题描述】:

如果知道该矩阵的元素只能是 0 或 1,我如何为 N*M 矩阵生成所有可能的值?

例如,如果我想要一个 2*2 矩阵,我们会得到 16 个具有不同可能组合的矩阵:[0 0;0 0], [1 1;1 1], [1 0;0 1],[1 1个; 0 0],[0 0;1 1]...等

【问题讨论】:

【参考方案1】:

使用 dec2base -

combs = dec2base(0:power(2,N*M)-1,2) - '0'

这会在行中生成所有可能的组合。因此,要选择任何组合,您需要索引到combs。因此,第一个组合[0,0,0,0] 将在combs(1,:) 可用,最后一个[1,1,1,1] 将在comb(end,:)

如果您可能的值来自不同的集合,例如 0,1,2,3,请进行此编辑 -

combs = dec2base(0:power(4,N*M)-1,4) - '0'

如果您想获得与输入矩阵大小相同的组合,请使用 -

combs_matshaped = reshape(permute(combs,[3 2 1]),N,M,[])

这将创建一个 3D 数组,其中包含与组合一样多的 2D 切片,并且矩阵的每个组合都是“可索引的”,具有第三维索引。例如,如果您打算获得第一个组合,请使用combs_matshaped(:,:,1),对于最后一个组合,请使用combs_matshaped(:,:,end)

【讨论】:

完美,很好的答案!哦,也许只是为了完整性添加reshape(combs(1,:), N, M) @Divakar combs(1,:) 会将其提取为向量而不是矩阵,有没有办法在不使用循环的情况下这样做? 没关系,丹回答了我 @AmiraAkra 查看有关如何在没有循环的情况下一次性获得这些矩阵的编辑内容!【参考方案2】:

另一种可能性(虽然Divakar's answer 更简单而且可能更快):

c = cell(1,N*M);
[cend:-1:1] = ndgrid([0 1 2 3 ]); %// or change set of values: [0 1 2 3] etc
combs = cell2mat(cellfun(@(x) x(:), c, 'uni', 0)); %// results as row vectors
combs = reshape(combs.',N,M,[]); %// NxM matrices: combs(:,:,1), combs(:,:,2),...

【讨论】:

以上是关于在 Matlab 中生成矩阵的所有可能组合的主要内容,如果未能解决你的问题,请参考以下文章

在python中生成组合

怎么在matlab中生成一个随机的强联通图

如何在字典中生成所有可能的组合

在 C 中生成所有可能的数组值组合

Hive UDF 从列表中生成所有可能的有序组合

在Matlab中生成包含给定集合中至少一个元素的所有组合