00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef GENLIB2_CHOLESKY_INCLUDED
00022 #define GENLIB2_CHOLESKY_INCLUDED
00023
00024 #include "vector.h"
00025 #include "matrix.h"
00026
00027 namespace GenLib2
00028 {
00029
00047 template<class T>
00048 int chol_dec(Matrix<T>& A, Vector<T>& d)
00049 {
00050 int m = A.rows();
00051 int n = A.cols();
00052 if (m != n) return -1;
00053
00054 register int i, j, k;
00055 register T s;
00056
00057 d.newsize(m);
00058 for (i = 0; i < m; i++)
00059 {
00060 s = 0.;
00061 for (k = 0; k < i; k++)
00062 s += A(i,k) * A(i,k);
00063
00064 if ((d(i) = A(i,i) - s) <= 0.)
00065 return (i + 1);
00066
00067 d(i) = sqrt(d(i));
00068
00069 for (j = i + 1; j < m; j++)
00070 {
00071 s = A(i,j);
00072 for (k = 0; k < i; k++)
00073 s -= A(i,k) * A(j,k);
00074
00075 A(j,i) = s / d(i);
00076 }
00077 }
00078
00079 return 0;
00080 }
00081
00082
00094 template<class T>
00095 int chol_sol(const Matrix<T>& A, const Vector<T>& d,
00096 const Vector<T>& b, Vector<T>& x)
00097 {
00098 int m = A.rows();
00099 int n = A.cols();
00100 if (m != n) return -1;
00101 if (d.size() != m) return -2;
00102 if (b.size() != m) return -3;
00103
00104 register int i, k;
00105 register T s;
00106
00107 x.newsize(m);
00108 for (i = 0; i < m; i++)
00109 {
00110 s = b(i);
00111 for (k = i - 1; k >= 0; k--)
00112 s -= A(i,k) * x(k);
00113
00114 x(i) = s / d(i);
00115 }
00116
00117 for (i = m - 1; i > -1; i--)
00118 {
00119 s = x(i);
00120 for (k = m - 1; k > i; k--)
00121 s -= A(k,i) * x(k);
00122
00123 x(i) = s / d(i);
00124 }
00125
00126 return 0;
00127 }
00128
00129
00140 template<class T>
00141 int chol_inv(Matrix<T>& A, const Vector<T>& d)
00142 {
00143 int m = A.rows();
00144 int n = A.cols();
00145 if (m != n) return -1;
00146 if (d.size() != m) return -2;
00147
00148 register int i, j, k;
00149 register T s;
00150
00151 for (i = m - 1; i > -1; i--)
00152 {
00153 s = 1. / d(i);
00154
00155 for (k = i + 1; k < m; k++)
00156 s -= A(k,i) * A(i,k);
00157
00158 A(i,i) = s / d(i);
00159
00160 for (j = i - 1; j > -1; j--)
00161 {
00162 s = 0.;
00163 for (k = j + 1; k < i; k++)
00164 s -= A(k,j) * A(k,i);
00165
00166 for (k = i; k < m; k++)
00167 s -= A(k,j) * A(i,k);
00168
00169 A(j,i) = s / d(j);
00170 }
00171 }
00172
00173 return 0;
00174 }
00175
00176 }
00177
00178 #endif