38 const Int_t nRows =
a.GetNrows();
39 const Int_t rowLwb =
a.GetRowLwb();
49 else offDiag.
Use(nRows,work);
81 for (j = 0; j <
n; j++)
86 for (i =
n-1; i > 0; i--) {
87 const Int_t off_i1 = (i-1)*
n;
94 for (k = 0; k < i; k++)
98 for (j = 0; j < i; j++) {
100 pD[j] = pV[off_i1+j];
108 for (k = 0; k < i; k++) {
119 for (j = 0; j < i; j++)
124 for (j = 0; j < i; j++) {
128 g = pE[j]+pV[off_j+j]*
f;
129 for (k = j+1; k <= i-1; k++) {
131 g += pV[off_k+j]*pD[k];
132 pE[k] += pV[off_k+j]*
f;
137 for (j = 0; j < i; j++) {
142 for (j = 0; j < i; j++)
144 for (j = 0; j < i; j++) {
147 for (k = j; k <= i-1; k++) {
149 pV[off_k+j] -= (
f*pE[k]+
g*pD[k]);
151 pD[j] = pV[off_i1+j];
160 for (i = 0; i <
n-1; i++) {
162 pV[off_n1+i] = pV[off_i+i];
166 for (k = 0; k <= i; k++) {
168 pD[k] = pV[off_k+i+1]/
h;
170 for (j = 0; j <= i; j++) {
172 for (k = 0; k <= i; k++) {
174 g += pV[off_k+i+1]*pV[off_k+j];
176 for (k = 0; k <= i; k++) {
178 pV[off_k+j] -=
g*pD[k];
182 for (k = 0; k <= i; k++) {
187 for (j = 0; j <
n; j++) {
188 pD[j] = pV[off_n1+j];
191 pV[off_n1+
n-1] = 1.0;
210 for (i = 1; i <
n; i++)
217 for (
l = 0;
l <
n;
l++) {
239 Error(
"MakeEigenVectors",
"too many iterations");
251 pD[
l+1] = pE[
l]*(p+
r);
254 for (i =
l+2; i <
n; i++)
267 for (i =
m-1; i >=
l; i--) {
278 pD[i+1] =
h+
s*(
c*
g+
s*pD[i]);
282 for (k = 0; k <
n; k++) {
285 pV[off_k+i+1] =
s*pV[off_k+i]+
c*
h;
286 pV[off_k+i] =
c*pV[off_k+i]-
s*
h;
289 p = -
s*s2*
c3*el1*pE[
l]/dl1;
303 for (i = 0; i <
n-1; i++) {
306 for (j = i+1; j <
n; j++) {
315 for (j = 0; j <
n; j++) {
318 pV[off_j+i] = pV[off_j+k];
330 if (
this != &source) {
void Error(const char *location, const char *msgfmt,...)
static void MakeEigenVectors(TMatrixD &v, TVectorD &d, TVectorD &e)
Symmetric tridiagonal QL algorithm.
static void MakeTridiagonal(TMatrixD &v, TVectorD &d, TVectorD &e)
This is derived from the Algol procedures tred2 by Bowdler, Martin, Reinsch, and Wilkinson,...
TMatrixDSymEigen & operator=(const TMatrixDSymEigen &source)
Assignment operator.
virtual TMatrixTBase< Element > & ResizeTo(Int_t nrows, Int_t ncols, Int_t=-1)
Set size of the matrix to nrows x ncols New dynamic elements are created, the overlapping part of the...
TVectorT< Element > & ResizeTo(Int_t lwb, Int_t upb)
Resize the vector to [lwb:upb] .
TVectorT< Element > & Use(Int_t lwb, Int_t upb, Element *data)
Use the array data to fill the vector lwb..upb].
static constexpr double s
Short_t Max(Short_t a, Short_t b)
Double_t Sqrt(Double_t x)
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Double_t Hypot(Double_t x, Double_t y)