RiemGrassmann (version 0.1.0)

gr.pdist2: Pairwise Distance for Two Sets Data on Grassmann Manifold

Description

For data on grassmann manifold \(x_1,x_2,\ldots,x_M \in Gr(k,n)\) and \(y_1,y_2,\ldots,y_N \in Gr(k,n)\), compute pairwise distances \(d(x_i,y_j)\) via several metrics. The distance type "intrinsic" corresponds to geodesic distance while "extrinsic" is equivalent to "chordal" distance.

Usage

gr.pdist2(
  input1,
  input2,
  type = c("Intrinsic", "Extrinsic", "Asimov", "Binet-Cauchy", "Chordal",
    "Fubini-Study", "Martin", "Procrustes", "Projection", "Spectral"),
  useR = FALSE
)

Arguments

input1

either an array of size \((n\times k\times M)\) or a list of length \(M\) whose elements are \((n\times k)\) orthonormal basis (ONB) on Grassmann manifold.

input2

either an array of size \((n\times k\times N)\) or a list of length \(N\) whose elements are \((n\times k)\) orthonormal basis (ONB) on Grassmann manifold.

type

type of distance measure. Name of each type is Case Insensitive and hyphen can be omitted.

useR

a logical; TRUE to use R computations while FALSE goes everything in C++.

Value

an \((M\times N)\) matrix of pairwise distances.

Examples

Run this code
# NOT RUN {
## generate a dataset with two types of Grassmann elements
#  group1 : first four columns of (8x8) identity matrix + noise
#  group2 : last  four columns of (8x8) identity matrix + noise

mydata1 = list()
mydata2 = list()
sdval   = 0.25
diag8   = diag(8)
for (i in 1:10){
  mydata1[[i]] = qr.Q(qr(diag8[,1:4] + matrix(rnorm(8*4,sd=sdval),ncol=4)))
}
for (i in 1:10){
  mydata2[[i]] = qr.Q(qr(diag8[,5:8] + matrix(rnorm(8*4,sd=sdval),ncol=4)))
}


# }
# NOT RUN {
## compute and visualize distances for all types
#  we will iterate over all measures
alltypes = c("intrinsic","extrinsic","asimov","binetcauchy",
"chordal","fubinistudy","martin","procrustes","projection","spectral")
ntypes   = length(alltypes)

opar <- par(no.readonly=TRUE)
par(mfrow=c(2,5), pty="s")
for (i in 1:ntypes){
  dmat = gr.pdist2(mydata1, mydata2, type=alltypes[i])
  image(dmat, main=alltypes[i])
}
par(opar)
# }
# NOT RUN {
# }

Run the code above in your browser using DataCamp Workspace