## simulate `N` uniformly distributed points on unit square
N <- 1000
x <- matrix(runif(2 * N), ncol = 2)
## count number of points inside unit circle
n <- 0; for(i in 1:N) {if (norm(x[i,]) < 1) {n <- n + 1} }
n <- n / N
## estimate of pi
4 * n
但我明白了:
&#34;规范中的错误(x [i,]):&#39; A&#39;必须是数字矩阵&#34;
不确定是什么问题。
答案 0 :(得分:2)
norm
会给你错误,因为它要求一个矩阵。但是,x[i, ]
不是矩阵,而是矢量。换句话说,从矩阵中提取单个行/列时,会删除其维度。您可以使用x[i, , drop = FALSE]
来维护矩阵类。
第二个问题是,你想要 L2-norm 。因此,将type = "2"
设置在规范内。总之,使用
norm(x[i, , drop = FALSE], type = "2") < 1
norm
不是唯一的解决方案。您还可以使用以下任一项:
sqrt(c(crossprod(x[i,])))
sqrt(sum(x[i,] ^ 2))
事实上,它们更有效率。它们也支持在下面的矢量化方法中使用rowSums
的想法。
<强>矢量强>
我们可以通过以下方式避免循环:
n <- mean(sqrt(rowSums(x ^ 2)) < 1) ## or simply `mean(rowSums(x ^ 2) < 1)`
sqrt(rowSums(x ^ 2))
为所有行提供L2范数。在与1(半径)比较后,我们得到一个逻辑向量,TRUE
表示&#34;在圈内&#34;。现在,您想要的值n
只是TRUE
的数量。您可以对此逻辑向量求和,然后除以N
,或者简单地对该向量求平均值。