R中函数的向量化
它应该是一个nxn矩阵,其对角线上有2个,第一个上下对角线上有-1个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 <-
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)有打印列类型信息的选项。