在MATLAB中查找总结为特定数字的向量元素

时间:2013-02-13 07:48:26

标签: matlab combinatorics

让我们考虑一下我们有一个向量VEC

是否可以找到哪些向量元素可以分组 它们总结为MATLAB中的给定数字NUM?

例如,VEC = [2 5 7 10]NUM = 17

请求的算法应该提供子向量[2 5 10][7 10]总和给定NUM的答案。

3 个答案:

答案 0 :(得分:3)

这是一种使用conbntns解决此问题的方法,这是映射工具箱中的一个函数,用于检索所有可能的值集组合(如果没有此工具箱,则可以使用combinator来自FEX)。因此,对于向量A,我们会找到给定长度的所有可能组合(1到A的长度)然后对它们求和,看看哪个等于NUM=17

NUM=17;
A=[2 5 7 10];
for ii=1:numel(A)
    B=combntns(A,ii);
    C=sum(B,2);
    D=find(C==NUM);
    if ~isempty(D)
        B(D,:)
    end
end

ans =
     7    10
ans =
     2     5    10

当然,您可以将B(D,:)输出存储到单元格数组或其他任何内容以供将来使用...

答案 1 :(得分:3)

这是另一种没有任何工具箱或第三方功能的方法。它会逐步检查VEC中所有可能的值组合,并测试总和是否等于NUM

VEC = [2 5 7 10]
NUM = 17;
n = length(VEC);
for i = 1:(2^n - 1)
    ndx = dec2bin(i,n) == '1';
    if sum(VEC(ndx)) == NUM
        VEC(ndx)
    end
end

ans =
     7    10
ans =
     2     5    10

这类似于natan's answer,但未使用conbntns

答案 2 :(得分:2)

如果我没弄错的话,这个问题就是NP难题 但有趣的方法可能是使用bintprog

n = numel( VEC );
x0 = zeros( 1, n ); % one possible init guess
x = bintprog( zeros( n, 1 ), ...  % objective function meaningless, we look for feasibility
              [], [], ... % no inequality constraints
              VEC(:)', NUM, ... %' we want the sum of selected elements to equal NUM
              x0 ); % changing init x0 might result with different solutions
find( x ) 

二元向量xbintprog中优化的解决方案)选择总和为NUM的相关元素