[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
> >
How about
kronecker(B, A, make.dimnames=TRUE)
Berend
More information about the R-help
mailing list