Revision 04bbc417cf2927b827660bc07743429783569aec authored by HwB on 10 February 2013, 00:00:00 UTC, committed by Gabor Csardi on 10 February 2013, 00:00:00 UTC
1 parent 0e3ae6b
procrustes.Rd
\name{procrustes}
\alias{procrustes}
\alias{kabsch}
\title{
Solving the Procrustes Problem
}
\description{
\code{procrustes} solves for two matrices \code{A} and \code{B} the
`Procrustes Problem' of finding an orthogonal matrix \code{Q} such that
\code{A-B*Q} has the minimal Frobenius norm.
\code{kabsch} determines a best rotation of a given vector set into a
second vector set by minimizing the weighted sum of squared deviations.
The order of vectors is assumed fixed.
}
\usage{
procrustes(A, B)
kabsch(A, B, w = NULL)
}
\arguments{
\item{A, B}{two numeric matrices of the same size.}
\item{w}{weights , influence the distance of points}
}
\details{
The function \code{procrustes(A,B)} uses the \code{svd} decomposition
to find an orthogonal matrix \code{Q} such that \code{A-B*Q} has a
minimal Frobenius norm, where this norm for a matrix \code{C} is defined
as \code{sqrt(Trace(t(C)*C))}, or \code{norm(C,'F')} in R.
Solving it with \code{B=I} means finding a nearest orthogonal matrix.
\code{kabsch} solves a similar problem and uses the Procrustes procedure
for its purpose. Given two sets of points, represented as columns of the
matrices \code{A} and \code{B}, it determines an orthogonal matrix
\code{U} and a translation vector \code{R} such that \code{U*A+R-B}
is minimal.
}
\value{
\code{procrustes} returns a list with components \code{P}, which is
\code{B*Q}, then \code{Q}, the orthogonal matrix, and \code{d}, the
Frobenius norm of \code{A-B*Q}.
\code{kabsch} returns a list with \code{U} the orthogonal matrix applied,
\code{R} the translation vector, and \code{d} the least root mean square
between \code{U*A+R} and \code{B}.
}
\note{
The \code{kabsch} function does not take into account scaling of the sets,
but this could easily be integrated.
}
\references{
Golub, G. H., and Ch. F. van Loan (1996). Matrix Computations. 3rd Edition,
The John Hopkins University Press, Baltimore London. [Sect. 12.4, p. 601]
Kabsch, W. (1976). A solution for the best rotation to relate two sets
of vectors. Acta Cryst A, Vol. 32, p. 9223.
}
\seealso{
\code{\link{svd}}
}
\examples{
## Procrustes
U <- rortho(5) # random orthogonal matrix
P <- procrustes(U, eye(5))
## Kabsch
P <- matrix(c(0, 1, 0, 0, 1, 1, 0, 1,
0, 0, 1, 0, 1, 0, 1, 1,
0, 0, 0, 1, 0, 1, 1, 1), nrow = 3, ncol = 8, byrow = TRUE)
R <- c(1, 1, 1)
phi <- pi/4
U <- matrix(c(1, 0, 0,
0, cos(phi), -sin(phi),
0, sin(phi), cos(phi)), nrow = 3, ncol = 3, byrow = TRUE)
Q <- U \%*\% P + R
K <- kabsch(P, Q)
# K$R == R and K$U %*% P + c(K$R) == Q
}
\keyword{ array }
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...