如何求所有反对角线的和?

Nic*_*ick 7 r matrix

我有一个矩阵 M:

n = 3    
x=c(0.85, 0.1, 0.05)
M <- matrix(NA, n, n); 

for(i in 1:n){
for(j in 1:n){
M[i,j] = x[i] * x[j]
}}

#       [,1]  [,2]   [,3]
# [1,] 0.7225 0.085 0.0425
# [2,] 0.0850 0.010 0.0050
# [3,] 0.0425 0.005 0.0025
Run Code Online (Sandbox Code Playgroud)

我需要找到所有反对角线的总和,包括 M[1,1] 和 M[n, n]。我的尝试是

d <-matrix(c(0, 1, 2, 1, 2, 3, 2, 3, 4), n)
tapply(M, d, sum)

     0      1      2      3      4 
0.7225 0.1700 0.0950 0.0100 0.0025 
Run Code Online (Sandbox Code Playgroud)

结果对我来说是正确的。

问题。如何定义矩阵d的条目?可以作为 col(M) 和 row(M) 上的函数。

Mif*_*iff 5

正如您在问题中提到的,可以使用row(M)和,尽管它们从 1 而不是零开始行/列,所以您需要减去 2 (每个 1)给出:col(M)

tapply(M, row(M) + col(M) - 2, sum)
#     0      1      2      3      4 
#0.7225 0.1700 0.0950 0.0100 0.0025
Run Code Online (Sandbox Code Playgroud)


Rui*_*das 4

首先请注意,可以在不显式列出其元素的情况下outer生成矩阵。d

matrix(c(0, 1, 2, 1, 2, 3, 2, 3, 4), 3)
#>      [,1] [,2] [,3]
#> [1,]    0    1    2
#> [2,]    1    2    3
#> [3,]    2    3    4
outer(0:2, 0:2, `+`)
#>      [,1] [,2] [,3]
#> [1,]    0    1    2
#> [2,]    1    2    3
#> [3,]    2    3    4
Run Code Online (Sandbox Code Playgroud)

由reprex 包于 2022 年 3 月 24 日创建(v2.0.1)

并在函数中使用它。

sumAntiDiag <- function(M){
  nr <- nrow(M)
  nc <- ncol(M)
  d <- outer(seq.int(nr), seq.int(nc), `+`)
  tapply(M, d, sum)
}

n <- 3    
x <- c(0.85, 0.1, 0.05)
M <- matrix(NA, n, n); 

for(i in 1:n){
  for(j in 1:n){
    M[i,j] = x[i] * x[j]
  }}

sumAntiDiag(M)
#>      2      3      4      5      6 
#> 0.7225 0.1700 0.0950 0.0100 0.0025
Run Code Online (Sandbox Code Playgroud)

由reprex 包于 2022 年 3 月 24 日创建(v2.0.1)