【问题标题】:Vectorizing a function in R向量化 R 中的函数
【发布时间】:2020-12-21 06:29:37
【问题描述】:

它应该创建一个 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)
    }

它返回例如 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

我希望我的函数返回相同的内容,但没有 for 循环。

【问题讨论】:

  • 您想如何对其进行矢量化?您是否希望它适用于矢量 n 而不是单个值?目前尚不清楚您想要的结果是什么。
  • 或许Vectorize(M)(5:6)
  • 我编辑了我的原始帖子以帮助解释我想要什么。我不想在我的函数中使用 for 循环。
  • 顺便说一句,你的1:n-1。您打算将其设为 (1:n)-1(从 0 开始)还是 1:(n-1)(从 1 开始)?
  • 应该是1:(n-1),从1开始

标签: r vectorization


【解决方案1】:

所以你只是说你不想使用 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
}

【讨论】:

    【解决方案2】:

    不像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 很大,这将比我的代码更快。 +1。只是好奇。您如何设法在输出的每一行之前添加#
    • 呃。我将结果从控制台复制/粘贴到我的编辑器窗口,然后使用热键对其进行评论。还不错,但我希望它更顺畅。
    • 谢谢。以为是stackoverflow提供的功能
    • @Onyambu,查看my "overflow" packagesoread() 从剪贴板中的(大多数)复制粘贴表中创建一个 data.framesodput() 将对象复制到剪贴板,准备粘贴到问题中; soanswer() 将表达式和结果复制到剪贴板,准备粘贴到答案中。
    • @GregorThomas,试试看,让我知道你的想法。我喜欢它将输出捕获到准备粘贴的剪贴板(包括用 4 个空格填充等以用于降价)。 soread 需要一些更新,因为大玩家(data.table 和 dplyr)可以选择打印有关列类型的信息。
    猜你喜欢
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    相关资源
    最近更新 更多