Blame | Last modification | View Log | Download | RSS feed
###----------------- sparse / dense interpSpline() ---------------------------## This requires recommended package Matrix.if(!requireNamespace("Matrix", quietly = TRUE)) q()require("splines")## from help(interpSpline) -- ../man/interpSpline.Rdispl <- 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 MaechleripStime <- function(n) { # and using 'ispl'h <- seq(55, 75, length.out = n)w <- predict(ispl, h)$yc.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