DMUG-Archiv 2002

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

Re: Do loop beschleunigen

> Die unten angegeben Lösung ist sehr elegant, aber nicht schneller (dauert
> immer noch im Minutenbereich für 1024x1024 Bild), als die ursprüngliche
> Do-Schleife. Folgende Änderung war noch nötig, da "bm" ja eine
> zweidimensionale Matrix ist:
> 
> ...
> Bucket[i_] := Round[Sqrt[(i[[1]] - c1)^2 + (i[[2]] - c2)^2]] + 1
> ...
> MapIndexed[ SetBucket[#1, Bucket[#2]]&, bm, {2}]
> ...
> 
> 
> Aber, wie gesagt, schneller geht es damit nicht.

Ich hab's auch einmal mit MathLink probiert. Das eigentliche Binning
passiert in C natürlich rasant, das Ganze ist dennoch nicht schneller,
da Mma erst einmal alle 1024^2 Werte per TCP ans C-Programm schippern
muß.

Aber: Wenn diese Berechnung mehr als einmal gebraucht wird, kann man
ja die bucket-Werte vorausberechnen, oder? Will sagen:

bm = Array[Random[]&, {1024, 1024}];

BucketArray = If[ FileType["BucketArray"] === File,
    << BucketArray,
  (* else *)
    c1=500; c2=492;
    Array[Round[Sqrt[(#1 - c1)^2 + (#2 - c2)^2]] + 1 &, {1024, 1024}]
]

count[_] = intensity[_] = 0

SetBucket[int_, buck_] := (++count[buck]; intensity[buck] += int)

t = Timing[MapThread[SetBucket, {bm, BucketArray}, 2]][[1]]

result = Array[{#, count[#], intensity[#]}&, 1024]


Gruß,

Thomas


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

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