1 /* choldecomp - Cholesky decomposition routines. */
2 /* XLISP-STAT 2.1 Copyright (c) 1990, by Luke Tierney */
3 /* Additions to Xlisp 2.1, Copyright (c) 1989 by David Michael Betz */
4 /* You may give out copies of this software; for conditions see the */
5 /* file COPYING included with this distribution. */
11 /* forward declarations */
12 LOCAL
double Max
P2H(double, double);
14 LOCAL
double Max
P2C(double, a
, double, b
)
16 return(a
> b
? a
: b
);
19 #define Dot(n, x, y) blas_ddot(n, x, 1, y, 1)
21 VOID choldecomp
P4C(double *, a
, int, n
, double, maxoffl
, double *, maxadd
)
23 double minl
, minljj
, minl2
;
27 minl
= pow(macheps(), 0.25) * maxoffl
;
31 for (i
= 0; i
< n
; i
++) {
33 maxoffl
= Max(fabs(a
[ii
]), maxoffl
);
35 maxoffl
= sqrt(maxoffl
);
36 minl2
= sqrt(macheps()) * maxoffl
;
40 for (j
= 0, jn
= 0; j
< n
; j
++, jn
+= n
) {
42 a
[jj
] -= Dot(j
, a
+ jn
, a
+ jn
);
46 for (i
= j
+ 1, in
= (j
+ 1) * n
; i
< n
; i
++, in
+= n
) {
50 a
[ij
] -= Dot(j
, a
+ in
, a
+ jn
);
51 minljj
= Max(fabs(a
[ij
]), minljj
);
54 minljj
= Max(minljj
/ maxoffl
, minl
);
56 if (a
[jj
] > minljj
* minljj
) a
[jj
] = sqrt(a
[jj
]);
58 if (minljj
< minl2
) minljj
= minl2
;
59 *maxadd
= Max(*maxadd
, minljj
* minljj
- a
[jj
]);
63 /**** use BLAS dscal */
64 for (i
= j
+ 1, in
= (j
+ 1) * n
; i
< n
; i
++, in
+= n
) {
70 for (i
= 0, in
= 0; i
< n
; i
++, in
+= n
) {
71 for (j
= i
+ 1; j
< n
; j
++) {