Igraph中两个图对象能否被identical判定为完全相同?
igraph图对象的等价判定说明
直接用R基础的identical()函数判断两个igraph对象是否完全相同,会得到不符合预期的结果,哪怕是用完全相同参数生成的图也会被判定为不一致,你运行的示例就是典型情况:
library(igraph) identical(make_ring(0), make_ring(0)) # 运行返回结果:FALSE
出现这个现象的原因
igraph对象不是普通的R原生数据结构,它内部绑定了指向C层数据结构的内存指针,每次新建图对象时,哪怕图的节点、边、属性、拓扑结构完全一致,都会生成独立的内存地址和内部标识。identical()会严格校验R对象的所有底层细节,只要内存指针、内部缓存字段有差异,就会返回FALSE,并不适合用来判断图的逻辑等价性。
甚至你对同一个图对象做过一些计算操作(比如计算布局、跑社区发现算法)后,对象内部的缓存字段会更新,此时用identical()比较这个图和它自己,都有可能返回FALSE。
正确的判定方法
根据你的判断需求选对应函数即可:
- 需要判断两个图完全等价:拓扑结构完全一致,所有节点属性、边属性、图属性都一一对应相同,用igraph内置的
identical_graphs()函数g1 <- make_ring(0) g2 <- make_ring(0) identical_graphs(g1, g2) # 运行返回结果:TRUE - 只需要判断两个图拓扑同构:不要求属性一致,只要节点连接结构可以一一对应,用
isomorphic()函数即可
内容的提问来源于stack exchange,提问作者clp
相关产品推荐
相关产品推荐

