Several draws from multivariate normal distribution
7 次查看(过去 30 天)
显示 更早的评论
Let
MU=[1 2; 3 4; 5 6]
SIGMA=[2 0; 0 2]
I want to write one or two lines of code to draw R=10 unobservables from Normal((MU(1,:),SIGMA), Normal((MU(2,:),SIGMA), Normal((MU(3,:),SIGMA) without looping and store the results in a matrix 3x(R*2).
0 个评论
采纳的回答
Christopher Berry
2014-8-11
Cris,
Since your sigma matrix is diagonal, there is no need to use a multivariate distribution - your variables are completely independent - so what you are asking for is the same as selecting 10 samples each from 6 independent single variable normal distributions.
If this is truly the case, you can then create 3x20 matrices of mu and sigma and call normrnd like this:
mu = [repmat([1;3;5],[1,10]) repmat([2;4;6],[1,10])];
sigma = 2*ones(3,20);
normrnd(mu,sigma,3,20);
This will give you your 3x20 matrix, but will only work with diagonal co-variance matrices sigma.
0 个评论
更多回答(1 个)
Christopher Berry
2014-8-11
The function you are looking for is mvnrnd. You will still have to call mvrnd one distribution at a time, and hence looping would probably make the most sense, especially for more than 3 distributions.
mu = [1 2;3 4;5 6];
SIGMA = [2 0;0 2];
rng('default'); % For reproducibility
r1 = mvnrnd(mu(1,:),SIGMA,10);
r2 = mvnrnd(mu(2,:),SIGMA,10);
r3 = mvnrnd(mu(3,:),SIGMA,10)
R = [r1(:)';r2(:)';r3(:)']
The final output R will be 3x20 and have var1 values in columns 1:10 and var2 values in 11:20.
2 个评论
John D'Errico
2014-8-11
编辑:John D'Errico
2014-8-11
No, you don't need to call mvnrnd multiple times. Once will suffice. Simply supply a diagonal covariance matrix and a vector of means.
As easily, this is trivial to do using just randn.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!