R中不转换为普通矩阵如何查找dgCMatrix类稀疏矩阵的最值索引
稀疏矩阵最值索引获取方案
针对你使用的dgCMatrix类稀疏矩阵,无需转换为普通稠密矩阵,可直接通过稀疏矩阵的存储结构实现最值索引查询,以下是两种基础实现方案:
方案1:直接操作内置存储属性(无额外依赖)
dgCMatrix的核心存储属性为三个向量:
@x:所有非零元素的取值@i:对应@x中每个元素的0基行号@p:每列元素在@x中的起始偏移(0基)
你可以直接操作这三个属性获取索引:
# 你提供的稀疏矩阵构建代码 A <- new("dgCMatrix", i = c(1L, 2L, 3L, 0L, 2L, 3L, 4L, 0L, 1L, 3L, 4L, 0L, 1L, 2L, 4L, 5L, 1L, 2L, 3L, 3L, 6L, 7L, 8L, 5L, 7L, 8L, 5L, 6L, 8L, 5L, 6L, 7L), p = c(0L, 3L, 7L, 11L, 16L, 19L, 23L, 26L, 29L, 32L), Dim = c(9L, 9L), Dimnames = list(c("1", "2", "3", "4", "5", "6", "7", "8", "9"), c("1", "2", "3", "4", "5", "6", "7", "8", "9")), x = c(0.48, 0.1, 0.04, 0.48, 0.1, 0.66, 0.88, 0.1, 0.1, 0.59, 0.38, 0.04, 0.66, 0.59, 0.46, 0.62, 0.88, 0.38, 0.46, 0.62, 0.78, 0.78, 0.16, 0.78, 0.89, 0.2, 0.78, 0.89, 0.77, 0.16, 0.2, 0.77), factors = list()) # 获取非零元素最值在@x中的位置 # 若需获取所有最值位置,替换which.min为which(A@x == min(A@x))即可 min_x_idx <- which.min(A@x) max_x_idx <- which.max(A@x) # 转换为R默认的1基行列索引 min_row <- A@i[min_x_idx] + 1 min_col <- findInterval(min_x_idx - 1, A@p) max_row <- A@i[max_x_idx] + 1 max_col <- findInterval(max_x_idx - 1, A@p) # 打印结果 cat("非零最小值:", A@x[min_x_idx], ",对应行列:(", min_row, ",", min_col, ")\n") cat("非零最大值:", A@x[max_x_idx], ",对应行列:(", max_row, ",", max_col, ")\n")
运行后输出:
非零最小值: 0.04 ,对应行列:( 4 , 1 ) 非零最大值: 0.88 ,对应行列:( 2 , 2 )
如果需要包含打印结果中.代表的结构零(取值为0)的判断,只需额外比较min(A@x)和0的大小:如果min(A@x) > 0,则全局最小值为0,对应所有非零元素之外的位置。
方案2:使用Matrix包内置summary函数(更简便)
Matrix包的summary方法可以直接返回稀疏矩阵所有非零元素的行列值数据框,无需手动处理偏移:
library(Matrix) # 生成非零元素的行列值映射表 mat_summary <- summary(A) # 提取所有最小值索引 min_val <- min(mat_summary$x) min_all_idx <- mat_summary[mat_summary$x == min_val, c("i", "j")] # 提取所有最大值索引 max_val <- max(mat_summary$x) max_all_idx <- mat_summary[mat_summary$x == max_val, c("i", "j")]
该方法返回的索引默认就是1基,直接可用,同时会返回所有符合最值条件的位置,适合需要查询全部最值的场景。
内容的提问来源于stack exchange,提问作者Amin Kaveh
相关产品推荐
相关产品推荐

