###----------------- sparse / dense interpSpline() --------------------------- ## This requires recommended package Matrix. if(!requireNamespace("Matrix", quietly = TRUE)) q() require("splines") ## from help(interpSpline) -- ../man/interpSpline.Rd ispl <- interpSpline( women$height, women$weight) isp. <- interpSpline( women$height, women$weight, sparse=TRUE) stopifnot(all.equal(ispl, isp., tol = 1e-12)) # seen 1.65e-14 ##' @title Interpolate size-n version of the 'women' data sparsely and densely ##' @param n size of "women-like" data to interpolate ##' @return list with dense and sparse \code{\link{system.time}()}s ##' @author Martin Maechler ipStime <- function(n) { # and using 'ispl' h <- seq(55, 75, length.out = n) w <- predict(ispl, h)$y c.d <- system.time(is.d <- interpSpline(h, w, sparse=FALSE)) c.s <- system.time(is.s <- interpSpline(h, w, sparse=TRUE )) stopifnot(all.equal(is.d, is.s, tol = 1e-7)) # seen 9.4e-10 (n=1000), 1.3e-7 (n=5000) list(d.time = c.d, s.time = c.s) } n.s <- 25 * round(2^seq(1,6, by=.5)) if(!interactive())# save 'check time' n.s <- n.s[100 <= n.s & n.s <= 800] (ipL <- lapply(setNames(n.s, paste0("n=",n.s)), ipStime)) ## sparse is *an order of magnitude* faster for n ~= 1000 but somewhat slower for n ~< 200: sapply(ipL, function(ip) round(ip$d.time / ip$s.time, 1)[c(1,3)]) ## n=50 n=75 n=100 n=150 n=200 n=275 n=400 n=575 n=800 n=1125 n=1600 -- nb-mm4, i7-5600U ## user.self 0.5 0.5 0.5 0.5 0.7 2.5 4.3 12.3 33.7 70.5 116.1 ## elapsed 0.5 0.3 0.5 0.7 1.0 2.5 4.3 13.0 26.2 57.4 117.3