#' Tensor Mode Crossproduct #' #' C = A_(m) t(A_(m)) #' #' For a matrix `A`, the first mode is `mcrossprod(A, 1)` equivalent to #' `A %*% t(A)` (`tcrossprod`). On the other hand for mode two `mcrossprod(A, 2)` #' the equivalence is `t(A) %*% A` (`crossprod`). #' #' @param A multi-dimensional array #' @param mode index (1-indexed) #' #' @returns matrix of dimensions \code{dim(A)[mode] by dim(A)[mode]}. #' #' @note equivalent to \code{tcrossprod(mat(A, mode))} with around the same #' performance but only allocates the result matrix. #' #' @export mcrossprod <- function(A, mode = length(dim(A))) { storage.mode(A) <- "double" .Call("C_mcrossprod", A, as.integer(mode)) }