#' 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 (!is.null(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)
}

SVD <- function(A) .Call("C_svd", A)
