一种基于概率值矩阵的随机采样生成真假矩阵的快速方法

use*_*478 3 random r

我有一个 \xc3\x97 n 矩阵,其中值在 [0,1] 之间,并且每列都有相同的值。

\n

这些值表示矩阵的每个元素取值 TRUE 或 FALSE 的概率。

\n

我正在寻找一种快速方法,将概率矩阵转换为基于每个元素的独立随机样本的 TRUE/FALSE 值矩阵。

\n

目前,此代码生成我想要的内容(tf_matrix):

\n
n <- 10\np_true <- runif(n,0,1)\n\np_matrix <- matrix(p_true,n,n, byrow=T)\ntf_matrix <- matrix(F, n,n)\n\nfor(i in 1:nrow(tf_matrix)) {\n    \n    for(j in 1:ncol(tf_matrix)) {\n        \n        tf_matrix[i,j] <- sample(c(T,F), size = 1, prob = c(p_matrix[i,j], 1-p_matrix[i,j]))\n        \n    }\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

然而,这可能非常慢,因为它使用两个 for 循环,并且我需要对一个大矩阵一遍又一遍地执行此操作。

\n

有没有办法提高效率(即尽可能快)?

\n

Gre*_*gor 5

sample(c(T, F), size = 1, prob = x)相当于runif(1) < x. 但是通过runif<我们可以像矢量化一样简单地扩展<

set.seed(42) ## set seed for reproducibility
n <- 5       ## smaller example is easier to see
p_true <- runif(n,0,1)
p_matrix <- matrix(p_true,n,n, byrow=T)
p_matrix
#          [,1]      [,2]      [,3]      [,4]      [,5]
# [1,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455
# [2,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455
# [3,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455
# [4,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455
# [5,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455

tf_matrix = runif(n * n) < p_matrix
tf_matrix
#      [,1] [,2]  [,3]  [,4]  [,5]
# [1,] TRUE TRUE FALSE FALSE  TRUE
# [2,] TRUE TRUE FALSE  TRUE  TRUE
# [3,] TRUE TRUE  TRUE FALSE FALSE
# [4,] TRUE TRUE FALSE FALSE  TRUE
# [5,] TRUE TRUE FALSE  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)