[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

*Subject*: Re: Array manipulation*From*: "J.D. Smith" <jdsmith(at)astro.cornell.edu>*Date*: Wed, 01 Nov 2000 12:00:24 -0500*Newsgroups*: comp.lang.idl-pvwave*Organization*: Cornell University*References*: <39ffa4ae.1813674@news.uwa.edu.au>*Sender*: verified_for_usenet(at)cornell.edu (jts11 on vodka.tn.cornell.edu)*Xref*: news.doit.wisc.edu comp.lang.idl-pvwave:21974

Leon Majewski wrote: > > Hello > I was wondering whether any array minded person could suggest a way of using array > indicies to chop up a large array into ordered windows. > I can't think of a way to do it with reform, translate (though i'm sure this is my > limitation not a reform translate limitation) > > --------- > ie given an array of 30*30 elements > return 100 3*3 elements > or 36 5*5 > or... > > in= > > 00 01 02 03 04 05.. > 30 31 32 33 34 35.. > 60 61 62 63 64 65.. > > out = blocks such as > 00 01 02 > 30 31 32 > 60 61 62 > > each block is then processed to one representative number (ie mean or median....) and > returned > If you just want mean or median you should use: mean=smooth(arr,n) med=median(arr,n) where n=3 or 5 or whatever odd box size you want. If you really were only interested in windows centered at [2,2],[5,2], etc., you can trivially extract those elements. Usually the full boxcar is more interesting though. There are other things you can do without resorting to individually extracting "windows" as you call them. For instance: ; the nxn window total total=smooth(arr,n)*n^2 ; the nxn window total not including central pixel neighbors=smooth(arr,n)*n^2-arr ; the mean of the neighboring pixels (excluding central) neighmean=(smooth(arr,n)*n^2-arr)/(n^2-1) ; the square deviation from that mean sqdev=(arr-neighmean)^2 ; the variance of an nxn window of data, excluding central pixel imvar=(smooth(sqdev,n)*n^2-sqdev)/(n^2-2) With repeated applications of smooth you can generate a boxcar of any statistical moment you desire, and I guarantee it will be much faster than your code. See the EDGE_TRUNCATE keyword for dealing with edge issues. Cutoffs can be enforced by zeroing outliers, which will not affect the mean or average, but will affect higher moments. As a bonus exercise, it's quite possible to do full exclude-certain-value (above max, below min, NaN, whatever) boxcar statistics using the same method. Precompute a mask of included elements, and use it judiciously throughout the computations. How can you count good elements in a given window? Simply total the mask as above. Be careful of integer truncation effects: (1+1)/3=0. Overcome this with a floating mask. You'll also have to add an fallback step if you expect boxcar windows with fewer valid elements than the highest moment number you wish to compute (i.e. 0 elements for a mean is pretty obvious). JD -- J.D. Smith | WORK: (607) 255-6263 Cornell Dept. of Astronomy | (607) 255-5842 304 Space Sciences Bldg. | FAX: (607) 255-5875 Ithaca, NY 14853 |

**References**:**Array manipulation***From:*Leon Majewski

- Prev by Date:
**Array manipulation** - Next by Date:
**Re: Array manipulation** - Prev by thread:
**Array manipulation** - Next by thread:
**Re: Array manipulation** - Index(es):