# a function to generate random multivariate Gaussians rmultnorm <- function(n, mu, vmat, tol = 1e-07) { p <- ncol(vmat) if(length(mu)!=p) stop(paste("mu vector is the wrong length:",length(mu))) if(max(abs(vmat - t(vmat))) > tol) stop("vmat not symmetric") vs <- svd(vmat) vsqrt <- t(vs$v %*% (t(vs$u) * sqrt(vs$d))) ans <- matrix(rnorm(n * p), nrow = n) %*% vsqrt ans <- sweep(ans, 2, mu, "+") dimnames(ans) <- list(NULL, dimnames(vmat)[[2]]) ans }