Stiefel manifold \(St(k,p)\) is the set of \(k\)-frames in \(\mathbf{R}^p\),
which is indeed a Riemannian manifold. For usage in Riemann package,
each data point is represented as a matrix by the convention
$$St(k,p) = \lbrace X \in \mathbf{R}^{p\times k} ~\vert~ X^\top X = I_k \rbrace$$
which means that columns are orthonormal. When the provided matrix is not
an orthonormal basis as above, wrap.stiefel
applies orthogonalization
to extract valid basis information.
Arguments
- input
data matrices to be wrapped as
riemdata
class. Following inputs are considered,- array
a \((p\times k\times n)\) array where each slice along 3rd dimension is a \(k\)-frame.
- list
a length-\(n\) list whose elements are \((p\times k)\) \(k\)-frames.
Value
a named riemdata
S3 object containing
- data
a list of \(k\)-frame orthonormal matrices.
- size
size of each \(k\)-frame basis matrix.
- name
name of the manifold of interests, "stiefel"
Examples
#-------------------------------------------------------------------
# Checker for Two Types of Inputs
#
# Generate 5 observations in St(2,4)
#-------------------------------------------------------------------
# Data Generation by QR Decomposition
d1 = array(0,c(4,2,5))
d2 = list()
for (i in 1:5){
d1[,,i] = qr.Q(qr(matrix(rnorm(4*2),ncol=2)))
d2[[i]] = d1[,,i]
}
# Run
test1 = wrap.stiefel(d1)
test2 = wrap.stiefel(d2)