0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
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';