使用 R 添加矩阵的对角线
Adding Diagonals of a matrix using R
我想从中间开始将矩阵的上部对角线相加,在列中递增直到 (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
您需要 diag
来提取所有主对角线元素,并且 sum
来获得它们的总和
sum(diag(A))
我不太清楚你要的是什么,但如果你也想提取上三角矩阵,你可以使用 A[upper.tri(A)]
排除主对角线元素,你也可以设置 diag=TRUE
包括他们 A[upper.tri(A, diag = TRUE)]
@shegzter 根据您的评论,您可以使用 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
:
> 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
如果您的 objective 得到以下总和 12+9+5+1,那么您可以使用 upper.tri
和 sum
一次完成所有操作
> sum(A[upper.tri(A, diag = TRUE)])
[1] 27
或没有对角元素:
> sum(A[upper.tri(A)])
[1] 15
以下returns每条对角线的总和:
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
我想从中间开始将矩阵的上部对角线相加,在列中递增直到 (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
您需要 diag
来提取所有主对角线元素,并且 sum
来获得它们的总和
sum(diag(A))
我不太清楚你要的是什么,但如果你也想提取上三角矩阵,你可以使用 A[upper.tri(A)]
排除主对角线元素,你也可以设置 diag=TRUE
包括他们 A[upper.tri(A, diag = TRUE)]
@shegzter 根据您的评论,您可以使用 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
:
> 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
如果您的 objective 得到以下总和 12+9+5+1,那么您可以使用 upper.tri
和 sum
> sum(A[upper.tri(A, diag = TRUE)])
[1] 27
或没有对角元素:
> sum(A[upper.tri(A)])
[1] 15
以下returns每条对角线的总和:
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