"svdfcP" <-
function(data, U, nperm=100, verbose=TRUE, global=TRUE, ...)
{
  # Calculate original svdfc statistic
    t <- abs(svdfc(data=data, U=U, ...))

  # Generate random svdfc statistics
    t.rand <- matrix(nrow=nrow(data), ncol=nperm)
    for(i in 1:nperm) {
      data.rand <- data[,sample(ncol(data))]
      t.rand[,i] <- abs(svdfc(data=data.rand, U=U, ...))
      if(verbose && !(i %% 10)) cat(paste(i, " ", sep=""))
    }
    if(verbose) cat("\n")

  # Compute p-values
    t.pvalues <- rep(NA,nrow(data))
    for(j in 1:nrow(data)) {
      if(global) t.pvalues[j] <- min(1, sum(t.rand >= t[j])/nperm)
      else t.pvalues[j] <- sum(t.rand[j,] >= t[j])/nperm
      if(verbose && !(j %% 100)) cat(paste(j, " ", sep=""))
    }
    if(verbose) cat("\n")

    return(t.pvalues)
}