matlab - 如何在Matlab中枚举具有固定元素数量和元素之和的所有可能子集

标签 matlab recursion combinations partition

给定一组可能的值I,如何枚举长度为L的所有可能的子集向量使用 Matlab 使得元素之和为 k

I=[0 0 0 1 1 1 2 2 2 3 3 3],L =3,并且k=4。可能的子集包括: [0 1 3] [0 3 1] [1 0 3] [1 3 0] [3 0 1] [3 1 0] [0 2 2] [2 0 2] [2 2 0] 等

我现在正在实现的解决方案是这样的:创建n个嵌套for循环,其中nI中唯一元素的数量,限制范围是从0到元素i可以使用的最大次数。

为了让它运行得更快,我还修改了限制,使得总和将自动为k,而无需我最后检查。在此过程中,我实际上成功地删除了一个 for 循环。

这样的算法确实有效,但我的代码看起来确实很困惑(想象一下,如果我有 10 个嵌套的 for 循环:O)。更重要的是,我发现很难对任何一组输入(IL、< strong>k)使用这个。

你能想到其他方法来做到这一点吗?我认为递归在这里可以很好地工作,但我在这方面不是很好,而且我发现很难在 Matlab 中实现它。

PS。我还尝试了combnk(I,L),然后检查总和是否为k,但事实证明,对于大I和L,代码运行速度非常慢。

最佳答案

这是使用递归的一种方法(没有任何循环):

function [ comb ] = enumAll(I,L,K)

%//obtain a unique vector of I
I = unique(I);

%//base case: for the last place, enumerate all possibilites from 1:K
if L==1
    comb = (1:K).'; %//'
    return;
end

%//at each recursion step, find the (possibilities of the remaining positions), ..
suffixes = enumAll(I,L-1,K);
%//..and add the possibilities of this position with all of them
comb = reshape( repmat( (((1:K).')*(10^(L-1))).' , [length(suffixes) 1] ), [length(suffixes)*K 1] ) + repmat(suffixes,[K 1]);

end

关于matlab - 如何在Matlab中枚举具有固定元素数量和元素之和的所有可能子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36394098/

相关文章:

带有 C++ 中全局数据的 Matlab Mex 文件

linux - 递归查找具有特定扩展名的文件

python - 如何在Python中递归地实现一个方法

javascript - 无法通过递归调用 node.js 中的函数从 promisese 获得响应

python - 有没有办法获得一组元组的组合?

matlab - 视频帧的卡尔曼滤波器跟踪和预测

matlab - 使用频域检测图像中的平行线

r - 使用重叠阈值逐行选择跨列的组合

matlab - numpy reshape问题(matlab比较)

python - 在 python 中进行组合