2012-04-24 95 views
2

假設在Matlab中生成一個分佈爲N(u,diag(sigma_1^2,...,sigma_n^2)的n維正態隨機數,其中u是一個垂直向量。在MATLAB中生成具有零協方差的多元正態隨機數

有兩種方式。

randn(n,1).*[sigma_1, ..., sigma_n]' + u; 

mvnrnd(u', diag(sigma_1^2, ..., sigma_n^2))'; 

我認爲他們都是正確的。但我不知道是否有一個比其他基於某些原因,一些偏好?我問這個問題,因爲我看到另一個人總是選擇第一種方式,而我選擇了第二種,卻沒有考慮到它。

感謝和問候!

+1

'mvnrnd'在stats工具箱中,'randn'不是 - 所以你擔心工具箱兼容性,然後使用'randn'。 – Richante 2012-04-24 15:52:59

回答

2

它們是等效的方法。就個人而言,我更喜歡第二種選擇,因爲它是一種可用於生成任意形狀數組的這種數據的函數。如果突然之間你想要一個完整的高斯矩陣,你可以更容易地從第二個函數調用中獲得,而不需要對reshape()進行任何調用。我還認爲第二個例子更容易閱讀,因爲它依賴於內置的Matlab,它已經很長時間無處不在。

我想,如果n很大,可以爭辯說,它實際上形成diag(sigma_1^2, ..., sigma_n^2)是低效的。但是如果你需要從一個很大的矩陣中隨機抽取,那麼Matlab已經是這項工作的錯誤工具,你應該在C++中使用Boost :: Probability,或者在Python中使用SciPy/scikits.statsmodels。

2

如果隨機變量之間存在相關性,則協方差矩陣不再是對角線。在這種情況下,您可以使用mvnrnd或使用帶有Cholesky反編譯的randn,如下所示。

U = chol(SIGMA); 
x = U'*randn(n,1); 

只要有可能,請使用基本功能而不是使用工具箱功能。基本功能更快,更便攜。

+1

「儘可能使用基本功能編寫自己的代碼,而不是使用工具箱功能。」這通常是不好的建議。大多數工具箱功能都經過了適當的測試,有據可查並能正確處理邊緣案例除非你有一個強有力的理由,否則你最好堅持這些實現。 – 2014-10-10 02:41:41

+1

@MichaelKoval我同意這不是一個好的建議!但是,我不會調用'mvnrnd'來生成隨機變量。調用m文件會使MATLAB變得更慢,如果你知道你的代碼,那麼這些函數中的大多數檢查都是不必要的。而且,使用多個工具箱會使得代碼從您的許可證角度來說非常昂貴。一般來說,如果項目規模不大,只有一個人編碼,那麼花哨的功能和強大的編程方法將無法彌補失去的性能。 – Aydin 2014-10-20 12:45:31