让我们考虑一下我们有一个向量VEC
。
是否可以找到哪些向量元素可以分组 它们总结为MATLAB中的给定数字NUM?
例如,VEC = [2 5 7 10]
和NUM = 17
请求的算法应该提供子向量[2 5 10]
和[7 10]
总和给定NUM
的答案。
答案 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 )
二元向量x
(bintprog
中优化的解决方案)选择总和为NUM
的相关元素