gpt4 book ai didi

r - 向量化 R 代码以从每行中随机选择 2 列

转载 作者:行者123 更新时间:2023-12-04 09:13:26 26 4
gpt4 key购买 nike

有没有人建议我如何矢量化此代码或以其他方式加速它?我正在创建一个可能非常大的矩阵。在每一行中,我想随机选择 2 列,并将它们从 0 翻转到 1。

我不能选择相同的行号和列号,即矩阵的对角线将为零,因此 sample() 中的 (1:N)[-j] >。因为这随着每一行而变化,我看不到使用矢量化来做到这一点的方法,但并行化可能是这里的一个选项?

我使用 library(Matrix) 实现稀疏矩阵功能。

library(Matrix)
N <- 100
m <- Matrix(0, nrow = N, ncol = N)

for(j in 1:N) {
cols <- sample((1:N)[-j], 2) #Choose 2 columns not equal to the
m[j, cols] <- 1
}

有什么想法吗?

最佳答案

library(Matrix)
N <- 7

desired_output <- Matrix(0, nrow = N, ncol = N)
set.seed(1)
for(j in 1:N) {
cols <- sample((1:N)[-j], 2) #Choose 2 columns not equal to the
desired_output[j, cols] <- 1
}

# 7 x 7 sparse Matrix of class "dgCMatrix"
#
# [1,] . . 1 . . . 1
# [2,] . . . . 1 1 .
# [3,] . 1 . . . 1 .
# [4,] . . . . 1 . 1
# [5,] 1 . . 1 . . .
# [6,] 1 1 . . . . .
# [7,] . 1 . . 1 . .

res <- Matrix(0, nrow = N, ncol = N)
set.seed(1)
ind <- cbind(rep(1:N, each = 2), c(sapply(1:N, function(j) sample((1:N)[-j], 2))))
res[ind] <- 1

all.equal(res, desired_output)
# [1] TRUE

快板凳:

microbenchmark::microbenchmark(
OP = {
desired_output <- Matrix(0, nrow = N, ncol = N)
set.seed(1)
for(j in 1:N) {
cols <- sample((1:N)[-j], 2) #Choose 2 columns not equal to the
desired_output[j, cols] <- 1
}
},
Aurele = {
res <- Matrix(0, nrow = N, ncol = N)
set.seed(1)
ind <- cbind(rep(1:N, each = 2), c(sapply(1:N, function(j) sample((1:N)[-j], 2))))
res[ind] <- 1
}
)

# Unit: milliseconds
# expr min lq mean median uq max neval cld
# OP 10.240969 10.509384 11.065336 10.804949 11.044846 14.903377 100 b
# Aurele 1.185001 1.258037 1.392021 1.363503 1.434818 4.553614 100 a

关于r - 向量化 R 代码以从每行中随机选择 2 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45794563/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com