【问题标题】:Adding Diagonals of a matrix using R使用 R 添加矩阵的对角线
【发布时间】:2018-03-22 14:55:40
【问题描述】:

我想从中间开始将矩阵的上部对角线相加,直到 (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

【问题讨论】:

  • 你的意思是if (a==b) ???否则我看不出这是如何工作的......
  • 我不知道你想要的结果是什么。是c(1,8,13,12,9,5,1),即非对角元素的总和?

标签: r matrix addition diagonal


【解决方案1】:

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

sum(diag(A))

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

@shegzter 根据您的评论,您可以使用colrow 结合逻辑比较== 得到您想要的数字。

> 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

> 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

如果您的目标是获得以下总和 12+9+5+1,那么您可以使用 upper.trisum 一次性完成所有操作

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

或者没有对角线元素:

> sum(A[upper.tri(A)])
[1] 15

【讨论】:

  • 我希望能够得到 2 + 7+ 3 + 0 = 12(我已经有) 4+ 1+ 4 = 9 3+2 = 5 1
【解决方案2】:

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

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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多