2012-04-24 20 views
2

Matlabで分布N(u、diag(sigma_1^2、...、sigma_n^2))を持つn次元正規乱数を生成すると仮定します。垂直方向のベクトル。matlabで共分散がゼロの多変量正規乱数を生成する

2つの方法があります。

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

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

私はので、この質問を?私は、彼らは両方とも正しいと思います。しかし、私はいくつかの理由に基づいて他の上の1つのいくつかの好みがありますかしら私は別の人がいつも最初の方法を選ぶのを見ましたが、私はまだそれについて考えずに2番目の方法を選択しました。

ありがとうございました!

+1

'mvnrnd'は統計ツールボックスにあり、' randn'はそうではありません - ツールボックスの互換性が心配で、 'randn'を使用してください。 – Richante

答えて

2

これは同等の方法です。個人的には、任意の形状の配列に対してこの種のデータを生成するために使用できる関数の1つで、2番目のオプションを好むでしょう。突然、ガウス値の行列全体が必要な場合は、reshape()を呼び出すことなく、2番目の関数呼び出しから簡単に取得できます。私はまた、2番目の例が読みやすくなっていると考えています。なぜなら、長い時間にわたって普遍的なMatlabの組み込みに依存しているからです。

nが大きい場合、実際にはdiag(sigma_1^2, ..., sigma_n^2)を形成することは非効率的であると考えられます。しかし、Matlabが大きな行列から無作為に描画する必要がある場合は、Matlabはすでに間違ったツールになっているので、C++でBoost :: Probabilityを使うか、PythonのSciPy/scikits.statsmodelsを使うべきです。

2

ランダム変数間に相関がある場合、共分散行列はもはや対角ではありません。このような場合は、mvnrndを使用するか、Cholesky逆コンパイルでrandnを以下のように使用してください。

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

可能な限り、ツールボックス機能を使用する代わりに基本機能を使用してください。基本機能はより速く、移植性があります。

+1

"可能な限り、ツールボックス機能を使用するのではなく、基本機能で独自のコードを記述してください。"これは一般的に悪いアドバイスです。ほとんどのツールボックス機能は適切にテストされ、文書化され、エッジケースを正しく処理します。あなたは、そうしないと強い理由がない限り、これらの実装に固執する方がよいでしょう。 –

+1

@MichaelKoval私はそれが一般的に良いアドバイスではないことを認めます!しかし、私は 'mvnrnd'をランダム変数を生成するために呼び出さないでしょう。 m-ファイルを呼び出すと、MATLABの処理速度が低下します。コードを知っていれば、これらの関数内のほとんどのチェックは不要です。さらに、複数のツールボックスを使用すると、ライセンス・ポイントからコードがかなり高価になります。一般的に、プロジェクトが大きくなく、1人だけがコーディングをしているのであれば、派手な機能と堅牢なプログラミング方法は、失われたパフォーマンスを払うことはありません。 – Aydin

関連する問題