向量化 R 中的函数
Vectorizing a function in R
它应该制作一个 n x n 矩阵,其对角线为 2,第一个上下对角线为 -1。
M <- function(n){
m <- diag(x = 2, ncol = n, nrow = n)
i <- 1
for(i in 1:n-1){
a <- i
b <- i + 1
m[a, b] <- -1
m[b, a] <- -1
i <- i + 1
}
return(m)
}
它 returns 例如 n = 5,一个 5 x 5 矩阵
M(5)
[,1] [,2] [,3] [,4] [,5]
[1,] 2 -1 0 0 0
[2,] -1 2 -1 0 0
[3,] 0 -1 2 -1 0
[4,] 0 0 -1 2 -1
[5,] 0 0 0 -1 2
我希望我的函数 return 相同但没有 for 循环。
所以您的意思只是不想使用 for 循环。在这种情况下,您可以尝试:
M <- function(n){
mat <- diag(2, n)
mat[abs(row(mat) - col(mat)) == 1] <- -1
mat
}
M(5)
[,1] [,2] [,3] [,4] [,5]
[1,] 2 -1 0 0 0
[2,] -1 2 -1 0 0
[3,] 0 -1 2 -1 0
[4,] 0 0 -1 2 -1
[5,] 0 0 0 -1 2
甚至
M <- function(n){
mat <- diag(2, n)
u <- col(mat) == row(mat) + 1
mat[u|t(u)] <- -1
mat
}
不像 Onyambu 的那么花哨,但我们可以直接构建索引:
M = function(n){
m = diag(x = 2, ncol = n, nrow = n)
x = cbind(2:n, 1:(n - 1))
m[rbind(x, x[, 2:1])] = -1
m
}
M(5)
# [,1] [,2] [,3] [,4] [,5]
# [1,] 2 -1 0 0 0
# [2,] -1 2 -1 0 0
# [3,] 0 -1 2 -1 0
# [4,] 0 0 -1 2 -1
# [5,] 0 0 0 -1 2
它应该制作一个 n x n 矩阵,其对角线为 2,第一个上下对角线为 -1。
M <- function(n){
m <- diag(x = 2, ncol = n, nrow = n)
i <- 1
for(i in 1:n-1){
a <- i
b <- i + 1
m[a, b] <- -1
m[b, a] <- -1
i <- i + 1
}
return(m)
}
它 returns 例如 n = 5,一个 5 x 5 矩阵
M(5)
[,1] [,2] [,3] [,4] [,5]
[1,] 2 -1 0 0 0
[2,] -1 2 -1 0 0
[3,] 0 -1 2 -1 0
[4,] 0 0 -1 2 -1
[5,] 0 0 0 -1 2
我希望我的函数 return 相同但没有 for 循环。
所以您的意思只是不想使用 for 循环。在这种情况下,您可以尝试:
M <- function(n){
mat <- diag(2, n)
mat[abs(row(mat) - col(mat)) == 1] <- -1
mat
}
M(5)
[,1] [,2] [,3] [,4] [,5]
[1,] 2 -1 0 0 0
[2,] -1 2 -1 0 0
[3,] 0 -1 2 -1 0
[4,] 0 0 -1 2 -1
[5,] 0 0 0 -1 2
甚至
M <- function(n){
mat <- diag(2, n)
u <- col(mat) == row(mat) + 1
mat[u|t(u)] <- -1
mat
}
不像 Onyambu 的那么花哨,但我们可以直接构建索引:
M = function(n){
m = diag(x = 2, ncol = n, nrow = n)
x = cbind(2:n, 1:(n - 1))
m[rbind(x, x[, 2:1])] = -1
m
}
M(5)
# [,1] [,2] [,3] [,4] [,5]
# [1,] 2 -1 0 0 0
# [2,] -1 2 -1 0 0
# [3,] 0 -1 2 -1 0
# [4,] 0 0 -1 2 -1
# [5,] 0 0 0 -1 2