如何根据位置索引矩阵生成稀疏矩阵对应的p向量
生成CSC格式稀疏矩阵列指针p的方法
首先明确R的Matrix包中CSC(压缩稀疏列)格式的@p属性规则:
p的长度为稀疏矩阵总列数 + 1p[j]代表第j列(R中列从1开始,p索引也从1开始)的第一个非零元素在@i、@x向量中的下标(0起始)p的最后一个元素等于矩阵总非零元素个数,等于nrow(positions)
手动计算步骤
- 先确定你的稀疏矩阵总列数,你可以根据业务需求指定,也可以直接从
positions中取最大列索引计算:
# 示例中最大列索引为3,所以总列数设为3 n_col <- max(positions[, "col"])
- 统计每一列的非零元素个数,没有非零元素的列计数为0:
# 用factor固定列顺序,避免没有非零元素的列被丢弃 col_nonzero_cnt <- table(factor(positions[, "col"], levels = 1:n_col))
- 对列计数累加后,开头补0就是最终的
p向量:
p <- c(0, cumsum(col_nonzero_cnt))
示例验证
对应你给出的示例数据:
- 列1非零计数为2,列2非零计数为0,列3非零计数为1
col_nonzero_cnt结果为2 0 1- 累加后结果为
2 2 3 - 补0后得到的
p为0 2 2 3,完全符合CSC格式要求
更简单的实现(推荐)
如果你不需要手动拆解属性,直接用Matrix包的sparseMatrix函数即可一键生成符合要求的稀疏矩阵,自动计算@i/@x/@p:
library(Matrix) SMatrix <- sparseMatrix( i = positions[, "row"], j = positions[, "col"], x = rep(1, nrow(positions)) ) # 直接提取p即可 p <- SMatrix@p
内容的提问来源于stack exchange,提问作者Pabort
相关产品推荐
相关产品推荐

