Ich habe 16 1D-Arrays mit jeweils etwa 10-11 Millionen Doppelpräzisionselementen. Ich muss eine Kreuzkorrelation über sie ausführen, d. H. 1 mit 2, 1 mit 3, ..., 1 mit 16, 2 mit 3, 2 mit 4, ..., 2 mit 16 und so weiter. Dies kann nicht effizient auf meinem MacBook Intel Core 2 Duo 2,4 GHz mit 4 GB RAM durchgeführt werden. Meine Frage ist, was ist der typische Ansatz, wenn nicht rohe Gewalt (schneller Prozessor, mehr RAM), die Menschen verwenden, um dieses Problem zu überwinden, oder solche Probleme? Vielen Dank!Kreuzkorrelation von mittelgroßen Arrays
Antwort
Wenn Sie die Fourier-Transformation von jedem Ihrer Arrays berechnen, sollten Sie in der Lage sein, die transformierten Arrays effizient zu verwenden, um die zwischen jedem Paar der ursprünglichen Eingangsarrays zu berechnen. Siehe den Abschnitt "Eigenschaften" von der Wikipedia-Artikel, mit dem ich verlinkt habe, um die Identität zu verwenden.
Die Kreuzkorrelationsfunktion in Numpy ist lächerlich langsam. Die openCV-Bibliothek verfügt über eine numberfreundliche Kreuzkorrelationsfunktion. Selbst wenn Sie versuchen, einen Frequenzbereich-Ansatz zu implementieren, werden Sie die openCV-Bibliothek nicht schlagen, da mehr Tricks zur Verfügung stehen, um eine Kreuzkorrelationsberechnung zu beschleunigen. Ich stellte darüber vor:
Computing cross-correlation function?
ich den Code glauben an die folgenden Papier detailliert auf die Tricks basiert:
JP Lewis, „Fast Template-Matching“ in Vision-Schnittstelle, 1995, vol . 95, pp. 120-123.
Ich weiß über diese Identität. Ich benutze NumPy, das direkt die Kreuzkorrelation berechnet. Würde die Berechnung der Kreuzkorrelation unter Verwendung dieser Identität die Berechnung merklich beschleunigen, d. H. Genug, so dass ich sie nicht über Nacht laufen lassen müsste, sagen wir? –
@cpcloud: Ich bin kein Python-Experte, aber ich habe etwas gegoogelt und an anderer Stelle auf SO eine Antwort gefunden, die behauptete, dass NumPy die FFT-Technik nicht verwendete. (Es wäre also wahrscheinlich ein wenig schneller, wenn ein Array viel kleiner als das andere wäre, aber langsam für den Fall, mit dem Sie es zu tun haben.) Die Berechnung der FFT eines Arrays mit 10 Millionen Punkten sollte nicht zu lange dauern. Ich erwarte eine signifikante Beschleunigung, wenn Sie eine Kreuzkorrelationsroutine unter Verwendung der Fourier-Identität implementieren. –
Danke! Könnten Sie einen Link zu der Stelle veröffentlichen, an der Sie diese Informationen gefunden haben? Sehr geschätzt! –