Effiziente Umsetzung summiert Bereich Tisch - /integral-Bild in R
Ich versuche zu konstruieren, ein summiert Bereich Tisch-oder integral-Bild ein Bild-matrix. Für diejenigen von Euch, die nicht wissen, was es ist, aus wikipedia:
Einem summierenden Bereich Tabelle (auch bekannt als ein integraler Bild) ist eine Datenstruktur und Algorithmus, um schnell und effizient die Erzeugung der Summe der Werte in einem rechteckigen Teil eines grid
In anderen Worten, es wird benutzt, um die Summe bis-Werte für alle rechteckigen Bereich im Bild/matrix in konstanter Zeit.
Ich versuche, dies umzusetzen, in R. Aber mein code scheint zu lange dauert.
Hier ist der pseudo-code aus dieser link. in
ist die input-matrix oder Bild-und intImg
ist, was zurückgegeben
for i=0 to w do Summe←0 for j=0 to h do Summe ← Summe + in[i, j] wenn i = 0 dann intImg[i, j] ← Summe sonst intImg[i, j] ← intImg[i − 1, j] + Summe end if Ende für Ende für
Und hier ist meine Umsetzung
w = ncol(im) h = nrow(im) intImg = c(NA) Länge(intImg) = w*h for(i in 1:B){ #x Summe = 0; for(j in 1:r){ #y ind = (j-1)*w)+ (i-1) + 1 #index Summe = Summe + im[ind] if(i == 1){ intImg[ind] = Summe }else{ intImg[ind] = intImg[ind-1]+Summe } } } intImg = matrix(intImg, h, w, byrow=T)
Beispiel von input-und output-matrix:
Jedoch auf eine 480x640
matrix, das dauert ~ 4 Sekunden. In dem Papier, das Sie beschreiben, es zu nehmen auf die Reihenfolge der Millisekunden, die für diese Dimensionen.
Mache ich etwas ineffizient in meine loops oder Indizierung?
Als ich das schreiben in C++ und wickelte Sie in R, aber ich bin nicht sehr vertraut mit C++.
Danke
- ein link zu
im
würde, machen diese reproduzierbar. es ist schwer für mich zu analysieren, was Sie tun, ohne ein Beispiel, aber Sie können wahrscheinlich verwendencolSums()
undrowSums()
oder andere vektorisierte Funktion(en). im
ist nur irgendeine matrix. Ich habe ein Beispiel für die input-und output-in der Frage- Wie viel Verbesserung bekommt man durch ändern
intImg = c(NA)
zuintImg <- rep(NA, 480*460)
? - Hi joran, ich habe versucht. Ändert sich nicht viel. Was ist der Unterschied?
- Sie brauchen zum starten viel mehr spezifischen. "Nicht viel ändern" und bietet Bilder von Beispiel-Matrizen ist nicht sehr hilfreich.
- es bezieht sich darauf, wie R hat, (wieder -) Zuweisung von Arbeitsspeicher für jede iteration einer Schleife.
- Ändert sich nicht viel, das heißt noch etwa 4 Sekunden. 4.02 Sekunden um genau zu sein. Hier können Sie einfach kopieren, fügen Sie diese in Ihrem R-Konsole ein Beispiel für eine matrix, nicht ein Bild:
m = matrix(c(4,1,2,2,0,4,1,3,3,1,0,4,2,1,3,2), 4,4,byrow=T)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie versuchen, zu verwenden
apply
(ist nicht schneller als die for-Schleifen, wenn Sie vor der Zuteilung von Speicherplatz):cumsum
Anrufe (plus die Schleife bilden-code und-Zuweisung etc) in der Erwägung, dass die OP ' s code tut viele Anrufe zu+
zu geben, die äquivalent zu Ihremcumsum
Anrufe. Wie es interpretiert wird code alle diejenigen Funktionsaufrufe, addieren sich.for
loops, die doppelt gelten, dauerte weniger als eine Sekunde.cumsum
sehr effizienten code und alle, die+
Anrufe sich häufen, wie die Dimension der Eingabe zu erhöhen. Profilierung der OP-code wird zeigen, dass.