tensor_predictors/tensorPredictors/R/HOSVD.R

24 lines
737 B
R
Raw Normal View History

#' Higher Order Singular Value Decomposition
#'
#' @param X multi-dimensional array (at least a matrix)
#' @param nu Number of Singula Vector per mode. Defaults to a complete HO-SVD.
#' @param eps tolerance for detecting linear dependence in columns of a matrix.
#' Used for rank deduction and passed to \code{\link{qr}}.
#'
#' @export
HOSVD <- function(X, nu = NULL, eps = 1e-07) {
if (!missing(nu)) {
stopifnot(all(nu <= dim(X)))
}
# Compute per mode singular vectors
Us <- Map(function(i) {
xx <- mcrossprod(X, , i)
La.svd(xx, if (is.null(nu)) qr(xx, tol = eps)$rank else nu[i], 0)$u
}, seq_along(dim(X)))
# Compute Core tensor
C <- mlm(X, Map(t, Us))
list(C = C, Us = Us)
}