- 昨日の記事でn次元オブジェクトをn-1次元視覚で眺めるために、適当なベクトルを与えて、その超接平面に像を作りたかった
- それをするのに超接平面の接ベクトルと超平面上のn-1個のベクトルとを取り出したい
base.v <- function(v){
d <- length(v)
v <- v/sqrt(sum(v^2))
ret <- matrix(0,d,d)
for(i in 2:(d)){
ret[1:(i-1),i] <- v[1:(i-1)]
ret[i,i] <- -sum(v[1:(i-1)]^2)/v[i]
}
ret[,1] <- v
q <- sqrt(apply(ret^2,2,sum))
t(t(ret)/q)
}
out <- base.v(runif(4))
out %*% t(out)
- 今、d次元であるベクトルがある理由で選ばれて、それをd次元正規直交基底の1つのベクトルとして取ることにする。
- 次に、そのベクトルに垂直なベクトルの中から、ある理由でd次元正規直交基底の第2のベクトルを取ることにする(この部分、ある理由、はひとまずおいておいて、ランダムに作って処理を回すことにする)
- 順次、そんな風にやっていって、d次元正規直交基底を作るには…
serial.ort.base <- function(d){
m <- matrix(0,d,d)
b.list <- list()
for(i in 1:(d-1)){
tmp.v <- rnorm(d+1-i)
tmp.v <- tmp.v/sqrt(sum(tmp.v^2))
tmp.b <- base.v(tmp.v)
if(i == 1){
b.list[[i]] <- tmp.b
}else{
tmp.m <- matrix(0,length(tmp.b[,1]),i-1)
tmp.b2 <- cbind(tmp.m,tmp.b)
b.list[[i]] <- cbind(b.list[[i-1]][,1:(i-1)],(b.list[[i-1]]) %*% t(tmp.b2))
}
}
b.list
}
d <- 4
serial.ort.base(d)