R语言中按向量尺寸填充非均匀子矩阵的索引问题求助
修正非均匀Roost尺寸的邻接矩阵构建逻辑
问题核心是非均匀尺寸的roost无法通过固定步长索引准确定位子矩阵,解决关键是通过累积求和计算每个roost的起止边界,替代之前的固定步长索引逻辑。
方法一:显式计算起止索引(循环实现,逻辑清晰)
# 定义非均匀栖息群尺寸 roost_sizes <- c(5, 2, 4) total <- sum(roost_sizes) # 初始化全0邻接矩阵 adj_matrix <- matrix(0, nrow = total, ncol = total) # 计算每个栖息群的起始、结束索引 starts <- c(1, cumsum(roost_sizes)[-length(roost_sizes)] + 1) ends <- cumsum(roost_sizes) # 循环填充每个子矩阵为1 for (idx in seq_along(roost_sizes)) { adj_matrix[starts[idx]:ends[idx], starts[idx]:ends[idx]] <- 1 } # 验证结果 print(adj_matrix)
方法二:无循环实现(高效简洁)
利用分块对角矩阵构造函数,无需手动处理索引:
library(Matrix) roost_sizes <- c(5, 2, 4) # 生成每个栖息群对应的全1子矩阵 blocks <- lapply(roost_sizes, function(n) matrix(1, n, n)) # 拼接成分块对角矩阵 adj_matrix <- as.matrix(bdiag(blocks))
逻辑说明
之前的错误通常是假设每个roost尺寸相同,用i * size这类固定步长计算索引,但非均匀尺寸下步长不一致。通过cumsum(roost_sizes)可以精准获取每个roost的结束位置,起始位置则基于前一个roost的结束位置+1,确保每个子矩阵的边界完全匹配实际尺寸。
内容的提问来源于stack exchange,提问作者jrokh
相关产品推荐
相关产品推荐

