#' Tensor Times Matrix (n-mode tensor matrix product) #' #' @param T array of order at least \code{mode} #' @param M matrix, the right hand side of the mode product such that #' \code{ncol(M)} equals \code{dim(T)[mode]} if \code{transposed} is false, #' otherwise the dimension matching is \code{nrow(M)} to \code{dim(T)[mode]}. #' @param mode the mode of the product in the range \code{1:length(dim(T))} #' @param transposed boolean to multiply with the transposed of \code{M} #' #' @returns multi-dimensional array of the same order as \code{T} with #' \code{mode} dimension equal to \code{nrow(M)} or \code{ncol(M)} if #' \code{transposed} is true. #' #' @export ttm <- function(T, M, mode = length(dim(T)), transposed = FALSE) { storage.mode(T) <- storage.mode(M) <- "double" dim(M) <- c(NROW(M), NCOL(M)) .Call("C_ttm", T, M, as.integer(mode), as.logical(transposed)) } #' @rdname ttm #' @export `%x_1%` <- function(T, M) ttm(T, M, 1L) #' @rdname ttm #' @export `%x_2%` <- function(T, M) ttm(T, M, 2L) #' @rdname ttm #' @export `%x_3%` <- function(T, M) ttm(T, M, 3L) #' @rdname ttm #' @export `%x_4%` <- function(T, M) ttm(T, M, 4L)