如何使用igraph/tidygraph创建更新节点属性的时间循环并修复报错
报错根源
你遇到的维度不匹配报错来自两个核心错误:
- 矩阵乘法要求
%*%左边是10×10的矩阵时,右边必须是长度为10的列向量,但你写的V(g)$prob[t][v]是单个数值,维度完全不匹配 - 初始化时
V(g)$prob是长度为10的普通向量,每个节点仅存1个值,无法存储多个时间步的计算结果,你用t索引该向量的逻辑完全不成立
修复方案
优先单独用矩阵存储所有时间步的各节点prob值,再对应更新igraph节点属性,逻辑更清晰也更易调试:
- 第一步先创建维度为
节点数×时间步总数+1的矩阵存储所有结果,第一列存初始prob值 - 每次循环先对全节点的t时刻prob向量做矩阵乘法,得到全节点t+1时刻的原始更新值
- 仅对未处于
informed状态的节点赋值更新后的值,已informed的节点保持初始值不变
完整可运行代码
# 加载依赖包 library(igraph) library(tidyverse) library(ggraph) library(ggnetwork) library(tidygraph) # 初始化参数 g <- play_erdos_renyi(10, .2) M <- matrix(0:1, nrow = 10, ncol = 10) Periods <- 10 seeds <- c(1,3) node_num <- length(V(g)) # 初始化节点属性 V(g)$informed <- FALSE V(g)[seeds]$informed <- TRUE V(g)$prob <- 0 V(g)[seeds]$prob <- 0.5 # 创建矩阵存储所有时间步的prob值,行=节点,列=时间步,第1列是初始值 prob_mat <- matrix(NA, nrow = node_num, ncol = Periods + 1) prob_mat[,1] <- V(g)$prob # 时间循环 for (t in 1:Periods) { # 先计算全节点t+1时刻的更新值 next_prob <- as.vector(M %*% prob_mat[,t]) for(v in 1:node_num) { if(!V(g)[v]$informed) { prob_mat[v, t+1] <- next_prob[v] } else { # 已informed节点保持初始值不变 prob_mat[v, t+1] <- prob_mat[v, 1] } } } # 如果需要把最终时间步的prob更新回igraph节点属性 V(g)$final_prob <- prob_mat[, Periods + 1]
内容的提问来源于stack exchange,提问作者AC24
相关产品推荐
相关产品推荐

