2016-11-26 16 views
1
## 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 

但是我得到:錯誤用`norm`函數估計`利用蒙特卡羅模擬上的單位圓pi`當

「錯誤在範數(X [I,]): 'A'必須是數字矩陣「

不知道什麼是錯的。

回答

2

norm給你錯誤,因爲它要求一個矩陣。但是,x[i, ]不是矩陣,而是一個向量。換句話說,當您從矩陣中提取單個行/列時,其維度將被刪除。您可以使用x[i, , drop = FALSE]來維護矩陣類。

第二個問題是,你想L2規範在這裏。因此在規範內設置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表示「在圓內」。現在,您要的值n只是TRUE的數量。你可以總結這個邏輯向量,然後除以N,或簡單地在這個向量上取平均值。