On Mon, 21 Jun 2010, Nikhil Kaza wrote:

While answering a question on R-help, I was monkeying with the code in cell2nb in spdep (5.11) to see if it can be made faster.

Getting rid of the for loop and replacing with lapply and apply only marginally improves the performance

n <- nrow*ncol
  for (i in 1:n) {
      res[[i]] <- sort(mrc2vi(xcell(vi2mrc(i, nrow, ncol),
          nrow, ncol, torus), nrow, ncol))
      rownames[i] <- paste(vi2mrc(i, nrow, ncol), collapse = ":")
  }

However, I do not understand why the loop has to run through 1:n. If the adjacency matrix is symmertic, should we not just make ceil[n/2] comparisons and take advantage of its symmetry? Am I missing something? Not sure if it makes it any faster though.


The reason why cell2nb() was written was originally to provide a way of generating neighbours for grids on a torus, which is hard to do for coordinates of a planar grid. These are typically needed to simulate processes without edge effects, for modest grid sizes. Agreed, neighbours in grids are symmetric, but an "nb" object contains both symmetric links for generality (the "neig" class in ade4 does not), so these would have to be added in afterwards. Typically, dnearneigh() with the step distance as its threshold generates rook neighbours in acceptable time, with the diagonal distance it yields queen neighbours:

library(spdep)
system.time(res <- cell2nb(10, 10))
   user  system elapsed
  0.099   0.000   0.099
system.time({grd <- GridTopology(c(0,0), c(1,1), c(10,10));
+ resd <- dnearneigh(coordinates(grd), 0, 1)})
   user  system elapsed
  0.003   0.000   0.002
all.equal(res, resd, check.attributes=FALSE)
[1] TRUE
system.time(res <- cell2nb(50, 50))   user  system elapsed
  2.404   0.001   2.407
system.time({grd <- GridTopology(c(0,0), c(1,1), c(50,50));
+ resd <- dnearneigh(coordinates(grd), 0, 1)})
   user  system elapsed
  0.267   0.000   0.267
all.equal(res, resd, check.attributes=FALSE)[1] TRUE
system.time(res <- cell2nb(100, 100))   user  system elapsed
  9.817   0.003   9.872
system.time({grd <- GridTopology(c(0,0), c(1,1), c(100,100));
+ resd <- dnearneigh(coordinates(grd), 0, 1)})
   user  system elapsed
  4.125   0.001   4.127
all.equal(res, resd, check.attributes=FALSE)[1] TRUE

It degrades but not as fast, and may be speeded up using rgeos soon (using a spatial index on the points to cherry-pick, rather than brute-force as now).

Roger





Nikhil Kaza
Asst. Professor,
City and Regional Planning
University of North Carolina

nikhil.l...@gmail.com

_______________________________________________
R-sig-Geo mailing list
R-sig-Geo@stat.math.ethz.ch
https://stat.ethz.ch/mailman/listinfo/r-sig-geo

--
Roger Bivand
Economic Geography Section, Department of Economics, Norwegian School of
Economics and Business Administration, Helleveien 30, N-5045 Bergen,
Norway. voice: +47 55 95 93 55; fax +47 55 95 95 43
e-mail: roger.biv...@nhh.no

_______________________________________________
R-sig-Geo mailing list
R-sig-Geo@stat.math.ethz.ch
https://stat.ethz.ch/mailman/listinfo/r-sig-geo

Reply via email to