# [R] how to calculate left kronecker product?

Berend Hasselman bhh at xs4all.nl
Sat Feb 23 20:58:11 CET 2013

On 23-02-2013, at 20:46, Michael Friendly <friendly at yorku.ca> wrote:

> For an application, I have formulas defined in terms of a left Kronecker product of matrices,
> A,B, meaning
> A \otimes_L B = {A * B[i,j]}  -- matrix on the left multiplies each element on the right.
>
> The standard kronecker() function is the right Kronecker product,
> A \otimes_R B = {A[i,j] * B}  -- matrix on the right multiplies each element on the left.
>
> The example below shows the result of kronecker() and what I want, but
> kronecker() is now defined in generic S4 methods, and  I can't see
> how to use more basic functions to get the result I want.  Or, alternatively
> how to transform the result of kronecker() to give my wanted.
>
> ---- test code ---
> A <- matrix(1:4, 2,2, dimnames=list(c("a1", "a2"), c("a1","a2")))
> B <- diag(2)
> dimnames(B) <- list(c("b1", "b2"), c("b1","b2"))
> # standard, right kronecker product: each A[i,j] * B
> kronecker(A, B, make.dimnames=TRUE)
>
> # left kronecker product: A * each B[i,j]
> wanted <- rbind(
> cbind(A * B[1,1], A*B[1,2]),
> cbind(A * B[2,1], A*B[2,2]))
> rownames(wanted) <- colnames(wanted) <- paste(rep(c("b1", "b2"), each=2), rownames(wanted), sep=":")
> wanted
>
> ---- R output ----
> > A <- matrix(1:4, 2,2, dimnames=list(c("a1", "a2"), c("a1","a2")))
> > B <- diag(2)
> > dimnames(B) <- list(c("b1", "b2"), c("b1","b2"))
> > # standard, right kronecker product: each A[i,j] * B
> > kronecker(A, B, make.dimnames=TRUE)
>      a1:b1 a1:b2 a2:b1 a2:b2
> a1:b1     1     0     3     0
> a1:b2     0     1     0     3
> a2:b1     2     0     4     0
> a2:b2     0     2     0     4
> >
> > # left kronecker product: A * each B[i,j]
> > wanted <- rbind(
> + cbind(A * B[1,1], A*B[1,2]),
> + cbind(A * B[2,1], A*B[2,2]))
> >
> > rownames(wanted) <- colnames(wanted) <- paste(rep(c("b1", "b2"), each=2), rownames(wanted), sep=":")
> > wanted
>      b1:a1 b1:a2 b2:a1 b2:a2
> b1:a1     1     3     0     0
> b1:a2     2     4     0     0
> b2:a1     0     0     1     3
> b2:a2     0     0     2     4
> >

kronecker(B, A, make.dimnames=TRUE)

Berend