GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
genmn.f
Go to the documentation of this file.
1 SUBROUTINE genmn(parm,x,work)
2C**********************************************************************
3C
4C SUBROUTINE GENMN(PARM,X,WORK)
5C GENerate Multivariate Normal random deviate
6C
7C
8C Arguments
9C
10C
11C PARM --> Parameters needed to generate multivariate normal
12C deviates (MEANV and Cholesky decomposition of
13C COVM). Set by a previous call to SETGMN.
14C 1 : 1 - size of deviate, P
15C 2 : P + 1 - mean vector
16C P+2 : P*(P+3)/2 + 1 - upper half of cholesky
17C decomposition of cov matrix
18C REAL PARM(*)
19C
20C X <-- Vector deviate generated.
21C REAL X(P)
22C
23C WORK <--> Scratch array
24C REAL WORK(P)
25C
26C
27C Method
28C
29C
30C 1) Generate P independent standard normal deviates - Ei ~ N(0,1)
31C
32C 2) Using Cholesky decomposition find A s.t. trans(A)*A = COVM
33C
34C 3) trans(A)E + MEANV ~ N(MEANV,COVM)
35C
36C**********************************************************************
37C .. Array Arguments ..
38 REAL parm(*),work(*),x(*)
39C ..
40C .. Local Scalars ..
41 REAL ae
42 INTEGER*4 i,icount,j,p
43C ..
44C .. External Functions ..
45 REAL snorm
46 EXTERNAL snorm
47C ..
48C .. Intrinsic Functions ..
49 INTRINSIC int
50C ..
51C .. Executable Statements ..
52 p = int(parm(1))
53C
54C Generate P independent normal deviates - WORK ~ N(0,1)
55C
56 DO 10,i = 1,p
57 work(i) = snorm()
58 10 CONTINUE
59 DO 30,i = 1,p
60C
61C PARM (P+2 : P*(P+3)/2 + 1) contains A, the Cholesky
62C decomposition of the desired covariance matrix.
63C trans(A)(1,1) = PARM(P+2)
64C trans(A)(2,1) = PARM(P+3)
65C trans(A)(2,2) = PARM(P+2+P)
66C trans(A)(3,1) = PARM(P+4)
67C trans(A)(3,2) = PARM(P+3+P)
68C trans(A)(3,3) = PARM(P+2-1+2P) ...
69C
70C trans(A)*WORK + MEANV ~ N(MEANV,COVM)
71C
72 icount = 0
73 ae = 0.0
74 DO 20,j = 1,i
75 icount = icount + j - 1
76 ae = ae + parm(i+ (j-1)*p-icount+p+1)*work(j)
77 20 CONTINUE
78 x(i) = ae + parm(i+1)
79 30 CONTINUE
80 RETURN
81C
82 END
subroutine genmn(parm, x, work)
Definition genmn.f:2