向量化 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