Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中函数的向量化_R_Vectorization - Fatal编程技术网

R中函数的向量化

R中函数的向量化,r,vectorization,R,Vectorization,它应该是一个nxn矩阵,其对角线上有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 <-

它应该是一个nxn矩阵,其对角线上有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)
    }

我希望我的函数返回相同的内容,但不包含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那么您的意思是不想使用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没有Onyanbu的那么花哨,但我们可以直接建立索引:

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

不像Onyanbu的那样花哨,但我们可以直接构建索引:

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
而不是单个值起作用吗?现在还不清楚你想要的结果是什么。也许
Vectorize(M)(5:6)
我编辑了我的原始帖子,也许可以帮助解释我想要什么。我不想在函数中使用for循环。顺便说一句,你的
1:n-1
。您是否希望它是
(1:n)-1
(从0开始)还是
1:(n-1)
(从1开始)?它应该是1:(n-1),从1开始,您希望如何准确地将其矢量化?您希望它对向量
n
而不是单个值起作用吗?现在还不清楚你想要的结果是什么。也许
Vectorize(M)(5:6)
我编辑了我的原始帖子,也许可以帮助解释我想要什么。我不想在函数中使用for循环。顺便说一句,你的
1:n-1
。你想让它成为
(1:n)-1
(从0开始)还是
1:(n-1)
(从1开始)?它应该是1:(n-1),从1开始,如果n很大,我确实觉得这会比我的代码快+1.只是好奇。如何在输出的每一行之前添加
#
。我将结果从控制台复制/粘贴到编辑器窗口,然后使用热键对其进行注释。还不算太糟,但我希望能更顺利一些。谢谢。我认为这是stackoverflow@Onyambu,退房
soread()
sodput()
将对象复制到剪贴板,准备粘贴到问题中
soanswer()
将表达式和结果复制到剪贴板,准备粘贴到答案中。@GregorThomas,试试看,告诉我你的想法。我喜欢它将输出捕获到剪贴板,准备粘贴(包括用4个空格填充,等等,以便标记)
soread
现在需要一些更新,因为大玩家(data.table和dplyr)可以选择打印有关列类型的信息。我确实认为,如果n很大,这将比我的代码更快+1.只是好奇。如何在输出的每一行之前添加
#
。我将结果从控制台复制/粘贴到编辑器窗口,然后使用热键对其进行注释。还不算太糟,但我希望能更顺利一些。谢谢。我认为这是stackoverflow@Onyambu,退房
soread()
sodput()
将对象复制到剪贴板,准备粘贴到问题中
soanswer()
将表达式和结果复制到剪贴板,准备粘贴到答案中。@GregorThomas,试试看,告诉我你的想法。我喜欢它将输出捕获到剪贴板,准备粘贴(包括用4个空格填充,等等,以便标记)
soread
现在需要一些更新,因为大玩家(data.table和dplyr)有打印列类型信息的选项。