63 const Int_t nRows =
a.GetNrows();
64 const Int_t nCols =
a.GetNcols();
65 const Int_t rowLwb =
a.GetRowLwb();
66 const Int_t colLwb =
a.GetColLwb();
68 if (nRows != nCols || rowLwb != colLwb)
70 Error(
"TMatrixDEigen(TMatrixD &)",
"matrix should be square");
74 const Int_t rowUpb = rowLwb+nRows-1;
82 else ortho.
Use(nRows,work);
123 for (
m = low+1;
m <= high-1;
m++) {
129 for (i =
m; i <= high; i++) {
138 for (i = high; i >=
m; i--) {
140 pO[i] = pH[off_i+
m-1]/scale;
152 for (j =
m; j <
n; j++) {
154 for (i = high; i >=
m; i--) {
156 f += pO[i]*pH[off_i+j];
159 for (i =
m; i <= high; i++) {
161 pH[off_i+j] -=
f*pO[i];
165 for (i = 0; i <= high; i++) {
168 for (j = high; j >=
m; j--)
169 f += pO[j]*pH[off_i+j];
171 for (j =
m; j <= high; j++)
172 pH[off_i+j] -=
f*pO[j];
175 pH[off_m+
m-1] = scale*
g;
181 for (i = 0; i <
n; i++) {
183 for (j = 0; j <
n; j++)
184 pV[off_i+j] = (i == j ? 1.0 : 0.0);
187 for (
m = high-1;
m >= low+1;
m--) {
189 if (pH[off_m+
m-1] != 0.0) {
190 for (i =
m+1; i <= high; i++) {
192 pO[i] = pH[off_i+
m-1];
194 for (j =
m; j <= high; j++) {
196 for (i =
m; i <= high; i++) {
198 g += pO[i]*pV[off_i+j];
201 g = (
g/pO[
m])/pH[off_m+
m-1];
202 for (i =
m; i <= high; i++) {
204 pV[off_i+j] +=
g*pO[i];
240 const Int_t nn =
v.GetNrows();
243 const Int_t high = nn-1;
257 for (i = 0; i < nn; i++) {
258 const Int_t off_i = i*nn;
259 if ((i < low) || (i > high)) {
272 const Int_t off_n1 = (
n-1)*nn;
278 const Int_t off_l1 = (
l-1)*nn;
292 pH[off_n+
n] = pH[off_n+
n]+exshift;
300 }
else if (
l ==
n-1) {
301 w = pH[off_n+
n-1]*pH[off_n1+
n];
302 p = (pH[off_n1+
n-1]-pH[off_n+
n])/2.0;
305 pH[off_n+
n] = pH[off_n+
n]+exshift;
306 pH[off_n1+
n-1] = pH[off_n1+
n-1]+exshift;
332 for (j =
n-1; j < nn; j++) {
334 pH[off_n1+j] =
q*z+p*pH[off_n+j];
335 pH[off_n+j] =
q*pH[off_n+j]-p*z;
340 for (i = 0; i <=
n; i++) {
341 const Int_t off_i = i*nn;
343 pH[off_i+
n-1] =
q*z+p*pH[off_i+
n];
344 pH[off_i+
n] =
q*pH[off_i+
n]-p*z;
349 for (i = low; i <= high; i++) {
350 const Int_t off_i = i*nn;
352 pV[off_i+
n-1] =
q*z+p*pV[off_i+
n];
353 pV[off_i+
n] =
q*pV[off_i+
n]-p*z;
378 w = pH[off_n+
n-1]*pH[off_n1+
n];
385 for (i = low; i <=
n; i++) {
386 const Int_t off_i = i*nn;
403 s =
x-w/((
y-
x)/2.0+s);
404 for (i = low; i <=
n; i++) {
405 const Int_t off_i = i*nn;
414 Error(
"MakeSchurr",
"too many iterations");
423 const Int_t off_m_1 = (
m-1)*nn;
424 const Int_t off_m1 = (
m+1)*nn;
425 const Int_t off_m2 = (
m+2)*nn;
429 p = (
r*s-w)/pH[off_m1+
m]+pH[off_m+
m+1];
430 q = pH[off_m1+
m+1]-z-
r-s;
445 for (i =
m+2; i <=
n; i++) {
446 const Int_t off_i = i*nn;
454 for (k =
m; k <=
n-1; k++) {
455 const Int_t off_k = k*nn;
456 const Int_t off_k1 = (k+1)*nn;
457 const Int_t off_k2 = (k+2)*nn;
458 const Int_t notlast = (k !=
n-1);
462 r = (notlast ? pH[off_k2+k-1] : 0.0);
478 pH[off_k+k-1] = -s*
x;
480 pH[off_k+k-1] = -pH[off_k+k-1];
490 for (j = k; j < nn; j++) {
491 p = pH[off_k+j]+
q*pH[off_k1+j];
493 p = p+
r*pH[off_k2+j];
494 pH[off_k2+j] = pH[off_k2+j]-p*z;
496 pH[off_k+j] = pH[off_k+j]-p*
x;
497 pH[off_k1+j] = pH[off_k1+j]-p*
y;
503 const Int_t off_i = i*nn;
504 p =
x*pH[off_i+k]+
y*pH[off_i+k+1];
506 p = p+z*pH[off_i+k+2];
507 pH[off_i+k+2] = pH[off_i+k+2]-p*
r;
509 pH[off_i+k] = pH[off_i+k]-p;
510 pH[off_i+k+1] = pH[off_i+k+1]-p*
q;
515 for (i = low; i <= high; i++) {
516 const Int_t off_i = i*nn;
517 p =
x*pV[off_i+k]+
y*pV[off_i+k+1];
519 p = p+z*pV[off_i+k+2];
520 pV[off_i+k+2] = pV[off_i+k+2]-p*
r;
522 pV[off_i+k] = pV[off_i+k]-p;
523 pV[off_i+k+1] = pV[off_i+k+1]-p*
q;
535 for (
n = nn-1;
n >= 0;
n--) {
545 for (i =
n-1; i >= 0; i--) {
546 const Int_t off_i = i*nn;
547 const Int_t off_i1 = (i+1)*nn;
550 for (j =
l; j <=
n; j++) {
551 const Int_t off_j = j*nn;
552 r =
r+pH[off_i+j]*pH[off_j+
n];
563 pH[off_i+
n] = -
r/(eps*norm);
570 q = (pD[i]-p)*(pD[i]-p)+pE[i]*pE[i];
574 pH[i+1+
n] = (-
r-w*t)/
x;
576 pH[i+1+
n] = (-s-
y*t)/z;
583 for (j = i; j <=
n; j++) {
584 const Int_t off_j = j*nn;
585 pH[off_j+
n] = pH[off_j+
n]/t;
595 const Int_t off_n1 = (
n-1)*nn;
600 pH[off_n1+
n-1] =
q/pH[off_n+
n-1];
601 pH[off_n1+
n] = -(pH[off_n+
n]-p)/pH[off_n+
n-1];
603 cdiv(0.0,-pH[off_n1+
n],pH[off_n1+
n-1]-p,
q);
609 for (i =
n-2; i >= 0; i--) {
610 const Int_t off_i = i*nn;
611 const Int_t off_i1 = (i+1)*nn;
614 for (j =
l; j <=
n; j++) {
615 const Int_t off_j = j*nn;
616 ra += pH[off_i+j]*pH[off_j+
n-1];
617 sa += pH[off_i+j]*pH[off_j+
n];
637 Double_t vr = (pD[i]-p)*(pD[i]-p)+pE[i]*pE[i]-
q*
q;
639 if ((vr == 0.0) && (vi == 0.0)) {
647 pH[off_i1+
n-1] = (-ra-w*pH[off_i+
n-1]+
q*pH[off_i+
n])/
x;
648 pH[off_i1+
n] = (-sa-w*pH[off_i+
n]-
q*pH[off_i+
n-1])/
x;
650 cdiv(-
r-
y*pH[off_i+
n-1],-s-
y*pH[off_i+
n],z,
q);
660 for (j = i; j <=
n; j++) {
661 const Int_t off_j = j*nn;
662 pH[off_j+
n-1] = pH[off_j+
n-1]/t;
663 pH[off_j+
n] = pH[off_j+
n]/t;
673 for (i = 0; i < nn; i++) {
674 if (i < low || i > high) {
675 const Int_t off_i = i*nn;
676 for (j = i; j < nn; j++)
677 pV[off_i+j] = pH[off_i+j];
683 for (j = nn-1; j >= low; j--) {
684 for (i = low; i <= high; i++) {
685 const Int_t off_i = i*nn;
688 const Int_t off_k = k*nn;
689 z = z+pV[off_i+k]*pH[off_k+j];
711 Double_t eps = std::numeric_limits<Double_t>::epsilon();
713 for (
Int_t i = 0; i <
n-1; i++) {
715 Double_t norm = pD[i]*pD[i]+pE[i]*pE[i];
717 for (j = i+1; j <
n; j++) {
718 const Double_t norm_new = pD[j]*pD[j]+pE[j]*pE[j];
719 if (norm_new > norm) {
723 if (std::fabs(norm_new - norm) <= eps * norm_new) {
724 if ((std::fabs(pD[i] - pD[j]) <= eps) && (std::fabs(pE[i] + pE[j]) <= eps)) {
740 for (j = 0; j <
n; j++) {
743 pV[off_j+i] = pV[off_j+k];
755 if (
this != &source) {
809 const Int_t rowUpb = rowLwb+nrows-1;
811 TMatrixD mD(rowLwb,rowUpb,rowLwb,rowUpb);
817 for (
Int_t i = 0; i < nrows; i++) {
818 const Int_t off_i = i*nrows;
819 for (
Int_t j = 0; j < nrows; j++)
823 pD[off_i+i+1] = pe[i];
824 }
else if (pe[i] < 0) {
825 pD[off_i+i-1] = pe[i];
int Int_t
Signed integer 4 bytes (int).
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int).
double Double_t
Double 8 bytes.
Error("WriteTObject","The current directory (%s) is not associated with a file. The object (%s) has not been written.", GetName(), objname)
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
static void cdiv(Double_t xr, Double_t xi, Double_t yr, Double_t yi)
static Double_t gCdivr
Complex scalar division.
TMatrixT< Double_t > TMatrixD
TVectorT< Double_t > TVectorD
static void MakeHessenBerg(TMatrixD &v, TVectorD &ortho, TMatrixD &H)
Nonsymmetric reduction to Hessenberg form.
const TMatrixD GetEigenValues() const
Computes the block diagonal eigenvalue matrix.
TMatrixDEigen & operator=(const TMatrixDEigen &source)
Assignment operator.
static void Sort(TMatrixD &v, TVectorD &d, TVectorD &e)
Sort eigenvalues and corresponding vectors in descending order of Re^2+Im^2 of the complex eigenvalue...
static void MakeSchurr(TMatrixD &v, TVectorD &d, TVectorD &e, TMatrixD &H)
Nonsymmetric reduction from Hessenberg to real Schur form.
const Element * GetMatrixArray() const override
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].
Element * GetMatrixArray()
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
Double_t Sqrt(Double_t x)
Returns the square root of x.
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Returns x raised to the power y.
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.