32 lines
640 B
R
32 lines
640 B
R
|
#' Multi Kronecker Multiplication
|
||
|
#'
|
||
|
#' \deqn{C = A (B_1\otimes ...\otimes B_r)}{%
|
||
|
#' C = A (B_1 %x% ... %x% B_r)}
|
||
|
#'
|
||
|
#' @examples
|
||
|
#' n <- 17
|
||
|
#' p <- c(2, 7, 11)
|
||
|
#' q <- c(3, 5, 13)
|
||
|
#'
|
||
|
#' A <- matrix(rnorm(n * prod(p)), n)
|
||
|
#' Bs <- Map(matrix, Map(rnorm, p * q), p)
|
||
|
#'
|
||
|
#' stopifnot(all.equal(
|
||
|
#' A %*% Reduce(`%x%`, Bs),
|
||
|
#' mkm(A, Bs)
|
||
|
#' ))
|
||
|
#'
|
||
|
#' @export
|
||
|
mkm <- function(A, Bs) {
|
||
|
# reshape
|
||
|
dim(A) <- c(nrow(A), rev(mapply(nrow, Bs)))
|
||
|
|
||
|
# perform equiv Multi Linear Multiplication
|
||
|
C <- mlm(A, rev(Bs), seq_along(Bs) + 1, transposed = TRUE)
|
||
|
|
||
|
# reshape back
|
||
|
dim(C) <- c(nrow(C), prod(dim(C)[-1]))
|
||
|
|
||
|
C
|
||
|
}
|