我有一个矩阵 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) 上的函数。
正如您在问题中提到的,可以使用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)
首先请注意,可以在不显式列出其元素的情况下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)
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |