martinibook
Aktives Mitglied
Thread Starter
- Dabei seit
- 20.08.2005
- Beiträge
- 8.730
- Reaktionspunkte
- 350
Hallo,
ich habe ein großes 3D Array, das in jedem Punkt mit einem kleineren Array multipliziert werden soll. Im kleineren Arrays sind überall Nullen und eine Kugel aus Einsen in der Mitte. Letztlich entspricht das einem Volumenintegral in einem Segment des großen Arrays.
Momentan habe ich das in C++ ganz naiv gelöst, mit 6 for schleifen:
Pseudocode:
Das Problem ist nur leider, dass das dann 2150*2150*460 * 137*137*137 = 5.467.596.451.550.000 Iterationen sind. Und ein Datensatz besteht aus 5 solcher Segmente. Mein Programm kam nach einigen Minuten zu dem Ergebnis, dass es ungefähr 6 Jahre dauert, bis es damit fertig ist. Das kann es ja einfach nicht sein.
Bisher wurde das Problem dadurch bewältigt, dass man die Daten einfach um Faktor 5 verkleinert, das ist dann letztlich 5**6 weniger Iterationen, =15625, somit wäre man schon in so zwei Stunden fertig. Das Programm ist momentan in IDL implementiert, einer Arraybasierten Sprache wie Matlab. Und dort hat der ganze Algorithmus, der aus drei Teilen dieser Art besteht, nur eine Stunde gebraucht.
Hat jemand vielleicht eine Idee, wie man das etwas optimieren könnte?
Das Ziel der ganzen Sache ist es im großen Array Kugeln zu finden, als Ergebnis der Faltung erhält man Maxima an den Punkten, wo die Kugelmaske am besten gepasst hat.
Grüße,
martinibook
ich habe ein großes 3D Array, das in jedem Punkt mit einem kleineren Array multipliziert werden soll. Im kleineren Arrays sind überall Nullen und eine Kugel aus Einsen in der Mitte. Letztlich entspricht das einem Volumenintegral in einem Segment des großen Arrays.
Momentan habe ich das in C++ ganz naiv gelöst, mit 6 for schleifen:
Pseudocode:
Code:
for x:
for y:
for z:
summe = 0
for i (von -radius bis +radius):
for j (von -radius bis +radius):
for k (von -radius bis +radius):
if abstand i, j, k zum Mittelpunkt < radius:
summe += 1
resultat[x][y][z] = summe;
Das Problem ist nur leider, dass das dann 2150*2150*460 * 137*137*137 = 5.467.596.451.550.000 Iterationen sind. Und ein Datensatz besteht aus 5 solcher Segmente. Mein Programm kam nach einigen Minuten zu dem Ergebnis, dass es ungefähr 6 Jahre dauert, bis es damit fertig ist. Das kann es ja einfach nicht sein.
Bisher wurde das Problem dadurch bewältigt, dass man die Daten einfach um Faktor 5 verkleinert, das ist dann letztlich 5**6 weniger Iterationen, =15625, somit wäre man schon in so zwei Stunden fertig. Das Programm ist momentan in IDL implementiert, einer Arraybasierten Sprache wie Matlab. Und dort hat der ganze Algorithmus, der aus drei Teilen dieser Art besteht, nur eine Stunde gebraucht.
Hat jemand vielleicht eine Idee, wie man das etwas optimieren könnte?
Das Ziel der ganzen Sache ist es im großen Array Kugeln zu finden, als Ergebnis der Faltung erhält man Maxima an den Punkten, wo die Kugelmaske am besten gepasst hat.
Grüße,
martinibook