【问题标题】:Determine a sum in a large data set确定大型数据集中的总和
【发布时间】:2016-06-07 05:35:51
【问题描述】:

比如说我有数据集

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

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

我怎样才能做到这一点?

谢谢

【问题讨论】:

  • 如果有多个变量组合加起来等于数字,例如data = [4, 4, 6, 2, 2, 5, 3] 现在你可以通过 5+34+46+24+2+24+2+2 使用另一个 4 来制作 8...
  • 数据集是账单,因此它们的总和不应相同,例如data = [107,38 17034,89 1201,10] 等。当然有概率,但应该很低

标签: matlab vector sum mathematical-optimization


【解决方案1】:

首先,此类问题并不总是有解决方案,而且可能很难找到。

你可能会发现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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

    • 如果data 的元素多于 9 个,比如 100 个呢? 2+3+3=8的解决方案呢?
    • 现在无法查看。但是a=nchoosek(data,3)c=nchoosek(1:numel(data),3) 呢?
    • 请在我的第二个答案中查看使用perms 的更通用的解决方案。
    【解决方案3】:

    如果您想寻求详尽的搜索类型的解决方案(按照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
    

    【讨论】:

    • hmmm,我想知道这个解决方案的性能是否会通过过滤数据集进一步提高,因为没有负数(不确定,但只是通过观察)任何大于 8 的数字都可以丢弃。
    • @GameOfThrows 我不认为“蛮力”是正确的方法。就个人而言,我认为使用intlinprog 是正确的方法。见我的other answer
    猜你喜欢
    • 2018-01-19
    • 2015-07-25
    • 1970-01-01
    • 2021-02-05
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2013-02-28
    相关资源
    最近更新 更多