Home > . > generalized_cholesky2.m

generalized_cholesky2

PURPOSE ^

/*

SYNOPSIS ^

function AA = generalized_cholesky2(A)

DESCRIPTION ^

 /*
 **  By Jeff Gill, April 2002.
 **
 **  This procedure produces:
 **
 **  y = chol(A+E), where E is a diagonal matrix with each element as small
 **  as possible, and A and E are the same size.  E diagonal values are 
 **  constrained by iteravely updated Gerschgorin bounds.  
 **
 **  REFERENCES:
 **
 **  Jeff Gill and Gary King. 1998. "`Hessian not Invertable.' Help!"
 **  manuscript in progress, Harvard University.
 **
 **  Robert B. Schnabel and Elizabeth Eskow. 1990. "A New Modified Cholesky
 **  Factorization," SIAM Journal of Scientific Statistical Computating,
 **  11, 6: 1136-58.
 **
 **
 **
 **  Stphane Adjemian (2003): translation from Gauss to Matlab.  
 */

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 % /*
0002 % **  By Jeff Gill, April 2002.
0003 % **
0004 % **  This procedure produces:
0005 % **
0006 % **  y = chol(A+E), where E is a diagonal matrix with each element as small
0007 % **  as possible, and A and E are the same size.  E diagonal values are
0008 % **  constrained by iteravely updated Gerschgorin bounds.
0009 % **
0010 % **  REFERENCES:
0011 % **
0012 % **  Jeff Gill and Gary King. 1998. "`Hessian not Invertable.' Help!"
0013 % **  manuscript in progress, Harvard University.
0014 % **
0015 % **  Robert B. Schnabel and Elizabeth Eskow. 1990. "A New Modified Cholesky
0016 % **  Factorization," SIAM Journal of Scientific Statistical Computating,
0017 % **  11, 6: 1136-58.
0018 % **
0019 % **
0020 % **
0021 % **  Stphane Adjemian (2003): translation from Gauss to Matlab.
0022 % */
0023 function AA = generalized_cholesky2(A)
0024 
0025 n = size(A,1);
0026 L = zeros(n,n);
0027 deltaprev = 0;
0028 gamm = max(abs(diag(A))); 
0029 tau = eps^(1/3);
0030 
0031 if  min(eig(A)) > 0;
0032     tau = -1000000;
0033 end;
0034 
0035 norm_A = max(sum(abs(A))');
0036 gamm = max(abs(diag(A))); 
0037 delta = max([eps*norm_A;eps]);
0038 Pprod = eye(n);
0039   
0040 if n > 2; 
0041     for k = 1,n-2;
0042          if min((diag(A(k+1:n,k+1:n))' - A(k,k+1:n).^2/A(k,k))') < tau*gamm ...
0043                 & min(eig(A((k+1):n,(k+1):n))) < 0;
0044             [tmp,dmax] = max(diag(A(k:n,k:n)));
0045             if A(k+dmax-1,k+dmax-1) > A(k,k);
0046                 P = eye(n);
0047                 Ptemp = P(k,:); 
0048                 P(k,:) = P(k+dmax-1,:); 
0049                 P(k+dmax-1,:) = Ptemp;
0050                 A = P*A*P;
0051                 L = P*L*P;
0052                 Pprod = P*Pprod;
0053              end;
0054              g = zeros(n-(k-1),1);
0055              for i=k:n;  
0056                 if i == 1;
0057                     sum1 = 0;
0058                 else;
0059                     sum1 = sum(abs(A(i,k:(i-1)))');
0060                 end;
0061                 if i == n;
0062                     sum2 = 0;
0063                 else;
0064                     sum2 = sum(abs(A((i+1):n,i)));
0065                 end; 
0066                 g(i-k+1) = A(i,i) - sum1 - sum2;
0067              end; 
0068              [tmp,gmax] = max(g);
0069              if gmax ~= k;
0070                 P = eye(n);
0071                 Ptemp  = P(k,:); 
0072                 P(k,:) = P(k+dmax-1,:); 
0073                 P(k+dmax-1,:) = Ptemp;
0074                 A = P*A*P;
0075                 L = P*L*P;
0076                 Pprod = P*Pprod;
0077              end; 
0078              normj = sum(abs(A(k+1:n,k)));
0079              delta = max([0;deltaprev;-A(k,k)+normj;-A(k,k)+tau*gamm]);
0080              if delta > 0;
0081                A(k,k) = A(k,k) + delta;
0082                deltaprev = delta;
0083              end;
0084          end; 
0085          A(k,k) = sqrt(A(k,k));
0086          L(k,k) = A(k,k); 
0087          for i=k+1:n; 
0088             if L(k,k) > eps; 
0089                 A(i,k) = A(i,k)/L(k,k); 
0090             end;
0091             L(i,k) = A(i,k);
0092             A(i,k+1:i) = A(i,k+1:i) - L(i,k)*L(k+1:i,k)';
0093             if A(i,i) < 0; 
0094                 A(i,i) = 0; 
0095             end;
0096          end;
0097     end;
0098 end;
0099 A(n-1,n) = A(n,n-1);
0100 eigvals  = eig(A(n-1:n,n-1:n));
0101 dlist    = [ 0 ; deltaprev ;...
0102         -min(eigvals)+tau*max((inv(1-tau)*max(eigvals)-min(eigvals))|gamm) ]; 
0103 if dlist(1) > dlist(2); 
0104     delta = dlist(1);   
0105 else;
0106     delta = dlist(2);
0107 end;
0108 if delta < dlist(3);
0109     delta = dlist(3);
0110 end;
0111 if delta > 0;
0112     A(n-1,n-1) = A(n-1,n-1) + delta;
0113     A(n,n) = A(n,n) + delta;
0114     deltaprev = delta;
0115 end;
0116 A(n-1,n-1) = sqrt(A(n-1,n-1));
0117 L(n-1,n-1) = A(n-1,n-1);
0118 A(n,n-1) = A(n,n-1)/L(n-1,n-1);
0119 L(n,n-1) = A(n,n-1);
0120 A(n,n) = sqrt(A(n,n) - L(n,(n-1))^2);
0121 L(n,n) = A(n,n);
0122 AA = Pprod'*L'*Pprod';

Generated on Fri 16-Jun-2006 09:09:06 by m2html © 2003