blob: feacc54372d14e8f5ca99f319c002a2b073fbd00 [file] [log] [blame]
###----------------- 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