如何按行计算矩阵对角线及以内元素与向量的加权累积和(排除零值)
如何计算矩阵每行对角线及以内元素的加权累积和
嘿,我明白你的需求了——你想要跳过矩阵里的上三角零元素,只针对每行对角线及左侧的元素,和向量y对应位置的元素相乘后求和,得到目标向量w。下面给你几种简单高效的实现方式:
方法1:用下三角掩码筛选元素
首先我们可以生成一个和矩阵x同大小的"掩码",只保留对角线及以内的元素,然后逐行计算加权和:
# 先初始化你的数据 x <- c(6,3,2,0,4,8,0,0,5) x <- matrix(x, nrow = 3, ncol = 3) y <- c(0.5,1.2,4.8) # 创建下三角掩码(包含对角线) lower_mask <- lower.tri(x, diag = TRUE) # 逐行计算:筛选出有效元素后和y对应位置相乘,再求和 w <- apply(x * lower_mask, 1, function(row) sum(row * y[1:length(row)]))
运行后就能得到你想要的结果:
> w [1] 3.0 6.3 34.6
方法2:矩阵乘法+行求和(更简洁高效)
其实你的需求本质就是计算下三角矩阵和向量y的行-wise点积,我们可以直接构造下三角矩阵后用rowSums来计算:
# 保留矩阵的下三角部分(含对角线) lower_x <- x * lower.tri(x, diag = TRUE) # 计算每行和y的加权和(y会自动广播成和矩阵同维度) w <- rowSums(lower_x * y)
这个方法比apply更高效,尤其是当矩阵很大的时候。
为什么之前的尝试没成功?
你用的cumsum(y*x)和cumsum(y*t(x))之所以不对,是因为:
cumsum是对整个展开后的向量做累积求和,而不是按行计算特定元素的总和- 虽然矩阵上三角的零元素乘y后还是零,但
cumsum会把这些零也加入累积计算,导致结果完全偏离你的预期
额外提示:如果矩阵不是严格下三角
要是之后你的矩阵上三角出现非零元素,只要你还是只想保留每行对角线及左侧的元素,上面的掩码方法依然管用,lower.tri(diag=TRUE)会精准标记出你需要的位置。
内容的提问来源于stack exchange,提问作者Inna
相关产品推荐
相关产品推荐

