- Line graphは無向グラフのエッジをノードに置き換え、頂点をエッジに置き換えたもの(Wiki)
- ひとまずRでたどって処理を追ってみる
g <- make.graph.adj(5)
set.equal <- function(u,v){
as.logical(prod(xor(u,v)))
}
set.intersec <- function(u,v){
as.logical(sum(u & v))
}
make.set.mat <- function(a){
ns <- 1:max(a)
m <- matrix(FALSE,length(a[,1]),length(ns))
for(i in 1:length(a[,1])){
m[i,a[i,]] <- TRUE
}
return(list(v = ns,m = m))
}
graph.line <- function(m){
up.m <- m
up.m[lower.tri(m)] <- FALSE
relation <- which(up.m==1,arr.ind=TRUE)
set.mat <- make.set.mat(relation)
n.v <- length(set.mat$v)
new.n.v <- length(set.mat$m[,1])
new.m <- matrix(0,new.n.v,new.n.v)
if(new.n.v > 1){
for(i in 1:(new.n.v-1)){
for(j in (i+1):new.n.v){
new.m[i,j] <- set.intersec(set.mat$m[i,],set.mat$m[j,])
}
}
}
new.m
}
line.m <- graph.line(g$m)
par(mfcol=c(1,2))
plot(g$g)
plot(graph.adjacency(line.m,mode="undirected"))
par(mfcol=c(1,1))
- igraphパッケージではline.graph()関数???