void QRZT(Matrix& X, LowerTriangularMatrix& L) { REPORT Tracer et("QRZT(1)"); int n = X.Ncols(); int s = X.Nrows(); L.resize(s); if (n == 0 || s == 0) { L = 0.0; return; } Real* xi = X.Store(); int k; for (int i=0; i<s; i++) { Real sum = 0.0; Real* xi0=xi; k=n; while(k--) { sum += square(*xi++); } sum = sqrt(sum); if (sum == 0.0) { REPORT k=n; while(k--) { *xi0++ = 0.0; } for (int j=i; j<s; j++) L.element(j,i) = 0.0; } else { L.element(i,i) = sum; Real* xj0=xi0; k=n; while(k--) { *xj0++ /= sum; } for (int j=i+1; j<s; j++) { sum=0.0; xi=xi0; Real* xj=xj0; k=n; while(k--) { sum += *xi++ * *xj++; } xi=xi0; k=n; while(k--) { *xj0++ -= sum * *xi++; } L.element(j,i) = sum; } } } }
void QRZT(Matrix& X, LowerTriangularMatrix& L) { REPORT Tracer et("QZT(1)"); int n = X.Ncols(); int s = X.Nrows(); L.ReSize(s); Real* xi = X.Store(); int k; for (int i=0; i<s; i++) { Real sum = 0.0; Real* xi0=xi; k=n; while(k--) { sum += square(*xi++); } sum = sqrt(sum); L.element(i,i) = sum; if (sum==0.0) Throw(SingularException(L)); Real* xj0=xi0; k=n; while(k--) { *xj0++ /= sum; } for (int j=i+1; j<s; j++) { sum=0.0; xi=xi0; Real* xj=xj0; k=n; while(k--) { sum += *xi++ * *xj++; } xi=xi0; k=n; while(k--) { *xj0++ -= sum * *xi++; } L.element(j,i) = sum; } } }
void updateQRZT(Matrix& X, LowerTriangularMatrix& L) { REPORT Tracer et("updateQRZT"); int n = X.Ncols(); int s = X.Nrows(); if (s != L.Nrows()) Throw(ProgramException("Incompatible dimensions",X,L)); if (n == 0 || s == 0) return; Real* xi = X.Store(); int k; for (int i=0; i<s; i++) { Real r = L.element(i,i); Real sum = 0.0; Real* xi0=xi; k=n; while(k--) { sum += square(*xi++); } sum = sqrt(sum + square(r)); if (sum == 0.0) { REPORT k=n; while(k--) { *xi0++ = 0.0; } for (int j=i; j<s; j++) L.element(j,i) = 0.0; } else { Real frs = fabs(r) + sum; Real a0 = sqrt(frs / sum); Real alpha = a0 / frs; if (r <= 0) { REPORT L.element(i,i) = sum; alpha = -alpha; } else { REPORT L.element(i,i) = -sum; } Real* xj0=xi0; k=n; while(k--) { *xj0++ *= alpha; } for (int j=i+1; j<s; j++) { sum = 0.0; xi=xi0; Real* xj=xj0; k=n; while(k--) { sum += *xi++ * *xj++; } sum += a0 * L.element(j,i); xi=xi0; k=n; while(k--) { *xj0++ -= sum * *xi++; } L.element(j,i) -= sum * a0; } } } }