【发布时间】:2020-02-24 23:00:00
【问题描述】:
如何创建一个 nxn 矩阵,其中单元格 (i, j) 中的值定义为 1/(i+j-1)。
【问题讨论】:
如何创建一个 nxn 矩阵,其中单元格 (i, j) 中的值定义为 1/(i+j-1)。
【问题讨论】:
使用.row 和.col 函数的解决方案。 (适用于 R 3.5.0 或更高版本)
n <- 3L
i <- .row(c(n, n))
i
#> [,1] [,2] [,3]
#> [1,] 1 1 1
#> [2,] 2 2 2
#> [3,] 3 3 3
j <- .col(c(n, n))
j
#> [,1] [,2] [,3]
#> [1,] 1 2 3
#> [2,] 1 2 3
#> [3,] 1 2 3
m <- 1/(i + j - 1)
m
#> [,1] [,2] [,3]
#> [1,] 1.0000000 0.5000000 0.3333333
#> [2,] 0.5000000 0.3333333 0.2500000
#> [3,] 0.3333333 0.2500000 0.2000000
对于早期的 R 版本:
n <- 3L
i <- row(diag(n))
j <- col(diag(n))
m <- 1/(i + j - 1)
【讨论】:
.row 和 .col 在 R 3.6.1 中进入了 base 包
.row 和 .col 的参数 dim 也可能是整数值的“double”。但是感谢这个,不知道这在早期版本中不起作用。我会更新我的答案。
base cran.r-project.org/bin/windows/base/old/3.5.0/NEWS.R-3.5.0.html
这是一个蛮力解决方案:
create_matrix <- function(n){
m <- matrix(NA, n, n)
for (i in 1:n){
for (j in 1:n){
m[i,j] <- 1/(i+j-1)
}
}
m
}
create_matrix(2)
[,1] [,2]
[1,] 1.0 0.5000000
[2,] 0.5 0.3333333
您还可以使用结果矩阵是对称的这一事实(但我认为这不会更快):
create_matrix_sym <- function(n){
m <- matrix(NA, n, n)
for (i in 1:n){
for (j in 1:i){
m[i,j] <- 1/(i+j-1)
}
}
m[upper.tri(m)] <- m[lower.tri(m)]
m
}
【讨论】:
您可以使用outer 创建这样的矩阵,即M <- 1/(outer(1:n,1:n,"+")-1)
【讨论】: