# Calculating radial profiles
Hi Gleb
I thought a bit more about how to speed up calculating the radial profiles. At the moment, you have a triple loop, the outer loops goes through the grid of radius values, the inner two loops through the pixels of the image. We should turn this around, as I show below.
## Specification
Input:
- an image *img* as matrix of size *nx* by *ny*
- a maximum radius *rmax*
- coordinates *cx*, *cy* of the center of the circles
- a kernel function *h(x)* that is nonzero only for `abs(x) < 1`
- a smoothing bandwidth *s*
Output:
- a vector *res*, of length *rmax*, with kernel-smoothed average intensities of the pixels at the distances 1, 2, 3, ..., *rmax* from (*cx*,*cy*).
$$ \text{res}[r] = \frac{\sum\limits_{x=1}^{n_x} \sum\limits_{y=1}^{n_y} h\left(\frac{d_{x,y}-r}{s}\right) \cdot \text{img}[x,y] }{\sum_\limits{x=1}^{n_x} \sum_\limits{y=1}^{n_y} h\left(\frac{d_{x,y}-r}{s}\right) }$$
with $d(x,y)=\sqrt{(x-c_x)^2+(y-c_y)^2}$.
## Algorithm:
First the naive form. We simply swap the loops. For this, we need to calculate numerator and denominator of res[i] separately and divide only at the end.
```
num = Vector of length maxr, initialized with zeroes # numerators
den = Vector of length maxr, initialized with zeroes # denominators
for x from 1 to nx:
for y from 1 to *nx*
d = distance of (x,y) tp (cx,cy)
for r from 1 to maxr
w = h( ( r-d ) / s ) # the kernel weight
num[i] += w * img[x,y]
den[i] += w
end for
end for
end for
res = num/den (elementwise division)
```
Now have a look at the inner loop: For most of the values of *r*, *w* will be zero, and we could skip all those itertaions of the loop.
In fact, we already know before entering the loop that *w* can only be nonzero if
`abs( r - d ) < s`. Therefore, the innermost loop has to run only from `d-s` to `d+s` This reduces run-time by a factor of `rmax/(2*s)`, which may well by around 100.