0
|
6241 Views
|
|
1 Total Likes
View groups...
Share

# How can I make it faster? (ParallelTable)

Posted 9 years ago
 Hi, Imagine a detector with square pixels, the pixels arranged in a 256 x 256 matrix. Every pixel has an associated intensity value, normalized in such a way that the biggest value is at the center and it is 1.0. A pixel is characterized with a triplet{i,j,value}, where i is the row, j is the column and value is the intensity. Taking the central {128,128} pixel I draw an annuli with an inner radius and outer radius of {6.89148, 11.4858} pixels. Pixel {0,0}is the lower left corner. This annuli will cover some central area of the detector.Then starting at the bottom line of the covered pixels, I look a 3x3 matrix at the leftmost pixel of the mentioned pixel line.Then I look at the center of this 3x3 matrix if it is a maximum intensity or a minimum among the nine in the 3x3 matrix, and if it is, then I collect that value with its pixel coordinates.Then I slide this 3x3 matrix till I get to the last such position where I still have a full 3x3 matrix. If I cannot get a full 3x3 matrix, - let say hit the inner radius somewhere -, then I just slide further. If no more such position is attainable on the given pixel line then I slide up one pixel, look for the leftmost starting position and repeat the above process. I do this till I cover all the pixels under the annuli. Here is the code below that does this. For small annuli it runs relatively fast, but for bigger annuli - {43.6461, 48.2404} - it is not so fast, even on a 4 core MacPro. So I am interested to see which ways can I still speed it up. Oh, and at once I do it with 67 different configurations. Annuli200[[k]] is one such annuli where k goes from 1 to 67. Annuli[[k]] contains a bunch of triplets, the first one for the bottom left pixel and the last one for the upper right pixel in the given annuli. Thanks ahead, János pixelScale = 21.766; (* mas/pixel *) masdelta = 50/pixelScale; mas200 = 200/pixelScale; rr = ParallelTable[Reap[ firsti = First[First[annuli200[[k]] ] ]; (* Bottom pixel line in the annuli *) lasti = First[Last[annuli200[[k]] ] ]; (* Top pixel line in the annuli *) firstj = First[Rest[ First[Select[annuli200[[k]] , #[] == firsti &] ] ] ]; (* The starting column on the bottom pixel line *) delta = 2; While[firsti + delta <= lasti, firstinline = First[Select[annuli200[[k]], #[] == firsti &]]; (* the per moment starting triplet on the per moment pixel line *) firstj = First[Rest[ First[Select[annuli200[[k]] , #[] == firsti &] ] ] ]; (* the per moment column on the per moment pixel line *) lastinline = Last[Select[annuli200[[k]], #[] == firsti &]]; (* the per moment end triplet on the per moment pixel line *) lastj = First[Rest[lastinline]]; (* the last column on the per moment pixel line *) While[firstj <= lastj - delta, dd = Select[annuli200[[k]], firsti <= #[] <= firsti + delta && firstj <= #[] <= firstj + delta &]; If [Length[dd] == 9, If[! MemberQ[Union[Map[dd[[5, 3]] >= #[] &, dd]], False], Sow[Select[dd, #[] == Max[dd[[All, 3]] ] &], maxn]; ]; If[! MemberQ[Union[Map[dd[[5, 3]] <= #[] &, dd]], False], Sow[Select[dd, #[] == Min[dd[[All, 3]] ] &], minn]; ]; ]; firstj++ ]; firsti++; ], {maxn, minn}], {k, 1, Length[annuli200]}];