Learn R Programming

mixAK (version 4.2)

rRotationMatrix: Random rotation matrix

Description

Generate a random rotation matrix, i.e., a matrix $ P = (p[i,j]), i=1,\ldots,p, j=1,\ldots,p,$ which satisfies

a) $P * P' = I$,

b) $P' * P = I$,

c) $det(P) = 1$.

Usage

rRotationMatrix(n, dim)

Arguments

n
number of matrices to generate.
dim
dimension of a generated matrix/matrices.

Value

For n=1, a matrix is returned.For n>1, a list of matrices is returned.

Details

For dim = 2, $p[2,1]$ ($sin(theta)$) is generated from Unif(0, 1) and the rest computed as follows: $ p[1,1] = p[2,2] = sqrt(1 - p[2,1]^2)$ ($cos(theta)$) and $p[1,2] = p[2,1]$ ($-sin(theta)$).

For dim $>$ 2, the matrix $P$ is generated in the following steps: 1) Generate a $p x p$ matrix $A$ with independent Unif(0, 1) elements and check whether $A$ is of full rank $p$.

2) Computes a QR decomposition of $A$, i.e., $A = QR$ where $Q$ satisfies $Q * Q' = I$, $Q' * Q = I$, $det(Q) = (-1)^{p+1}$, and columns of $Q$ spans the linear space generated by the columns of $A$.

3) For odd dim, return matrix $Q$. For even dim, return corrected matrix $Q$ to satisfy the determinant condition.

References

Golub, G. H. and Van Loan, C. F. (1996, Sec. 5.1). Matrix Computations. Third Edition. Baltimore: The Johns Hopkins University Press.

Examples

Run this code
P <- rRotationMatrix(n=1, dim=5)
print(P)
round(P %*% t(P), 10)
round(t(P) %*% P, 10)
det(P)

n <- 10
P <- rRotationMatrix(n=n, dim=5)
for (i in 1:3){
  cat(paste("*** i=", i, "\n", sep=""))
  print(P[[i]])
  print(round(P[[i]] %*% t(P[[i]]), 10))
  print(round(t(P[[i]]) %*% P[[i]], 10))
  print(det(P[[i]]))
}

Run the code above in your browser using DataLab