2016-06-07 11 views
1

zum Beispiel sagt, dass ich die DatenBestimmen Sie eine Summe in einem großen Datensatz

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

I, welche der Variablen im Datensatz finden müssen, die auf einen bestimmten Wert summieren, zum Beispiel: 8. In diesem Fall würde dies 5 + 3 = 8 ergeben.

Wie kann ich das erreichen?

dank

+1

Was passiert, wenn es mehrere Kombination von Variablen, die hinzufügen bis zu der Nummer z 'data = [4, 4, 6, 2, 2, 5, 3]' jetzt können Sie '8' machen, indem Sie' 5 + 3' oder '4 + 4' oder' 6 + 2' oder '4 + 2 wählen + 2' oder '4 + 2 + 2' mit der anderen' 4' ... – Dan

+0

Der Datensatz ist Rechnungen, also sollten sie nicht zur gleichen Summe addieren, z Daten = [107,38 17034,89 1201,10] usw. Es gibt natürlich eine Wahrscheinlichkeit, aber es sollte niedrig sein – user3523696

Antwort

3

Zunächst einmal ist es nicht immer eine Lösung für solche Probleme, und es könnte zu finden schwierig sein.

können Sie intlinprog nützlich finden:

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 die Indizes der Elemente der data enthalten sollte, die Summe zu sumTo entspricht.
Das ist sum(data(sel))==sumTo.

+1

Wirklich nett! Funktioniert super! Danke @Shai: D – user3523696

1

Ich denke, das folgende funktioniert. Ich habe eine Drei in der Liste hinzugefügt, nur um ein bisschen mehr zu verallgemeinern.

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 
+0

Was passiert, wenn 'Daten' etwas mehr als 9 Elemente hat, sagen wir 100? Was ist mit der Lösung "2 + 3 + 3 = 8"? – Shai

+0

kann es jetzt nicht überprüfen. Aber was ist mit 'a = nchoosek (Daten, 3)' und 'c = nchoosek (1: numel (data), 3)'? – shamalaia

+0

Bitte sehen Sie eine allgemeinere Lösung mit "Dauerwellen" in meiner zweiten Antwort. – Shai

1

Wenn Sie für eine erschöpfende Suche Art der Lösung gehen möchte (entlang der von A_C vorgeschlagenen Linien), können Sie perms verwenden:

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 
+1

hmmm, ich frage mich, ob die Leistung dieser Lösung durch Filtern des Datensatzes noch weiter steigen wird, da es keine negativen Zahlen gibt (nicht sicher, sondern nur durch Beobachtung) jede Zahl größer als 8 kann einfach verworfen werden. – GameOfThrows

+0

@GameOfThrows Ich denke nicht, dass "rohe Gewalt" hier der richtige Ansatz ist. Persönlich denke ich, dass die Verwendung von "intlinprog" der richtige Ansatz ist. Siehe meine [andere Antwort] (http://stackoverflow.com/a/37671492/1714410). – Shai

+1

ohhh, das ist echt cool - heute etwas gelernt: D – GameOfThrows