You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从带索引矩阵生成指定规模的邻接矩阵?

问题背景

我有如下格式的矩阵:

[,1]  [,2]  [,3]  [,4]  [,5]  [,6]
    [1,]     2    12    NA    NA    NA    NA
    [2,]     1     3     7    13    NA    NA
    [3,]     2     4     8    14    NA    NA
    [4,]     3     5     9    15    NA    NA
    ....
    ....
    ....
    [31870] ....                       .....

需要生成一个31870×31870规模的邻接矩阵:新矩阵的第1行仅第2、12列设为1,其余为0;其余行以此类推。理想方案需满足:

  • 高效处理大规模数据
  • 支持每行超过6个邻居的场景
  • 适配不同维度的输入矩阵

过往尝试

我曾尝试以下方法但均未成功:

  • 使用ifelse()函数构建矩阵
  • 遍历空二元矩阵逐个赋值
  • 以"binary matrix"、"design matrix"、"adjacency matrix"为关键词查找方案,尝试将输入矩阵转换为边列表再生成邻接矩阵

最终解决方案

我通过嵌套for循环结合igraph包解决了问题,代码如下:

# 统计矩阵中非NA值的总数
nr_of_entries_adjacencies <- dim(matrix)[1] * dim(matrix)[2]

# 初始化空矩阵用于存储所有邻接关系
init_edge_list <- matrix(data = NaN, nrow = nr_of_entries_adjacencies, ncol = 2) 

# 原问题关注每个节点的邻居数量,这里额外增加一个"邻居"代表节点自身(距离为0的情况)
nr_of_neighbors_plus_one <- 7

for (row_nr in 1:dim(matrix)[1]) {
  print(row_nr)
  for (col_nr in 1:dim(matrix)[2]) {
    if (!is.na(matrix[row_nr,col_nr])) {
      edge_list_row_nr <- ((row_nr-1) * nr_of_neighbors_plus_one) + col_nr
      init_edge_list[edge_list_row_nr ,2] <- init_row_nan_padded[row_nr, col_nr]
      init_edge_list[edge_list_row_nr, 1] <- row_nr
    }
  }
}

# 移除包含NA值的行
edge_list <- na.omit(init_edge_list)

# 转换为图数据框
graph_dataframe <- igraph::graph.data.frame(edge_list)

# 转换为邻接矩阵(稀疏矩阵格式)
adjacency_matrix <- igraph::get.adjacency(graph_dataframe,sparse=TRUE)

内容的提问来源于stack exchange,提问作者BasMts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:00:58