从距离矩阵到邻接矩阵
From a matrix of distances to a matrix of adjacency
我有一个 1024x1024 的距离矩阵,其中包含所有项之间的所有距离。我想从那开始定义一个图表。所以我定义了一个最小生成树并计算了它的邻接矩阵。
我的距离矩阵是 distMat
。
matrix_of_distances <- as.matrix(distMat)
myGraph <- graph.adjacency(matrix_of_distances, weighted=TRUE)
我的图是一个包含所有可能弧线的图(因为所有两个项之间的距离都是有限值)。我需要另一个图表,更稀疏:
mst <- as.undirected(minimum.spanning.tree(myGraph))
从那个稀疏图中我可以计算邻接矩阵:
adjacency <- as_adjacency_matrix(mst, type = c("both", "upper", "lower"), attr = NULL, edges = FALSE, names = TRUE, sparse =igraph_opt("sparsematrices"))
现在我想以不同的方式创建矩阵邻接,传递另一个最小生成树对象。假设我创建了另一个生成树:
spt <- spantree(matrix_of_distances)
如果我这样做:
adjacency <- as_adjacency_matrix(spt, type = c("both", "upper", "lower"), attr = NULL, edges = FALSE, names = TRUE, sparse =igraph_opt("sparsematrices"))
我收到错误:
Error in as_adjacency_matrix(spt, type = c("both", "upper", "lower"),
: Not a graph object
同样,我正在尝试从最小生成树生成邻接矩阵。我该如何解决?
错误来自于您在 class spantree
的对象上使用函数 as_adjacency_matrix
而它期望 igraph
.
由于您使用的是 igraph
,一个简单的解决方案是使用 igraph
的函数 mst
从原始 "distance graph" 计算最小生成树。
下面是spantree
如何计算最小生成树:
require(vegan)
data(dune)
dis <- vegdist(dune)
tr <- spantree(dis)
结果是下面的树(plot(tr, type="t")
)
:
只有使用 igraph
个函数才能得到相同的结果:
library(igraph)
g <- graph.adjacency(as.matrix(dis), weighted=TRUE)
g_mst <- mst(g)
生成的树如下所示 (plot(g_mst, vertex.color=NA, vertex.size=10, edge.arrow.size=0.5)
):
一旦你有了你的 igraph
树,你就已经知道你可以将它转换成一个具有函数 as_adjacency_matrix
:
的邻接矩阵
A <- as_adjacency_matrix(mst)
我有一个 1024x1024 的距离矩阵,其中包含所有项之间的所有距离。我想从那开始定义一个图表。所以我定义了一个最小生成树并计算了它的邻接矩阵。
我的距离矩阵是 distMat
。
matrix_of_distances <- as.matrix(distMat)
myGraph <- graph.adjacency(matrix_of_distances, weighted=TRUE)
我的图是一个包含所有可能弧线的图(因为所有两个项之间的距离都是有限值)。我需要另一个图表,更稀疏:
mst <- as.undirected(minimum.spanning.tree(myGraph))
从那个稀疏图中我可以计算邻接矩阵:
adjacency <- as_adjacency_matrix(mst, type = c("both", "upper", "lower"), attr = NULL, edges = FALSE, names = TRUE, sparse =igraph_opt("sparsematrices"))
现在我想以不同的方式创建矩阵邻接,传递另一个最小生成树对象。假设我创建了另一个生成树:
spt <- spantree(matrix_of_distances)
如果我这样做:
adjacency <- as_adjacency_matrix(spt, type = c("both", "upper", "lower"), attr = NULL, edges = FALSE, names = TRUE, sparse =igraph_opt("sparsematrices"))
我收到错误:
Error in as_adjacency_matrix(spt, type = c("both", "upper", "lower"), : Not a graph object
同样,我正在尝试从最小生成树生成邻接矩阵。我该如何解决?
错误来自于您在 class spantree
的对象上使用函数 as_adjacency_matrix
而它期望 igraph
.
由于您使用的是 igraph
,一个简单的解决方案是使用 igraph
的函数 mst
从原始 "distance graph" 计算最小生成树。
下面是spantree
如何计算最小生成树:
require(vegan)
data(dune)
dis <- vegdist(dune)
tr <- spantree(dis)
结果是下面的树(plot(tr, type="t")
)
只有使用 igraph
个函数才能得到相同的结果:
library(igraph)
g <- graph.adjacency(as.matrix(dis), weighted=TRUE)
g_mst <- mst(g)
生成的树如下所示 (plot(g_mst, vertex.color=NA, vertex.size=10, edge.arrow.size=0.5)
):
一旦你有了你的 igraph
树,你就已经知道你可以将它转换成一个具有函数 as_adjacency_matrix
:
A <- as_adjacency_matrix(mst)