Random rotation matrix
Generate a random rotation matrix, i.e., a matrix P = (p[i,j]), i=1,…,p, j=1,…,p, which satisfies
a) P * P' = I,
b) P' * P = I,
c) det(P) = 1.
rRotationMatrix(n, dim)
n |
number of matrices to generate. |
dim |
dimension of a generated matrix/matrices. |
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.
For n
=1, a matrix is returned.
For n
>1, a list of matrices is returned.
Arnošt Komárek arnost.komarek[AT]mff.cuni.cz
Golub, G. H. and Van Loan, C. F. (1996, Sec. 5.1). Matrix Computations. Third Edition. Baltimore: The Johns Hopkins University Press.
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]])) }
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.