2

Matlab で分布 N(u, diag(sigma_1^2, ..., sigma_n^2) の n-dim 正規乱数を生成するとします。ここで、u は垂直ベクトルです。

2 つの方法があります。

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

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

どちらも正しいと思います。しかし、いくつかの理由に基づいて、一方が他方よりも優先されるのだろうか?私がこの質問をするのは、他の人が常に最初の方法を選択し、私はまだ考えずに 2 番目の方法を選択するのを見たからです。

よろしくお願いします!

4

2 に答える 2

2

確率変数間に相関がある場合、共分散行列は対角ではなくなります。このような場合、次のようにコレスキー分解を使用mvnrndまたは使用できます。randn

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

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

于 2013-09-27T11:32:50.433 に答える
2

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

が大きい場合n、実際に を形成するのは非効率的であると主張できると思いdiag(sigma_1^2, ..., sigma_n^2)ます。しかし、そのような大規模な行列からランダムな描画を行う必要がある場合、Matlab はその仕事には不適切なツールであり、C++ では Boost::Probability を使用するか、Python ではおそらく SciPy / scikits.statsmodels を使用する必要があります。

于 2012-04-24T15:08:18.590 に答える