KhatriRao {Matrix}  R Documentation 
Computes KhatriRao products for any kind of matrices.
The KhatriRao product is a columnwise Kronecker product. Originally introduced by Khatri and Rao (1968), it has many different applications, see Liu and Trenkler (2008) for a survey. Notably, it is used in higherdimensional tensor decompositions, see Bader and Kolda (2008).
KhatriRao(X, Y = X, FUN = "*", make.dimnames = FALSE)
X,Y 
matrices of with the same number of columns. 
FUN 
the (name of the) 
make.dimnames 
logical indicating if the result should inherit

a "CsparseMatrix"
, say R
, the KhatriRao
product of X
(n x k) and Y
(m x k), is of dimension (n*m) x k,
where the jth column, R[,j]
is the kronecker product
kronecker(X[,j], Y[,j])
.
The current implementation is efficient for large sparse matrices.
Original by Michael Cysouw, Univ. Marburg; minor tweaks, bug fixes etc, by Martin Maechler.
Khatri, C. G., and Rao, C. Radhakrishna (1968) Solutions to Some Functional Equations and Their Applications to Characterization of Probability Distributions. Sankhya: Indian J. Statistics, Series A 30, 167–180.
Liu, Shuangzhe, and Gõtz Trenkler (2008) Hadamard, KhatriRao, Kronecker and Other Matrix Products. International J. Information and Systems Sciences 4, 160–177.
Bader, Brett W, and Tamara G Kolda (2008) Efficient MATLAB Computations with Sparse and Factored Tensors. SIAM J. Scientific Computing 30, 205–231.
## Example with very small matrices: m < matrix(1:12,3,4) d < diag(1:4) KhatriRao(m,d) KhatriRao(d,m) dimnames(m) < list(LETTERS[1:3], letters[1:4]) KhatriRao(m,d, make.dimnames=TRUE) KhatriRao(d,m, make.dimnames=TRUE) dimnames(d) < list(NULL, paste0("D", 1:4)) KhatriRao(m,d, make.dimnames=TRUE) KhatriRao(d,m, make.dimnames=TRUE) dimnames(d) < list(paste0("d", 10*1:4), paste0("D", 1:4)) (Kmd < KhatriRao(m,d, make.dimnames=TRUE)) (Kdm < KhatriRao(d,m, make.dimnames=TRUE)) nm < as(m,"nMatrix") nd < as(d,"nMatrix") KhatriRao(nm,nd, make.dimnames=TRUE) KhatriRao(nd,nm, make.dimnames=TRUE) stopifnot(dim(KhatriRao(m,d)) == c(nrow(m)*nrow(d), ncol(d))) ## border cases / checks: zm < nm; zm[] < 0 # all 0 matrix stopifnot(all(K1 < KhatriRao(nd, zm) == 0), identical(dim(K1), c(12L, 4L)), all(K2 < KhatriRao(zm, nd) == 0), identical(dim(K2), c(12L, 4L))) d0 < d; d0[] < 0; m0 < Matrix(d0[1,]) stopifnot(all(K3 < KhatriRao(d0, m) == 0), identical(dim(K3), dim(Kdm)), all(K4 < KhatriRao(m, d0) == 0), identical(dim(K4), dim(Kmd)), all(KhatriRao(d0, d0) == 0), all(KhatriRao(m0, d0) == 0), all(KhatriRao(d0, m0) == 0), all(KhatriRao(m0, m0) == 0), identical(dimnames(KhatriRao(m, d0, make.dimnames=TRUE)), dimnames(Kmd)))