Hi, I am trying to find an elegant way to compute and store some frequently used matrices "on demand". The Matrix package already uses something like this for storing decompositions, but I don't know how to do it. The actual context is the following: A list has information about a basis of a B-spline space (nodes, order) and gridpoints at which the basis functions would be evaluated (not necessarily the nodes). Something like this: bsplinegrid <- list(nodes=1:8,order=4,grid=seq(2,5,by=.2)) I need the design matrix (computed by splineDesign) for various derivatives (not necessarily known in advance), to be calculated by the function bsplinematrix <- function(bsplinegrid, deriv=0) { x <- bsplinegrid$grid Matrix(splineDesign(bslinegrid$knots, x, ord=basis$order, derivs = rep(deriv,length(x)))) } However, I don't want to call splineDesign all the time. A smart way would be storing the calculated matrices in a list inside bsplinegrid. Pseudocode would look like this: bsplinematrix <- function(bsplinegrid, deriv=0) { if (is.null(bsplinegrid$matrices[[deriv+1]])) { ## compute the matrix and put it in the list bsplinegrid$matrices, ## but not of the local copy } bsplinegrid$matrices[[deriv+1]] } My problem is that I don't know how to modify bsplinegrid$matrices outside the function -- assignment inside would only modify the local copy. Any help would be appreciated -- I wanted to learn how Matrix does it, but don't know how to display the source with s3 methods (getAnywhere doesn't work). Tamas
the idea you are considering is also, at times, referred to as memoizing. I would not use a list, but rather an environment, and basically you implement something that first looks to see if there is a value, and if not, compute and store. It can speed things up a lot in some examples (and slow them down a lot in others). Wikipedia amongst other sources: http://en.wikipedia.org/wiki/Memoization Environments have advantages over lists here (if there are lots of matrices the lookup can be faster - make sure you use hash=TRUE), and reference semantics, which you probably want. Tamas K Papp wrote:> Hi, > > I am trying to find an elegant way to compute and store some > frequently used matrices "on demand". The Matrix package already uses > something like this for storing decompositions, but I don't know how > to do it. > > The actual context is the following: > > A list has information about a basis of a B-spline space (nodes, > order) and gridpoints at which the basis functions would be evaluated > (not necessarily the nodes). Something like this: > > bsplinegrid <- list(nodes=1:8,order=4,grid=seq(2,5,by=.2)) > > I need the design matrix (computed by splineDesign) for various > derivatives (not necessarily known in advance), to be calculated by > the function > > bsplinematrix <- function(bsplinegrid, deriv=0) { > x <- bsplinegrid$grid > Matrix(splineDesign(bslinegrid$knots, x, ord=basis$order, > derivs = rep(deriv,length(x)))) > } > > However, I don't want to call splineDesign all the time. A smart way > would be storing the calculated matrices in a list inside bsplinegrid. > Pseudocode would look like this: > > bsplinematrix <- function(bsplinegrid, deriv=0) { > if (is.null(bsplinegrid$matrices[[deriv+1]])) { > ## compute the matrix and put it in the list bsplinegrid$matrices, > ## but not of the local copy > } > bsplinegrid$matrices[[deriv+1]] > } > > My problem is that I don't know how to modify bsplinegrid$matrices > outside the function -- assignment inside would only modify the local > copy. > > Any help would be appreciated -- I wanted to learn how Matrix does it, > but don't know how to display the source with s3 methods (getAnywhere > doesn't work). > > Tamas > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel >-- Robert Gentleman, PhD Program in Computational Biology Division of Public Health Sciences Fred Hutchinson Cancer Research Center 1100 Fairview Ave. N, M2-B876 PO Box 19024 Seattle, Washington 98109-1024 206-667-7700 rgentlem at fhcrc.org
See: http://finzi.psych.upenn.edu/R/Rhelp02a/archive/83547.html On 12/13/06, Tamas K Papp <tpapp at princeton.edu> wrote:> Hi, > > I am trying to find an elegant way to compute and store some > frequently used matrices "on demand". The Matrix package already uses > something like this for storing decompositions, but I don't know how > to do it. > > The actual context is the following: > > A list has information about a basis of a B-spline space (nodes, > order) and gridpoints at which the basis functions would be evaluated > (not necessarily the nodes). Something like this: > > bsplinegrid <- list(nodes=1:8,order=4,grid=seq(2,5,by=.2)) > > I need the design matrix (computed by splineDesign) for various > derivatives (not necessarily known in advance), to be calculated by > the function > > bsplinematrix <- function(bsplinegrid, deriv=0) { > x <- bsplinegrid$grid > Matrix(splineDesign(bslinegrid$knots, x, ord=basis$order, > derivs = rep(deriv,length(x)))) > } > > However, I don't want to call splineDesign all the time. A smart way > would be storing the calculated matrices in a list inside bsplinegrid. > Pseudocode would look like this: > > bsplinematrix <- function(bsplinegrid, deriv=0) { > if (is.null(bsplinegrid$matrices[[deriv+1]])) { > ## compute the matrix and put it in the list bsplinegrid$matrices, > ## but not of the local copy > } > bsplinegrid$matrices[[deriv+1]] > } > > My problem is that I don't know how to modify bsplinegrid$matrices > outside the function -- assignment inside would only modify the local > copy. > > Any help would be appreciated -- I wanted to learn how Matrix does it, > but don't know how to display the source with s3 methods (getAnywhere > doesn't work). > > Tamas > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel >