想要用条件创建非减少元素的组合

时间:2013-12-26 16:52:17

标签: matlab combinations

我想创建一个非减少元素的组合。组合将是,

如果i = 10且w = 5,则组合的元素可以是从1到w的任何值,并且总和将等于i。

可能的组合如,

1 + 1 + 1 + 1 + 1 + 5

1 + 1 + 1 + 1 + 1 + 1 + 4

1 + 1 + 1 + 1 + 1 + 1 + 1 + 3

1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 ......

但是1 + 1 + 1 + 7不是期望的组合,因为7大于w

如何使用MatLab获取组合?我需要获得i和w的更高值的组合,例如i = 20和w = 8。

谢谢

1 个答案:

答案 0 :(得分:2)

您可以使用递归函数执行此操作。以下代码包含一个包装函数和执行实际工作的递归函数:

function result = partitions(s,M)
%// s: desired sum; M: maximum value
result = partitions_rec(s,1,M,s);
end

function mat = partitions_rec(s,m,M,n)
%// s: desired sum, m: minimum value; M: maximum value; n: number of entries
M = min(M,s);
if s==0
    mat = zeros(1,n);
else
    mat = [];
    for ii = m:M;
        aux = partitions_rec(s-ii,ii,M,n-1);
        if size(aux,1)
            mat = [ mat; ii*ones(size(aux,1),1) aux ];
        end
    end
end
end

示例:

>> result = partitions(5,3)
ans =
     1     1     1     1     1
     1     1     1     2     0
     1     1     3     0     0
     1     2     2     0     0
     2     3     0     0     0

0表示没有数字。如果要删除零,则需要将结果放在单元格数组中,其中每个单元格都是一个非零值的向量:

result_cell = arrayfun(@(ii) result(ii, logical(result(ii,:))), 1:size(result,1), 'uniformoutput', 0);

在示例中,这将给出

>> result_cell{:}
ans =
     1     1     1     1     1
ans =
     1     1     1     2
ans =
     1     1     3
ans =
     1     2     2
ans =
     2     3