如何在Matlab

时间:2016-04-04 03:24:28

标签: matlab recursion combinations partition

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

= [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循环,其中 n I中唯一元素的数量 ,限制从0到可以使用元素i的最大次数。

为了让它运行得更快,我还修改了限制,使得总和将自动 k ,而不会在最后检查。在这个过程中,我实际上设法删除了一个for循环。

这样的算法确实有效,但我的代码看起来确实很乱(想象一下,如果我有10个嵌套的for循环:O)。更重要的是,我发现很难为任何一组输入自动化程序( I L ,< strong> k )使用此功能。

你能想到其他任何方法吗?我认为递归在这里可以正常工作但我在这方面并不是很好,我觉得很难在Matlab中实现它。

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

1 个答案:

答案 0 :(得分:0)

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

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