使用R添加矩阵的对角线

时间:2018-03-22 14:55:40

标签: r matrix addition diagonal

我想从中间开始添加矩阵的上半部分对角线,在列中增加直到(1,n),n是最后一列并保存每个对角线的每个总和。我的代码只添加中间对角线,我如何循环遍历矩阵以获得对角线的总和

A <- matrix(c(2, 4, 3, 1,
             5, 7, 1, 2,
             3, 2, 3, 4, 
             1, 5, 6, 0), # the data elements 
    nrow = 4, # number of rows 
    ncol = 4, # number of columns 
    byrow = TRUE) # fill matrix by rows

sum <- 0
print(A)
for (a in 1){
  for (b in 1:ncol){
    if (a<-b){
      sum = sum + A[a,b]
      print (sum) 
    }
  }
}

这是我的结果

> print(A)
     [,1] [,2] [,3] [,4]
[1,]    2    4    3    1
[2,]    5    7    1    2
[3,]    3    2    3    4
[4,]    1    5    6    0

for (a in 1){
  for (b in 1:ncol){ 
    if (a<-b){
      sum = sum + A[a,b]
      tail(sum, n=1)
    }
  }
}


12

2 个答案:

答案 0 :(得分:1)

您需要diag提取所有主要对角线元素,sum来获取它们的总和

sum(diag(A))

我不确定你要求的是什么,但是如果你也想提取上三角矩阵,你可以使用排除主对角线元素的A[upper.tri(A)],你也可以设置{{ 1}}包含它们diag=TRUE

@shegzter根据您的评论,您可以使用A[upper.tri(A, diag = TRUE)]col结合逻辑比较row来获取您想要的数字。

==

如果你想要它们的总和,那么对这些元素使用> A[row(A)==col(A)] # this gives the same out put as `diag(A)` [1] 2 7 3 0 > A[row(A)+1==col(A)] [1] 4 1 4 > A[row(A)+2==col(A)] [1] 3 2 > A[row(A)+3==col(A)] [1] 1

sum

如果您的目标是获得以下总和12 + 9 + 5 + 1,那么您可以使用> sum(A[row(A)==col(A)]) [1] 12 > sum(A[row(A)+1==col(A)]) [1] 9 > sum(A[row(A)+2==col(A)]) [1] 5 > sum(A[row(A)+3==col(A)]) [1] 1 upper.tri

一次性完成所有操作
sum

或没有对角元素:

> sum(A[upper.tri(A, diag = TRUE)])
[1] 27

答案 1 :(得分:0)

以下内容返回每个对角线的总和:

sapply(split(A, col(A) - row(A)), sum)
# -3 -2 -1  0  1  2  3 
#  1  8 13 12  9  5  1

因此,只获得你可以使用的上层

tail(sapply(split(A, col(A) - row(A)), sum), ncol(A))
#  0  1  2  3 
# 12  9  5  1 

使用tail的缺点是我们还计算较低的对角线和。因此,为了节省A较大的时间,您可能需要使用

sapply(split(A[upper.tri(A, diag = TRUE)], (col(A) - row(A))[upper.tri(A, diag = TRUE)]), sum)
#  0  1  2  3 
# 12  9  5  1