DMUG-Archiv 2002

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Do loop beschleunigen

Hallo,

folgendes Problem: Wir lesen mit einer CCD-Kamera ein 1024x1024 Pixel
großes Bild ein, das eine radialsymmetrische Verteilung zeigt (eines
"Bessel-Bündels", eine "beugungsfreie" Besonderheit aus der Optik).
Dieses Bild wollen wir radial mitteln, d.h. zu jedem Pixel berechnen wir
den Radius zu einem vorgegebenen Mittelpunkt und sortieren die Pixel aus
dem zweidimensionalen Bild in eine eindimensionale Liste ("binning"),
wobei zum Mitteln in mitgezählt wird, wieviele Punkte in einen Topf
fallen. Das Problem ist, daß die Do-Schleife sehr langsam ist. Ein
Ausweg ist natürlich ein cpp-Program mit Mathlink, das wird
mittelfristig sowieso geschrieben werden. Aber für viele ähnliche
Probleme würde mich der prinzipielle Weg interessieren, solche
primitiven Schleifen zu beschleunigen.

1.) Ist eine Kombination aus Evaluate/Compile der richtige Ansatzpunkt?
Wenn ja, wo ansetzen? Ist es kritisch, Mathematica vorzugeben, daß
bestimmte Variablen nur Integer bzw. nur Real sind? Soll das Innenleben
der Schleife als Funktion/Modul angesetzt werden?

2.) Ist es schneller, eine Liste aufzubauen, in der man zu jedem
Matrixelement den aus dem Radius berechneten Index für die radiale Liste
berechnet und anschließend über diese Matrix als Index nutzt und damit
Do-Schleifen ganz vermeiden? Aber mit welchem Befehl? Die Elemente der
zweidimensionale Liste müßen ja auf die einer eindimensionale Liste
abgebildet werden.

3.) Oder ist hier ein ganz anderer Weg einzuschlagen?

Hier meine sehr cpp-artige Schleife:

c1=500; c2=492;

rad = Table[{i, 0, 0}, {i, 1, 1024}];     (* Tabelle fuer radiale
Intensitaetsabhaengigkeit *)

Do[
         r = Sqrt[(i - c1)^2 + (j - c2)^2]; (* berechnet Dadius zum
Zentrum (c1,c2) *)
         buc = Round[r] + 1;                       (* daraus Index "buc"
wie "bucket" berechnen *)
         rad[[buc, 2]] += 1;                          (* Zaehlt,
wieviele Pixel in diesen Topf fallen *)
    rad[[buc, 3]] += bm[[i, j]],                (* addiert
Pixel-Intensitaet zu diesem Topf *)
{i, 1, Length[bm]}, {j, 1, Length[bm[[1]]]}]; (* Schleife ueber
1024x1024 Pixel *)

Die Schleife braucht auf einem schnelle Rechner ca. eine Minute.

mfg, Uli Schwarz


--
Ulrich T. Schwarz              Tel: (++49) 0941 943 2113
NWF II - Physik                Fax: (++49) 0941 943 2754
Universitaet Regensburg        e-mail: uli.schwarz@XXXXXXX.de
D-93040 Regensburg
url: http://homepages.uni-regensburg.de/~scu04188




Antworten:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html