这个问题从这里开始。
我有一个无向图g
和n<100
顶点。该图很简单。所有顶点的坐标都是整数(x_i, y_i), i=1, 2,..., n
,边缘的集合是预定义的,它们是长度1
单位为线段。顶点的程度可以2
,3
或4
。
library(igraph)
g <- graph_from_literal(1-2-3-4-5-6-7-8-1, 8-9-4)
B <- t(matrix(c(0,0, 0,1, 0,2, -1,2, -2,2, -2,1, -2,0, -1,0, -1,1), nrow =2));
V(g)$id <- seq_len(vcount(g))
V(g)$x <- B[,1]; V(g)$y <- B[,2]
plot(g, layout=as.matrix(B))
我需要为顶点设置新corner
属性。
如果顶点的度为且两个入射边不在同一条线上,则称该顶点i
为corner
顶点2
。在上面的顶点上的图1, 3, 5, 7
是角顶点,而其余顶点2, 4, 6, 8, 9
是非角。
我已经找到了度等于的顶点列表2
。
idv <- V(g)[strength(g)==2]; idv # 1 2 3 5 6 7 9
然后i
找到第-个顶点的邻域顶点列表,并创建新的属性:
neigh<-neighborhood(g, nodes=idv); neigh
V(g)$corner <- 0
我的尝试
for(i in idv){
ifelse(V(g)[neigh[[i]][2]]$x == V(g)[neigh[[i]][3]]$x ||
V(g)[neigh[[i]][2]]$y == V(g)[neigh[[i]][3]]$y,
V(g)[neigh[[i]][1]]$corner <- 0,
V(g)[neigh[[i]][1]]$corner <- 1)}
但是我有错误 Error in neigh[[i]] : subscript out of bounds
通常情况下,的长度neigh
小于或等于长度V(g)$id
:
length(neigh) # 7
length(V(g)$id) # 9
而且我无法比较协调员(x_i, y_i)
。
题。如何使用具有不同长度的列表?
在这种特定情况下,一种解决方案将是涉及i
从idv
用的元件neigh
。例如,neigh[[i]][2]
可以改写为neigh[i == idv][[1]][2]]
和我们共
for(i in idv){
ifelse(V(g)[neigh[i == idv][[1]][2]]$x == V(g)[neigh[i == idv][[1]][3]]$x ||
V(g)[neigh[[i]][2]]$y == V(g)[neigh[i == idv][[1]][3]]$y,
V(g)[neigh[i == idv][[1]][1]]$corner <- 0,
V(g)[neigh[i == idv][[1]][1]]$corner <- 1)}
但是,这非常复杂且难以理解。取而代之的是,我们可以利用以下事实:每个idv
邻居都有相同数量的邻居,并且neigh
可以将其转换为矩阵:
neigh <- do.call(rbind, neigh)
然后我们有
V(g)$corner[neigh[, 1]] <- V(g)[neigh[, 2]]$x != V(g)[neigh[, 3]]$x &
V(g)[neigh[, 2]]$y != V(g)[neigh[, 3]]$y
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句