R中对角线之间的矩阵元素之和

时间:2016-06-24 08:20:32

标签: r matrix diagonal

我有system矩阵形式的数据,我想对其进行一些计算(例如n*n),其元素位于对角线之间(不包括对角线)。

例如对于这个矩阵:

sum

[,1] [,2] [,3] [,4] [,5] [1,] 2 0 1 4 3 [2,] 5 3 6 0 4 [3,] 3 5 2 3 1 [4,] 2 1 5 3 2 [5,] 1 4 3 4 1 (对角元素之间)的结果是:

sum

如何有效地实现这一目标?

2 个答案:

答案 0 :(得分:7)

以下是如何获得"顶部切片":

sum(m[lower.tri(m)[nrow(m):1,] & upper.tri(m)])
#[1] 11

将其可视化:

lower.tri(m)[nrow(m):1,] & upper.tri(m)
#      [,1]  [,2]  [,3]  [,4]  [,5]
#[1,] FALSE  TRUE  TRUE  TRUE FALSE
#[2,] FALSE FALSE  TRUE FALSE FALSE
#[3,] FALSE FALSE FALSE FALSE FALSE
#[4,] FALSE FALSE FALSE FALSE FALSE
#[5,] FALSE FALSE FALSE FALSE FALSE

以下是计算所有4个切片的方法:

up <- upper.tri(m)
lo <- lower.tri(m)
n <- nrow(m)

# top
sum(m[lo[n:1,] & up])
# left
sum(m[lo[n:1,] & lo])
# right
sum(m[up[n:1,] & up])
# bottom
sum(m[up[n:1,] & lo])

答案 1 :(得分:1)

sum(sapply(1:dim(m)[[2L]], function(i) sum(m[c(-i,-(dim(m)[[1L]]-i+1)),i])))

这一列逐列,每列取出对角线元素并对其余元素求和。然后总结这些部分结果。

我相信这会很快,因为我们逐列,R中的矩阵逐列存储(即它将是CPU缓存友好的)。我们也不必生成大的索引向量,只需为每列生成两个索引(取出的索引)。

编辑:我更仔细地再次阅读了这个问题。可以更新代码以为sapply中的每个元素生成列表四个值:对于每个区域。这个想法保持不变,对于大型矩阵,如果你逐列,而不是在列之间来回跳转,它会很快。