确定大型数据集中的总和

时间:2016-06-07 05:35:52

标签: matlab vector sum mathematical-optimization

例如说我有数据集

data = [2 4 12.3 54.2 0.3 11 5 3];

我需要找到数据集中哪些变量总和为特定值,例如:8。在这种情况下,这将导致5 + 3 = 8。

我怎样才能做到这一点?

感谢

3 个答案:

答案 0 :(得分:3)

首先,并不总能解决这些问题,而且可能很难找到。

您可能会发现intlinprog有用:

n = numel(data);
sumTo = 8;  %// the target sum
x = intlinprog(zeros(n,1), 1:n, [], [], data, sumTo, zeros(n,1), ones(n,1));
sel = find(sel);

sel应包含data元素的索引,其总和等于sumTo
也就是sum(data(sel))==sumTo

答案 1 :(得分:1)

我认为以下工作。我在列表中添加了三个,只是为了进一步概括。

data = [2 4 12.3 54.2 0.3 11 5 3 3];
a=nchoosek(data,2); %all perms
b=sum(a,2);
ii=find(b==8); %find perms summing up to 8
c=nchoosek(1:numel(data),2); %indexes of all perms
d=c(ii,:) %are the indexes
e=data(d) %are the values summing up to 8

d =

     7     8
     7     9


e =

     5     3
     5     3

答案 2 :(得分:1)

如果您想寻找详尽的搜索类型的解决方案(按A_C提议的方式),您可以使用perms

n = numel(data);
sumTo = 8;  %// target sum
pidx = perms(1:n);  %// indices of all permutations. note the EXPONENTIAL blow
pdata = data(pidx);  %// all permutations
csm = cumsum(pdata, 2);  %// sum along second dim
[r c] = find(csm == sumTo);  %// which perm sum to target sum
if ~isempty(r)
   %// select the first solution
   sel = pidx(r(1), 1:c(1));  %// sum(data(sel))==8
end