\HeaderA{tensor.prod.model.matrix}{Utility functions for constructing tensor product smooths}{tensor.prod.model.matrix}
\aliasA{tensor.prod.penalties}{tensor.prod.model.matrix}{tensor.prod.penalties}
\keyword{models}{tensor.prod.model.matrix}
\keyword{smooth}{tensor.prod.model.matrix}
\keyword{regression}{tensor.prod.model.matrix}
\begin{Description}\relax
Produce model matrices or penalty matrices for a tensor product smooth from the model matrices or
penalty matrices for the marginal bases of the smooth.
\end{Description}
\begin{Usage}
\begin{verbatim}
tensor.prod.model.matrix(X)
tensor.prod.penalties(S)
\end{verbatim}
\end{Usage}
\begin{Arguments}
\begin{ldescription}
\item[\code{X}] a list of model matrices for the marginal bases of a smooth
\item[\code{S}] a list of penalties for the marginal bases of a smooth.
\end{ldescription}
\end{Arguments}
\begin{Details}\relax
If \code{X[[1]]}, \code{X[[2]]} ... \code{X[[m]]} are the model matrices of the marginal bases of 
a tensor product smooth then the ith row of the model matrix for the whole tensor product smooth is given by
\code{X[[1]][i,]\%x\%X[[2]][i,]\%x\% ... X[[m]][i,]}, where \code{\%x\%} is the Kronecker product. Of course 
the routine operates column-wise, not row-wise!

If \code{S[[1]]}, \code{S[[2]]} ... \code{S[[m]]} are  the penalty matrices for the marginal bases, and 
\code{I[[1]]}, \code{I[[2]]} ... \code{I[[m]]} are corresponding identity matrices, each of the same 
dimension as its corresponding penalty, then the tensor product smooth has m associate penalties of the form:

\code{S[[1]]\%x\%I[[2]]\%x\% ... I[[m]]}, 

\code{I[[1]]\%x\%S[[2]]\%x\% ... I[[m]]} 

... 

\code{I[[1]]\%x\%I[[2]]\%x\% ... S[[m]]}. 

Of course it's important that the model matrices and penalty matrices are presented in the same order when 
constructing tensor product smooths.
\end{Details}
\begin{Value}
Either a single model matrix for a tensor product smooth, or a list of penalty terms for a tensor
product smooth.
\end{Value}
\begin{Author}\relax
Simon N. Wood \email{simon.wood@r-project.org}
\end{Author}
\begin{References}\relax
\url{http://www.maths.bath.ac.uk/~sw283/}
\end{References}
\begin{SeeAlso}\relax
\code{\LinkA{te}{te}}, \code{\LinkA{smooth.construct.tensor.smooth.spec}{smooth.construct.tensor.smooth.spec}}
\end{SeeAlso}
\begin{Examples}
\begin{ExampleCode}
X <- list(matrix(1:4,2,2),matrix(5:10,2,3))
tensor.prod.model.matrix(X)

S<-list(matrix(c(2,1,1,2),2,2),matrix(c(2,1,0,1,2,1,0,1,2),3,3))
tensor.prod.penalties(S)

\end{ExampleCode}
\end{Examples}

