R语言中如何按条件计算矩阵指定位置的累积和?
R中计算矩阵指定位置前累积和的实现方法
你用到的示例2x2矩阵如下:
你需要的“截至指定矩阵位置、对符合判定规则的元素累加求和”本质是二维前缀和计算,R里不管是基础函数还是第三方包都有很简便的实现方式。注意R原生矩阵索引是1起始,你举例里用的0起始位置[0,1]、[1,0]分别对应R里的[1,2]、[2,1]位置。
方法1:预计算完整前缀和矩阵,查询直接取数
如果需要频繁查询不同位置的累积和,最省事的是提前算好整张前缀和矩阵,之后查任意位置直接取对应值就行,不用重复计算,基础R就能实现:
# 先构造示例矩阵 mat <- matrix(c(1, 2, 3, 4), nrow = 2, ncol = 2) # 打印矩阵核对结构 # [,1] [,2] # [1,] 1 3 # [2,] 2 4 # 计算前缀和矩阵 prefix_mat <- t(apply(mat, 1, cumsum)) for (i in 2:nrow(prefix_mat)) { prefix_mat[i, ] <- prefix_mat[i, ] + prefix_mat[i-1, ncol(prefix_mat)] }
拿你举的例子验证结果:
- 0起始位置
[0,1]对应R索引[1,2],取prefix_mat[1,2]得到结果4,和你算的1+3=4一致 - 0起始位置
[1,0]对应R索引[2,1],取prefix_mat[2,1]得到结果3,和你算的1+2=3一致 - 矩阵右下角位置总和取
prefix_mat[2,2],结果为10,即所有元素求和结果,计算正确。
方法2:单次查询单位置结果,直接切片求和
如果只是偶尔查某一个位置的累积和,不用提前算整张表,直接对目标位置左上角的切片求和就行,逻辑最直白:
# 定义要查询的目标位置(R的1起始索引) target_r <- 2 target_c <- 1 # 直接对目标区域求和,还可以直接加自定义筛选条件 sum(mat[1:target_r, 1:target_c]) # 输出3,和预期一致
如果要加额外的判定规则,比如只累加大于2的元素,直接在求和时加判断就行:
sub_mat <- mat[1:target_r, 1:target_c] sum(sub_mat[sub_mat > 2])
方法3:大矩阵场景用专用包提速
如果是维度很大的矩阵,用matrixStats包的向量化函数算前缀和速度比循环快很多:
# 首次使用先安装 # install.packages("matrixStats") library(matrixStats) # 一行代码算出前缀和矩阵 prefix_mat <- rowCumsums(colCumsums(mat))
计算结果和基础R手写的逻辑完全一致,大矩阵下性能优势很明显。
内容的提问来源于stack exchange,提问作者Onur
相关产品推荐
相关产品推荐

