2016-03-23 6 views
0

Ich möchte Vektoren mit verschiedenen Zeitstempeln ausrichten und zählen, um die entsprechenden Bins zu zählen.Wie man Vektoren mit asynchronem Zeitstempel in Matlab ausrichtet?

Nehmen wir an, ich habe 3 Matrix von [N, Kanten] = Histcounts in der folgenden Struktur. Die erste Zeile repräsentiert die Kanten, also die Bins. Die zweite Zeile repräsentiert die Werte. Ich möchte alle Werte mit der gleichen Bin summieren.

A = [0 1 2 3 4 5; 
    5 5 6 7 8 5] 

B = [1 2 3 4 5 6; 
    2 5 7 8 5 4] 

C = [2 3 4 5 6 7 8; 
    1 2 6 7 4 3 2] 

Jetzt möchte ich alle die gleichen Bins summieren. Mein Endergebnis sollte sein:

result = [0 1 2 3 4 5 6 7 8; 
      5 7 12 16 ...] 

ich konnte Schleife über alle Zahlen, aber ich möchte es schnell haben.

Antwort

4

können Sie accumarray verwenden:

H = [A B C].'; %//' Concatenate the histograms and make them column vectors 

V = [unique(H(:,1)) accumarray(H(:,1)+1, H(:,2))].'; %//' Find unique values and accumulate 

V = 

    0 1 2 3 4 5 6 7 8 
    5 7 12 16 22 17 8 3 2 

Hinweis: Die H(:,1)+1 ist die Bin-Werte zu zwingen, positiv zu sein, sonst wird MATLAB beschweren. Wir verwenden immer noch die tatsächlichen Bins in der Ausgabe V. Um dies zu vermeiden, wie @ Daniel in den Kommentaren sagt, verwenden Sie die third output of unique (Siehe: https://stackoverflow.com/a/27783568/2732801):

H = [A B C].'; %//' stupid syntax highlighting :/ 
[U, ~, IU] = unique(H(:,1)); 
V = [U accumarray(IU, H(:,2))].'; 
+2

Um die +1 zu vermeiden, [verwenden Sie die dritte Ausgabe von unique] (http://stackoverflow.com/a/27783568/2732801). Dann die erste Zeile kann alles sein (einschließlich negativer Werte oder schwimmt) – Daniel

+0

@Daniel Das ist besser, danke. – beaker

2

Wenn Sie es nur mit 3 Variablen tun, wie Sie gezeigt haben, gibt es wahrscheinlich keine Performance-Hits mit Looping es.

Aber wenn Sie die Looping-Idee wirklich ablehnen, dann können Sie es mit arrayfun tun.

rng = 0:8; 
output = arrayfun(@(x)sum([A(2,A(1,:) == x), B(2,B(1,:) == x), C(2,C(1,:) == x)]), rng); 

output = cat(1, rng, output); 

    output = 

     0  1  2  3  4  5  6  7  8 
     5  7 12 16 22 17  8  3  2 

Dies kann für besonders große A, B und C Variablen von Vorteil sein, da es keine Kopieren von Daten ist.

+0

Vielen Dank für die Antwort. Die Antwort von Beaker und Daniel ist allgemeiner anwendbar, also gab ich ihm das "Akzeptieren". –

Verwandte Themen