[Matlab] Generating random numbers with given covariance matrix

[Matlab] Generating random numbers with given covariance matrix

We are given a covariance matrix, and we’d like to generate n vectors, whose coordinates’ covariance matrix is equal to given. We also like each coordinate to have given mean.
Here is a code:

function numbers = randomcov(n, covMatrix, offset)
    x=randn(n,length(covMatrix(1,:)));
    numbers = x*inv(chol(cov(x)))*chol(covMatrix);
    for i=1:length(offset)
        numbers(:,i) = offset(i)+numbers(:,i)-mean(numbers(:,i));
    end
end

Usage:
n – number of vectors to generate
covMatrix – given covariance matrix
offset – vector of means of each coordinate

Example:

>> n = 1000
 
n =
 
        1000
 
>> covMatrix = [1 0.6 0.3; 0.6 4 0.5; 0.3 0.5 9]
 
covMatrix =
 
    1.0000    0.6000    0.3000
    0.6000    4.0000    0.5000
    0.3000    0.5000    9.0000
 
>> offset=  [4, 7, 5]
 
offset =
 
     4     7     5
 
>> res = randomcov(1000, [1 0.6 0.3; 0.6 1 0.5; 0.3 0.5 9], [4, 7, 5]);
>> length(res)
 
ans =
 
        1000
 
>> res(1:10,:)
 
ans =
 
    5.4045    6.7922   13.7702
    3.2959    7.8065    4.1698
    4.4234    7.5814    8.2764
    5.1770    9.1141    7.6232
    3.0880    5.7971    6.7749
    2.8736    6.6350    7.4795
    4.1235    7.1429    4.4354
    4.2488    7.5810    2.4269
    2.7958    7.3045    8.3019
    3.7704    6.5484    7.3827
 
>> cov(res)
 
ans =
 
    1.0000    0.6000    0.3000
    0.6000    1.0000    0.5000
    0.3000    0.5000    9.0000
 
>> mean(res)
 
ans =
 
    4.0000    7.0000    5.0000

Leave a Reply

Your email address will not be published.