> 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