rRotationMatrix {mixAK}R Documentation

Random rotation matrix

Description

Generate a random rotation matrix, i.e., a matrix P=(pi,j)i=1,,p,j=1,,p,\boldsymbol{P} = (p_{i,j})_{i=1,\dots,p, j=1,\dots,p}, which satisfies

a) PP=I\boldsymbol{P}\boldsymbol{P}' = \boldsymbol{I},

b) PP=I\boldsymbol{P}'\boldsymbol{P} = \boldsymbol{I},

c) \mboxdet(P)=1\mbox{det}(\boldsymbol{P}) = 1.

Usage

rRotationMatrix(n, dim)

Arguments

n

number of matrices to generate.

dim

dimension of a generated matrix/matrices.

Details

For dim = 2, p2,1p_{2,1} (sin(θ)\sin(\theta)) is generated from Unif(0, 1) and the rest computed as follows: p1,1=p2,2=1p2,12p_{1,1} = p_{2,2} = \sqrt{1 - p_{2,1}^2} (cos(θ)\cos(\theta)) and p1,2=p2,1p_{1,2} = -p_{2,1} (sin(θ)-\sin(\theta)).

For dim >> 2, the matrix P\boldsymbol{P} is generated in the following steps:

1) Generate a p×pp\times p matrix A\boldsymbol{A} with independent Unif(0, 1) elements and check whether A\boldsymbol{A} is of full rank pp.

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

3) For odd dim, return matrix Q\boldsymbol{Q}. For even dim, return corrected matrix Q\boldsymbol{Q} to satisfy the determinant condition.

Value

For n=1, a matrix is returned.

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

Author(s)

Arnošt Komárek arnost.komarek@mff.cuni.cz

References

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

Examples

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]]))
}

[Package mixAK version 5.7 Index]