[R-sig-Geo] Moving-window sum in a matrix
Edzer J. Pebesma
e.pebesma at geog.uu.nl
Thu Dec 16 21:17:28 CET 2004
Stephane, have you tried how well this scales to, say, 1000x1000
matrices? Indeed, most basic raster GIS functionality is not available
in R packages, and would be welcome. R code is efficient for small
problems, but for cases like this scales badly as Marius noted.
We are actually working on an interface from R to the functionality of
PCRaster (http://pcraster.geog.uu.nl -- yet another raster GIS), and
expect to have this working within a few months. PCRaster is not open
source, so it is unlikely to become a CRAN package straight away, but
still it may fill a need.
This all depends on availability of sp, the long awaited package with S
classes for spatial point, line, grid, arc/node and polygon data. We're
working very hard on this, and most likely will announce a beta in
January. I expect a PCRasteR package to follow that soon.
--
Edzer
Stephane DRAY wrote:
> Hello,
> I think that you could do it using spdep package. I suppose that, if you:
> - construct a neighborhoord object (nb class). You can define a distance
> based neighborhood (using dnearneigh) as it seems that your definition
> is similar to say i and j neighbors if
> 0<dij<sqrt(cellsize^2+(2*cellsize)^2)
> - then transform the nb to listw with nb2listw with style="B"
> - then use lag.listw to sompute the sum
>
> an example:
> > myvalues=rbinom(100,size=1,prob=0.5)
> > xy=expand.grid(1:10,1:10)
> > dnn1=dnearneigh(as.matrix(xy),0,sqrt(1+4))
> > plot(dnn1,as.matrix(xy))
> > nb2listw(dnn1,style="B")
> > lw1=nb2listw(dnn1,style="B")
> > sum.neigh=lag.listw(lw1,myvalues)
> > sum.neigh
> [1] 3 6 4 5 7 5 4 4 3 3 6 8 6 7 9 8 6 8 6 4 5 9
> 10 11 10 7 8 9 7 5
> [31] 7 10 14 11 10 8 8 9 8 5 8 12 11 10 11 12 10 12 11 7 9 11
> 12 9 13 11 10 12 12 9
> [61] 6 11 12 13 10 12 10 13 9 7 6 9 12 10 12 10 13 12 9 5 6 8
> 8 10 10 11 8 9 7 5
> [91] 4 6 7 6 9 7 6 4 5 3
>
> Roger could confirm that it is correct !
>
>
>
> At 10:05 16/12/2004, Marius Gilbert wrote:
>
>> Dear colleagues,
>>
>> I have a 500 by 500 matrix with presence or absence value in each cell as
>> an input matrix. I am trying to create an output matrix having in each
>> cell the sum of the values from neigbouring cells in the input matrix
>> according to a moving-window defined as:
>>
>> 0 1 1 1 0
>> 1 1 1 1 1
>> 1 1 0 1 1
>> 1 1 1 1 1
>> 0 1 1 1 0
>>
>> where the output cell receiving the values is located in the center. I
>> have written a function that loop over the cells of the output matrix,
>> and
>> sum up the values from these neigbouring cells. It works, but it is
>> fairly
>> slow, and hangs if I try it over a larger matrix. Given that this is a
>> rather basic function available in most raster GIS packages (IDRISI
>> and AV
>> Spatial Analyst) and running fairly quickly, I wondered whether anyone
>> had
>> previously come accross a similar function in an existing R-package.
>>
>> Any helps or pointer would be appreciated,
>>
>> Many thanks in advance,
>>
>> Marius
>>
>> _______________________________________________
>> R-sig-Geo mailing list
>> R-sig-Geo at stat.math.ethz.ch
>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>
>
> Stéphane DRAY
> --------------------------------------------------------------------------------------------------
>
> Département des Sciences Biologiques
> Université de Montréal, C.P. 6128, succursale centre-ville
> Montréal, Québec H3C 3J7, Canada
>
> Tel : (514) 343-6111 poste 1233 Fax : (514) 343-2293
> E-mail : stephane.dray at umontreal.ca
> --------------------------------------------------------------------------------------------------
>
> Web
> http://www.steph280.freesurf.fr/
>
> _______________________________________________
> R-sig-Geo mailing list
> R-sig-Geo at stat.math.ethz.ch
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
More information about the R-sig-Geo
mailing list