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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:36:03