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 BetaShifted_HGVolatilityParam::initializeShiftMatrix( LMMTenorStructure_PTR pLMMTenorStructure, const LowerTriangularMatrix& betas, const std::vector<double>& liborsInitValues) { assert(betas.size1() == betas.size2() && betas.size2() == liborsInitValues.size() && pLMMTenorStructure->get_nbLIBOR()); //unused first column, first row is automatically null since it is lower triangular matrix LowerTriangularMatrix m(betas.size1(), betas.size2()); for(size_t k=0; k<m.size1();++k) { shift_matrix_(k,0) = 1.0e100; } for(size_t liborIndex=1; liborIndex<m.size1();++liborIndex) { for(size_t timeIndex=1;timeIndex<=liborIndex;++timeIndex) { double beta = betas(liborIndex,timeIndex); double liborInitValue = liborsInitValues[liborIndex]; shift_matrix_(liborIndex,timeIndex) = 1+ (1-beta)/beta*liborInitValue; } } }
inline Matrix<C>::Matrix(const LowerTriangularMatrix<C>& M) : entries_(M.row_dimension()*M.column_dimension()), rowdim_(M.row_dimension()), coldim_(M.column_dimension()) { for (size_type i(0); i < rowdim_; i++) for (size_type j(0); j <= i; j++) { this->operator () (i, j) = M(i, j); } }
void MLE_D_FI::MakeCovariance() { if (Covariance.Nrows()==0) { LowerTriangularMatrix LTI = LT.i(); Covariance << LTI.t() * LTI; SE << Covariance; // get diagonal int n = Covariance.Nrows(); for (int i=1; i <= n; i++) SE(i) = sqrt(SE(i)); } }
void Shifted_HGVolatilityParam::reset_g_matrix(const LowerTriangularMatrix& other_g) { assert(other_g.size1() == g_matrix_.size1() ); assert(other_g.size2() == g_matrix_.size2() ); for(size_t indexLibor=1; indexLibor<g_matrix_.size1();++indexLibor) { for(size_t indexTime=1; indexTime<=indexLibor; ++indexTime) { g_matrix_(indexLibor,indexTime) = other_g(indexLibor,indexTime); } } }
void Print(const LowerTriangularMatrix& X) { ++PCN; cout << "\nMatrix type: " << X.Type().Value() << " ("; cout << X.Nrows() << ", "; cout << X.Ncols() << ")\n\n"; if (X.IsZero()) { cout << "All elements are zero\n" << flush; return; } int nr=X.Nrows(); for (int i=1; i<=nr; i++) { for (int j=1; j<=i; j++) cout << X(i,j) << "\t"; cout << "\n"; } cout << flush; ++PCZ; }
/// /// /// Function to calculate the transformation matrix X ( p = X.f ) /// according to the Whiten Crusher Model described in /// the JKMRC monograph: /// Napier-Munn et al. /// "Mineral Comminution Circuits - Their Operation and Optimisation", /// JKMRC monograph 1996, /// p138ff /// void WhitenCrusherTransformationMatrix(const LowerTriangularMatrix& B, const DiagonalMatrix& C, Matrix& X) { int matrixSize = B.Nrows() ; IdentityMatrix I(matrixSize); /// do the matrix calculations X = (I - C) * (I - (B * C)).i() ; }
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 test3(Real* y, Real* x1, Real* x2, int nobs, int npred) { cout << "\n\nTest 3 - Cholesky\n"; // traditional sum of squares and products method of calculation // with subtraction of means - using Cholesky decomposition Matrix X(nobs,npred); X.Column(1) << x1; X.Column(2) << x2; ColumnVector Y(nobs); Y << y; ColumnVector Ones(nobs); Ones = 1.0; RowVector M = Ones.t() * X / nobs; Matrix XC(nobs,npred); XC = X - Ones * M; ColumnVector YC(nobs); Real m = Sum(Y) / nobs; YC = Y - Ones * m; SymmetricMatrix SSQ; SSQ << XC.t() * XC; // Cholesky decomposition of SSQ LowerTriangularMatrix L = Cholesky(SSQ); // calculate estimate ColumnVector A = L.t().i() * (L.i() * (XC.t() * YC)); // calculate estimate of constant term Real a = m - (M * A).AsScalar(); // Get variances of estimates from diagonal elements of invoice of SSQ DiagonalMatrix D; D << L.t().i() * L.i(); ColumnVector V = D.AsColumn(); Real v = 1.0/nobs + (L.i() * M.t()).SumSquare(); // Calculate fitted values and residuals int npred1 = npred+1; ColumnVector Fitted = X * A + a; ColumnVector Residual = Y - Fitted; Real ResVar = Residual.SumSquare() / (nobs-npred1); // Get diagonals of Hat matrix (an expensive way of doing this) Matrix X1(nobs,npred1); X1.Column(1)<<Ones; X1.Columns(2,npred1)<<X; DiagonalMatrix Hat; Hat << X1 * (X1.t() * X1).i() * X1.t(); // print out answers cout << "\nEstimates and their standard errors\n\n"; cout.setf(ios::fixed, ios::floatfield); cout << setw(11) << setprecision(5) << a << " "; cout << setw(11) << setprecision(5) << sqrt(v*ResVar) << endl; ColumnVector SE(npred); for (int i=1; i<=npred; i++) SE(i) = sqrt(V(i)*ResVar); cout << setw(11) << setprecision(5) << (A | SE) << endl; cout << "\nObservations, fitted value, residual value, hat value\n"; cout << setw(9) << setprecision(3) << (X | Y | Fitted | Residual | Hat.AsColumn()); cout << "\n\n"; }
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; } } } }
void trymatd() { Tracer et("Thirteenth test of Matrix package"); Tracer::PrintTrace(); Matrix X(5,20); int i,j; for (j=1;j<=20;j++) X(1,j) = j+1; for (i=2;i<=5;i++) for (j=1;j<=20; j++) X(i,j) = (long)X(i-1,j) * j % 1001; SymmetricMatrix S; S << X * X.t(); Matrix SM = X * X.t() - S; Print(SM); LowerTriangularMatrix L = Cholesky(S); Matrix Diff = L*L.t()-S; Clean(Diff, 0.000000001); Print(Diff); { Tracer et1("Stage 1"); LowerTriangularMatrix L1(5); Matrix Xt = X.t(); Matrix Xt2 = Xt; QRZT(X,L1); Diff = L - L1; Clean(Diff,0.000000001); Print(Diff); UpperTriangularMatrix Ut(5); QRZ(Xt,Ut); Diff = L - Ut.t(); Clean(Diff,0.000000001); Print(Diff); Matrix Y(3,20); for (j=1;j<=20;j++) Y(1,j) = 22-j; for (i=2;i<=3;i++) for (j=1;j<=20; j++) Y(i,j) = (long)Y(i-1,j) * j % 101; Matrix Yt = Y.t(); Matrix M,Mt; Matrix Y2=Y; QRZT(X,Y,M); QRZ(Xt,Yt,Mt); Diff = Xt - X.t(); Clean(Diff,0.000000001); Print(Diff); Diff = Yt - Y.t(); Clean(Diff,0.000000001); Print(Diff); Diff = Mt - M.t(); Clean(Diff,0.000000001); Print(Diff); Diff = Y2 * Xt2 * S.i() - M * L.i(); Clean(Diff,0.000000001); Print(Diff); } ColumnVector C1(5); { Tracer et1("Stage 2"); X.ReSize(5,5); for (j=1;j<=5;j++) X(1,j) = j+1; for (i=2;i<=5;i++) for (j=1;j<=5; j++) X(i,j) = (long)X(i-1,j) * j % 1001; for (i=1;i<=5;i++) C1(i) = i*i; CroutMatrix A = X; ColumnVector C2 = A.i() * C1; C1 = X.i() * C1; X = C1 - C2; Clean(X,0.000000001); Print(X); } { Tracer et1("Stage 3"); X.ReSize(7,7); for (j=1;j<=7;j++) X(1,j) = j+1; for (i=2;i<=7;i++) for (j=1;j<=7; j++) X(i,j) = (long)X(i-1,j) * j % 1001; C1.ReSize(7); for (i=1;i<=7;i++) C1(i) = i*i; RowVector R1 = C1.t(); Diff = R1 * X.i() - ( X.t().i() * R1.t() ).t(); Clean(Diff,0.000000001); Print(Diff); } { Tracer et1("Stage 4"); X.ReSize(5,5); for (j=1;j<=5;j++) X(1,j) = j+1; for (i=2;i<=5;i++) for (j=1;j<=5; j++) X(i,j) = (long)X(i-1,j) * j % 1001; C1.ReSize(5); for (i=1;i<=5;i++) C1(i) = i*i; CroutMatrix A1 = X*X; ColumnVector C2 = A1.i() * C1; C1 = X.i() * C1; C1 = X.i() * C1; X = C1 - C2; Clean(X,0.000000001); Print(X); } { Tracer et1("Stage 5"); int n = 40; SymmetricBandMatrix B(n,2); B = 0.0; for (i=1; i<=n; i++) { B(i,i) = 6; if (i<=n-1) B(i,i+1) = -4; if (i<=n-2) B(i,i+2) = 1; } B(1,1) = 5; B(n,n) = 5; SymmetricMatrix A = B; ColumnVector X(n); X(1) = 429; for (i=2;i<=n;i++) X(i) = (long)X(i-1) * 31 % 1001; X = X / 100000L; // the matrix B is rather ill-conditioned so the difficulty is getting // good agreement (we have chosen X very small) may not be surprising; // maximum element size in B.i() is around 1400 ColumnVector Y1 = A.i() * X; LowerTriangularMatrix C1 = Cholesky(A); ColumnVector Y2 = C1.t().i() * (C1.i() * X) - Y1; Clean(Y2, 0.000000001); Print(Y2); UpperTriangularMatrix CU = C1.t().i(); LowerTriangularMatrix CL = C1.i(); Y2 = CU * (CL * X) - Y1; Clean(Y2, 0.000000001); Print(Y2); Y2 = B.i() * X - Y1; Clean(Y2, 0.000000001); Print(Y2); LowerBandMatrix C2 = Cholesky(B); Matrix M = C2 - C1; Clean(M, 0.000000001); Print(M); ColumnVector Y3 = C2.t().i() * (C2.i() * X) - Y1; Clean(Y3, 0.000000001); Print(Y3); CU = C1.t().i(); CL = C1.i(); Y3 = CU * (CL * X) - Y1; Clean(Y3, 0.000000001); Print(Y3); Y3 = B.i() * X - Y1; Clean(Y3, 0.000000001); Print(Y3); SymmetricMatrix AI = A.i(); Y2 = AI*X - Y1; Clean(Y2, 0.000000001); Print(Y2); SymmetricMatrix BI = B.i(); BandMatrix C = B; Matrix CI = C.i(); M = A.i() - CI; Clean(M, 0.000000001); Print(M); M = B.i() - CI; Clean(M, 0.000000001); Print(M); M = AI-BI; Clean(M, 0.000000001); Print(M); M = AI-CI; Clean(M, 0.000000001); Print(M); M = A; AI << M; M = AI-A; Clean(M, 0.000000001); Print(M); C = B; BI << C; M = BI-B; Clean(M, 0.000000001); Print(M); } { Tracer et1("Stage 5"); SymmetricMatrix A(4), B(4); A << 5 << 1 << 4 << 2 << 1 << 6 << 1 << 0 << 1 << 7; B << 8 << 1 << 5 << 1 << 0 << 9 << 2 << 1 << 0 << 6; LowerTriangularMatrix AB = Cholesky(A) * Cholesky(B); Matrix M = Cholesky(A) * B * Cholesky(A).t() - AB*AB.t(); Clean(M, 0.000000001); Print(M); M = A * Cholesky(B); M = M * M.t() - A * B * A; Clean(M, 0.000000001); Print(M); } { Tracer et1("Stage 6"); int N=49; int i; SymmetricBandMatrix S(N,1); Matrix B(N,N+1); B=0; for (i=1;i<=N;i++) { S(i,i)=1; B(i,i)=1; B(i,i+1)=-1; } for (i=1;i<N; i++) S(i,i+1)=-.5; DiagonalMatrix D(N+1); D = 1; B = B.t()*S.i()*B - (D-1.0/(N+1))*2.0; Clean(B, 0.000000001); Print(B); } { Tracer et1("Stage 7"); // Copying and moving CroutMatrix Matrix A(7,7); A.Row(1) << 3 << 2 << -1 << 4 << -3 << 5 << 9; A.Row(2) << -8 << 7 << 2 << 0 << 7 << 0 << -1; A.Row(3) << 2 << -2 << 3 << 1 << 9 << 0 << 3; A.Row(4) << -1 << 5 << 2 << 2 << 5 << -1 << 2; A.Row(5) << 4 << -4 << 1 << 9 << -8 << 7 << 5; A.Row(6) << 1 << -2 << 5 << -1 << -2 << 5 << 1; A.Row(7) << -6 << 3 << -1 << 8 << -1 << 2 << 2; RowVector D(30); D = 0; Real x = determinant(A); CroutMatrix B = A; D(1) = determinant(B) / x - 1; Matrix C = A * Inverter1(B) - IdentityMatrix(7); Clean(C, 0.000000001); Print(C); // Test copy constructor (in Inverter2 and ordinary copy) CroutMatrix B1; B1 = B; D(2) = determinant(B1) / x - 1; C = A * Inverter2(B1) - IdentityMatrix(7); Clean(C, 0.000000001); Print(C); // Do it again with release B.release(); B1 = B; D(2) = B.nrows(); D(3) = B.ncols(); D(4) = B.size(); D(5) = determinant(B1) / x - 1; B1.release(); C = A * Inverter2(B1) - IdentityMatrix(7); D(6) = B1.nrows(); D(7) = B1.ncols(); D(8) = B1.size(); Clean(C, 0.000000001); Print(C); // see if we get an implicit invert B1 = -A; D(9) = determinant(B1) / x + 1; // odd number of rows - sign will change C = -A * Inverter2(B1) - IdentityMatrix(7); Clean(C, 0.000000001); Print(C); // check for_return B = LU1(A); B1 = LU2(A); CroutMatrix B2 = LU3(A); C = A * B.i() - IdentityMatrix(7); Clean(C, 0.000000001); Print(C); D(10) = (B == B1 ? 0 : 1) + (B == B2 ? 0 : 1); // check lengths D(13) = B.size()-49; // check release(2) B1.release(2); B2 = B1; D(15) = B == B2 ? 0 : 1; CroutMatrix B3 = B1; D(16) = B == B3 ? 0 : 1; D(17) = B1.size(); // some oddments B1 = B; B1 = B1.i(); C = A - B1.i(); Clean(C, 0.000000001); Print(C); B1 = B; B1.release(); B1 = B1; B2 = B1; D(19) = B == B1 ? 0 : 1; D(20) = B == B2 ? 0 : 1; B1.cleanup(); B2 = B1; D(21) = B1.size(); D(22) = B2.size(); GenericMatrix GM = B; C = A.i() - GM.i(); Clean(C, 0.000000001); Print(C); B1 = GM; D(23) = B == B1 ? 0 : 1; B1 = A * 0; B2 = B1; D(24) = B2.is_singular() ? 0 : 1; // check release again - see if memory moves const Real* d = B.const_data(); const int* i = B.const_data_indx(); B1 = B; const Real* d1 = B1.const_data(); const int* i1 = B1.const_data_indx(); B1.release(); B2 = B1; const Real* d2 = B2.const_data(); const int* i2 = B2.const_data_indx(); D(25) = (d != d1 ? 0 : 1) + (d1 == d2 ? 0 : 1) + (i != i1 ? 0 : 1) + (i1 == i2 ? 0 : 1); Clean(D, 0.000000001); Print(D); } { Tracer et1("Stage 8"); // Same for BandLUMatrix BandMatrix A(7,3,2); A.Row(1) << 3 << 2 << -1; A.Row(2) << -8 << 7 << 2 << 0; A.Row(3) << 2 << -2 << 3 << 1 << 9; A.Row(4) << -1 << 5 << 2 << 2 << 5 << -1; A.Row(5) << -4 << 1 << 9 << -8 << 7 << 5; A.Row(6) << 5 << -1 << -2 << 5 << 1; A.Row(7) << 8 << -1 << 2 << 2; RowVector D(30); D = 0; Real x = determinant(A); BandLUMatrix B = A; D(1) = determinant(B) / x - 1; Matrix C = A * Inverter1(B) - IdentityMatrix(7); Clean(C, 0.000000001); Print(C); // Test copy constructor (in Inverter2 and ordinary copy) BandLUMatrix B1; B1 = B; D(2) = determinant(B1) / x - 1; C = A * Inverter2(B1) - IdentityMatrix(7); Clean(C, 0.000000001); Print(C); // Do it again with release B.release(); B1 = B; D(2) = B.nrows(); D(3) = B.ncols(); D(4) = B.size(); D(5) = determinant(B1) / x - 1; B1.release(); C = A * Inverter2(B1) - IdentityMatrix(7); D(6) = B1.nrows(); D(7) = B1.ncols(); D(8) = B1.size(); Clean(C, 0.000000001); Print(C); // see if we get an implicit invert B1 = -A; D(9) = determinant(B1) / x + 1; // odd number of rows - sign will change C = -A * Inverter2(B1) - IdentityMatrix(7); Clean(C, 0.000000001); Print(C); // check for_return B = LU1(A); B1 = LU2(A); BandLUMatrix B2 = LU3(A); C = A * B.i() - IdentityMatrix(7); Clean(C, 0.000000001); Print(C); D(10) = (B == B1 ? 0 : 1) + (B == B2 ? 0 : 1); // check lengths D(11) = B.bandwidth().lower()-3; D(12) = B.bandwidth().upper()-2; D(13) = B.size()-42; D(14) = B.size2()-21; // check release(2) B1.release(2); B2 = B1; D(15) = B == B2 ? 0 : 1; BandLUMatrix B3 = B1; D(16) = B == B3 ? 0 : 1; D(17) = B1.size(); // Compare with CroutMatrix CroutMatrix CM = A; C = CM.i() - B.i(); Clean(C, 0.000000001); Print(C); D(18) = determinant(CM) / x - 1; // some oddments B1 = B; CM = B1.i(); C = A - CM.i(); Clean(C, 0.000000001); Print(C); B1 = B; B1.release(); B1 = B1; B2 = B1; D(19) = B == B1 ? 0 : 1; D(20) = B == B2 ? 0 : 1; B1.cleanup(); B2 = B1; D(21) = B1.size(); D(22) = B2.size(); GenericMatrix GM = B; C = A.i() - GM.i(); Clean(C, 0.000000001); Print(C); B1 = GM; D(23) = B == B1 ? 0 : 1; B1 = A * 0; B2 = B1; D(24) = B2.is_singular() ? 0 : 1; // check release again - see if memory moves const Real* d = B.const_data(); const Real* dd = B.const_data(); const int* i = B.const_data_indx(); B1 = B; const Real* d1 = B1.const_data(); const Real* dd1 = B1.const_data(); const int* i1 = B1.const_data_indx(); B1.release(); B2 = B1; const Real* d2 = B2.const_data(); const Real* dd2 = B2.const_data(); const int* i2 = B2.const_data_indx(); D(25) = (d != d1 ? 0 : 1) + (d1 == d2 ? 0 : 1) + (dd != dd1 ? 0 : 1) + (dd1 == dd2 ? 0 : 1) + (i != i1 ? 0 : 1) + (i1 == i2 ? 0 : 1); Clean(D, 0.000000001); Print(D); } { Tracer et1("Stage 9"); // Modification of Cholesky decomposition int i, j; // Build test matrix Matrix X(100, 10); MultWithCarry mwc; // Uniform random number generator for (i = 1; i <= 100; ++i) for (j = 1; j <= 10; ++j) X(i, j) = 2.0 * (mwc.Next() - 0.5); Matrix X1 = X; // save copy // Form sums of squares and products matrix and Cholesky decompose SymmetricMatrix A; A << X.t() * X; UpperTriangularMatrix U1 = Cholesky(A).t(); // Do QR decomposition of X and check we get same triangular matrix UpperTriangularMatrix U2; QRZ(X, U2); Matrix Diff = U1 - U2; Clean(Diff, 0.000000001); Print(Diff); // Try adding new row to X and updating triangular matrix RowVector NewRow(10); for (j = 1; j <= 10; ++j) NewRow(j) = 2.0 * (mwc.Next() - 0.5); UpdateCholesky(U2, NewRow); X = X1 & NewRow; QRZ(X, U1); Diff = U1 - U2; Clean(Diff, 0.000000001); Print(Diff); // Try removing two rows and updating triangular matrix DowndateCholesky(U2, X1.Row(20)); DowndateCholesky(U2, X1.Row(35)); X = X1.Rows(1,19) & X1.Rows(21,34) & X1.Rows(36,100) & NewRow; QRZ(X, U1); Diff = U1 - U2; Clean(Diff, 0.000000001); Print(Diff); // Circular shifts CircularShift(X, 3,6); CircularShift(X, 5,5); CircularShift(X, 4,5); CircularShift(X, 1,6); CircularShift(X, 6,10); } { Tracer et1("Stage 10"); // Try updating QRZ, QRZT decomposition TestUpdateQRZ tuqrz1(10, 100, 50, 25); tuqrz1.DoTest(); tuqrz1.Reset(); tuqrz1.ClearRow(1); tuqrz1.DoTest(); tuqrz1.Reset(); tuqrz1.ClearRow(1); tuqrz1.ClearRow(2); tuqrz1.DoTest(); tuqrz1.Reset(); tuqrz1.ClearRow(5); tuqrz1.ClearRow(6); tuqrz1.DoTest(); tuqrz1.Reset(); tuqrz1.ClearRow(10); tuqrz1.DoTest(); TestUpdateQRZ tuqrz2(15, 100, 0, 0); tuqrz2.DoTest(); tuqrz2.Reset(); tuqrz2.ClearRow(1); tuqrz2.DoTest(); tuqrz2.Reset(); tuqrz2.ClearRow(1); tuqrz2.ClearRow(2); tuqrz2.DoTest(); tuqrz2.Reset(); tuqrz2.ClearRow(5); tuqrz2.ClearRow(6); tuqrz2.DoTest(); tuqrz2.Reset(); tuqrz2.ClearRow(15); tuqrz2.DoTest(); TestUpdateQRZ tuqrz3(5, 0, 10, 0); tuqrz3.DoTest(); } // cout << "\nEnd of Thirteenth test\n"; }
void trymata() { // cout << "\nTenth test of Matrix package\n"; Tracer et("Tenth test of Matrix package"); Tracer::PrintTrace(); int i; int j; UpperTriangularMatrix U(8); for (i=1;i<=8;i++) for (j=i;j<=8;j++) U(i,j)=i+j*j+5; Matrix X(8,6); for (i=1;i<=8;i++) for (j=1;j<=6;j++) X(i,j)=i*j+1.0; Matrix Y = U.i()*X; Matrix MU=U; Y=Y-MU.i()*X; Clean(Y,0.00000001); Print(Y); Y = U.t().i()*X; Y=Y-MU.t().i()*X; Clean(Y,0.00000001); Print(Y); UpperTriangularMatrix UX(8); for (i=1;i<=8;i++) for (j=i;j<=8;j++) UX(i,j)=i+j+1; UX(4,4)=0; UX(4,5)=0; UpperTriangularMatrix UY = U.i() * UX; { X=UX; MU=U; Y=UY-MU.i()*X; Clean(Y,0.000000001); Print(Y); } LowerTriangularMatrix LY = U.t().i() * UX.t(); { Y=LY-MU.i().t()*X.t(); Clean(Y,0.000000001); Print(Y); } DiagonalMatrix D(8); for (i=1;i<=8;i++) D(i,i)=i+1; { X=D.i()*MU; } { UY=U; UY=D.i()*UY; Y=UY-X; Clean(Y,0.00000001); Print(Y); } { UY=D.i()*U; Y=UY-X; Clean(Y,0.00000001); Print(Y); } // X=MU.t(); // LY=D.i()*U.t(); Y=D*LY-X; Clean(Y,0.00000001); Print(Y); // LowerTriangularMatrix L=U.t(); // LY=D.i()*L; Y=D*LY-X; Clean(Y,0.00000001); Print(Y); U.ReSize(8); for (i=1;i<=8;i++) for (j=i;j<=8;j++) U(i,j)=i+j*j+5; MU = U; MU = U.i() - MU.i(); Clean(MU,0.00000001); Print(MU); MU = U.t().i() - U.i().t(); Clean(MU,0.00000001); Print(MU); // test LINEQ { ColumnVector X1(4), X2(4); X1(1)=1; X1(2)=2; X1(3)=3; X1(4)=4; X2(1)=1; X2(2)=10; X2(3)=100; X2(4)=1000; Matrix A(4,4); A(1,1)=1; A(1,2)=3; A(1,3)=0; A(1,4)=0; A(2,1)=3; A(2,2)=2; A(2,3)=5; A(2,4)=0; A(3,1)=0; A(3,2)=5; A(3,3)=4; A(3,4)=1; A(4,1)=0; A(4,2)=0; A(4,3)=1; A(4,4)=3; process(A,X1,X2); BandMatrix B(4,1,1); B.Inject(A); process(B,X1,X2); UpperTriangularMatrix U(4); U(1,1)=1; U(1,2)=2; U(1,3)=3; U(1,4)=4; U(2,2)=8; U(2,3)=7; U(2,4)=6; U(3,3)=2; U(3,4)=7; U(4,4)=1; process(U,X1,X2); // check rowwise load UpperTriangularMatrix U1(4); U1.Row(1) << 1 << 2 << 3 << 4; U1.Row(2) << 8 << 7 << 6; U1.Row(3) << 2 << 7; U1.Row(4) << 1; U1 -= U; Print(U1); LowerTriangularMatrix L = U.t(); process(L,X1,X2); } // test inversion of poorly conditioned matrix // a user complained this didn't work under OS9 { Matrix M(4,4); M << 8.613057e+00 << 8.693985e+00 << -2.322050e-01 << 0.000000e+00 << 8.693985e+00 << 8.793868e+00 << -2.346310e-01 << 0.000000e+00 << -2.322050e-01 << -2.346310e-01 << 6.264000e-03 << 0.000000e+00 << 0.000000e+00 << 0.000000e+00 << 0.000000e+00 << 3.282806e+03 ; Matrix MI = M.i(); DiagonalMatrix I(4); I = 1; Matrix Diff = MI * M - I; Clean(Diff,0.00000001); Print(Diff); // Alternatively do Cholesky SymmetricMatrix SM; SM << M; LowerTriangularMatrix LT = Cholesky(SM).i(); MI = LT.t() * LT; Diff = MI * M - I; Clean(Diff,0.00000001); Print(Diff); } // cout << "\nEnd of tenth test\n"; }
void trymatc() { // cout << "\nTwelfth test of Matrix package\n"; Tracer et("Twelfth test of Matrix package"); Tracer::PrintTrace(); DiagonalMatrix D(15); D=1.5; Matrix A(15,15); int i,j; for (i=1;i<=15;i++) for (j=1;j<=15;j++) A(i,j)=i*i+j-150; { A = A + D; } ColumnVector B(15); for (i=1;i<=15;i++) B(i)=i+i*i-150.0; { Tracer et1("Stage 1"); ColumnVector B1=B; B=(A*2.0).i() * B1; Matrix X = A*B-B1/2.0; Clean(X, 0.000000001); Print(X); A.ReSize(3,5); for (i=1; i<=3; i++) for (j=1; j<=5; j++) A(i,j) = i+100*j; B = A.AsColumn()+10000; RowVector R = (A+10000).AsColumn().t(); Print( RowVector(R-B.t()) ); } { Tracer et1("Stage 2"); B = A.AsColumn()+10000; Matrix XR = (A+10000).AsMatrix(15,1).t(); Print( RowVector(XR-B.t()) ); } { Tracer et1("Stage 3"); B = (A.AsMatrix(15,1)+A.AsColumn())/2.0+10000; Matrix MR = (A+10000).AsColumn().t(); Print( RowVector(MR-B.t()) ); B = (A.AsMatrix(15,1)+A.AsColumn())/2.0; MR = A.AsColumn().t(); Print( RowVector(MR-B.t()) ); } { Tracer et1("Stage 4"); B = (A.AsMatrix(15,1)+A.AsColumn())/2.0; RowVector R = A.AsColumn().t(); Print( RowVector(R-B.t()) ); } { Tracer et1("Stage 5"); RowVector R = (A.AsColumn()-5000).t(); B = ((R.t()+10000) - A.AsColumn())-5000; Print( RowVector(B.t()) ); } { Tracer et1("Stage 6"); B = A.AsColumn(); ColumnVector B1 = (A+10000).AsColumn() - 10000; Print(ColumnVector(B1-B)); } { Tracer et1("Stage 7"); Matrix X = B.AsMatrix(3,5); Print(Matrix(X-A)); for (i=1; i<=3; i++) for (j=1; j<=5; j++) B(5*(i-1)+j) -= i+100*j; Print(B); } { Tracer et1("Stage 8"); A.ReSize(7,7); D.ReSize(7); for (i=1; i<=7; i++) for (j=1; j<=7; j++) A(i,j) = i*j*j; for (i=1; i<=7; i++) D(i,i) = i; UpperTriangularMatrix U; U << A; Matrix X = A; for (i=1; i<=7; i++) X(i,i) = i; A.Inject(D); Print(Matrix(X-A)); X = U; U.Inject(D); A = U; for (i=1; i<=7; i++) X(i,i) = i; Print(Matrix(X-A)); } { Tracer et1("Stage 9"); A.ReSize(7,5); for (i=1; i<=7; i++) for (j=1; j<=5; j++) A(i,j) = i+100*j; Matrix Y = A; Y = Y - ((const Matrix&)A); Print(Y); Matrix X = A; // X.Release(); Y = A; Y = ((const Matrix&)X) - A; Print(Y); Y = 0.0; Y = ((const Matrix&)X) - ((const Matrix&)A); Print(Y); } { Tracer et1("Stage 10"); // some tests on submatrices UpperTriangularMatrix U(20); for (i=1; i<=20; i++) for (j=i; j<=20; j++) U(i,j)=100 * i + j; UpperTriangularMatrix V = U.SymSubMatrix(1,5); UpperTriangularMatrix U1 = U; U1.SubMatrix(4,8,5,9) /= 2; U1.SubMatrix(4,8,5,9) += 388 * V; U1.SubMatrix(4,8,5,9) *= 2; U1.SubMatrix(4,8,5,9) += V; U1 -= U; UpperTriangularMatrix U2 = U1; U1 << U1.SubMatrix(4,8,5,9); U2.SubMatrix(4,8,5,9) -= U1; Print(U2); U1 -= (777*V); Print(U1); U1 = U; U1.SubMatrix(4,8,5,9) -= U.SymSubMatrix(1,5); U1 -= U; U2 = U1; U1 << U1.SubMatrix(4,8,5,9); U2.SubMatrix(4,8,5,9) -= U1; Print(U2); U1 += V; Print(U1); U1 = U; U1.SubMatrix(3,10,15,19) += 29; U1 -= U; Matrix X = U1.SubMatrix(3,10,15,19); X -= 29; Print(X); U1.SubMatrix(3,10,15,19) *= 0; Print(U1); LowerTriangularMatrix L = U.t(); LowerTriangularMatrix M = L.SymSubMatrix(1,5); LowerTriangularMatrix L1 = L; L1.SubMatrix(5,9,4,8) /= 2; L1.SubMatrix(5,9,4,8) += 388 * M; L1.SubMatrix(5,9,4,8) *= 2; L1.SubMatrix(5,9,4,8) += M; L1 -= L; LowerTriangularMatrix L2 = L1; L1 << L1.SubMatrix(5,9,4,8); L2.SubMatrix(5,9,4,8) -= L1; Print(L2); L1 -= (777*M); Print(L1); L1 = L; L1.SubMatrix(5,9,4,8) -= L.SymSubMatrix(1,5); L1 -= L; L2 =L1; L1 << L1.SubMatrix(5,9,4,8); L2.SubMatrix(5,9,4,8) -= L1; Print(L2); L1 += M; Print(L1); L1 = L; L1.SubMatrix(15,19,3,10) -= 29; L1 -= L; X = L1.SubMatrix(15,19,3,10); X += 29; Print(X); L1.SubMatrix(15,19,3,10) *= 0; Print(L1); } { Tracer et1("Stage 11"); // more tests on submatrices Matrix M(20,30); for (i=1; i<=20; i++) for (j=1; j<=30; j++) M(i,j)=100 * i + j; Matrix M1 = M; for (j=1; j<=30; j++) { ColumnVector CV = 3 * M1.Column(j); M.Column(j) += CV; } for (i=1; i<=20; i++) { RowVector RV = 5 * M1.Row(i); M.Row(i) -= RV; } M += M1; Print(M); } // cout << "\nEnd of twelfth test\n"; }
void trymatc() { // cout << "\nTwelfth test of Matrix package\n"; Tracer et("Twelfth test of Matrix package"); Tracer::PrintTrace(); DiagonalMatrix D(15); D=1.5; Matrix A(15,15); int i,j; for (i=1;i<=15;i++) for (j=1;j<=15;j++) A(i,j)=i*i+j-150; { A = A + D; } ColumnVector B(15); for (i=1;i<=15;i++) B(i)=i+i*i-150.0; { Tracer et1("Stage 1"); ColumnVector B1=B; B=(A*2.0).i() * B1; Matrix X = A*B-B1/2.0; Clean(X, 0.000000001); Print(X); A.ReSize(3,5); for (i=1; i<=3; i++) for (j=1; j<=5; j++) A(i,j) = i+100*j; B = A.AsColumn()+10000; RowVector R = (A+10000).AsColumn().t(); Print( RowVector(R-B.t()) ); } { Tracer et1("Stage 2"); B = A.AsColumn()+10000; Matrix XR = (A+10000).AsMatrix(15,1).t(); Print( RowVector(XR-B.t()) ); } { Tracer et1("Stage 3"); B = (A.AsMatrix(15,1)+A.AsColumn())/2.0+10000; Matrix MR = (A+10000).AsColumn().t(); Print( RowVector(MR-B.t()) ); B = (A.AsMatrix(15,1)+A.AsColumn())/2.0; MR = A.AsColumn().t(); Print( RowVector(MR-B.t()) ); } { Tracer et1("Stage 4"); B = (A.AsMatrix(15,1)+A.AsColumn())/2.0; RowVector R = A.AsColumn().t(); Print( RowVector(R-B.t()) ); } { Tracer et1("Stage 5"); RowVector R = (A.AsColumn()-5000).t(); B = ((R.t()+10000) - A.AsColumn())-5000; Print( RowVector(B.t()) ); } { Tracer et1("Stage 6"); B = A.AsColumn(); ColumnVector B1 = (A+10000).AsColumn() - 10000; Print(ColumnVector(B1-B)); } { Tracer et1("Stage 7"); Matrix X = B.AsMatrix(3,5); Print(Matrix(X-A)); for (i=1; i<=3; i++) for (j=1; j<=5; j++) B(5*(i-1)+j) -= i+100*j; Print(B); } { Tracer et1("Stage 8"); A.ReSize(7,7); D.ReSize(7); for (i=1; i<=7; i++) for (j=1; j<=7; j++) A(i,j) = i*j*j; for (i=1; i<=7; i++) D(i,i) = i; UpperTriangularMatrix U; U << A; Matrix X = A; for (i=1; i<=7; i++) X(i,i) = i; A.Inject(D); Print(Matrix(X-A)); X = U; U.Inject(D); A = U; for (i=1; i<=7; i++) X(i,i) = i; Print(Matrix(X-A)); } { Tracer et1("Stage 9"); A.ReSize(7,5); for (i=1; i<=7; i++) for (j=1; j<=5; j++) A(i,j) = i+100*j; Matrix Y = A; Y = Y - ((const Matrix&)A); Print(Y); Matrix X = A; Y = A; Y = ((const Matrix&)X) - A; Print(Y); Y = 0.0; Y = ((const Matrix&)X) - ((const Matrix&)A); Print(Y); } { Tracer et1("Stage 10"); // some tests on submatrices UpperTriangularMatrix U(20); for (i=1; i<=20; i++) for (j=i; j<=20; j++) U(i,j)=100 * i + j; UpperTriangularMatrix V = U.SymSubMatrix(1,5); UpperTriangularMatrix U1 = U; U1.SubMatrix(4,8,5,9) /= 2; U1.SubMatrix(4,8,5,9) += 388 * V; U1.SubMatrix(4,8,5,9) *= 2; U1.SubMatrix(4,8,5,9) += V; U1 -= U; UpperTriangularMatrix U2 = U1; U1 << U1.SubMatrix(4,8,5,9); U2.SubMatrix(4,8,5,9) -= U1; Print(U2); U1 -= (777*V); Print(U1); U1 = U; U1.SubMatrix(4,8,5,9) -= U.SymSubMatrix(1,5); U1 -= U; U2 = U1; U1 << U1.SubMatrix(4,8,5,9); U2.SubMatrix(4,8,5,9) -= U1; Print(U2); U1 += V; Print(U1); U1 = U; U1.SubMatrix(3,10,15,19) += 29; U1 -= U; Matrix X = U1.SubMatrix(3,10,15,19); X -= 29; Print(X); U1.SubMatrix(3,10,15,19) *= 0; Print(U1); LowerTriangularMatrix L = U.t(); LowerTriangularMatrix M = L.SymSubMatrix(1,5); LowerTriangularMatrix L1 = L; L1.SubMatrix(5,9,4,8) /= 2; L1.SubMatrix(5,9,4,8) += 388 * M; L1.SubMatrix(5,9,4,8) *= 2; L1.SubMatrix(5,9,4,8) += M; L1 -= L; LowerTriangularMatrix L2 = L1; L1 << L1.SubMatrix(5,9,4,8); L2.SubMatrix(5,9,4,8) -= L1; Print(L2); L1 -= (777*M); Print(L1); L1 = L; L1.SubMatrix(5,9,4,8) -= L.SymSubMatrix(1,5); L1 -= L; L2 =L1; L1 << L1.SubMatrix(5,9,4,8); L2.SubMatrix(5,9,4,8) -= L1; Print(L2); L1 += M; Print(L1); L1 = L; L1.SubMatrix(15,19,3,10) -= 29; L1 -= L; X = L1.SubMatrix(15,19,3,10); X += 29; Print(X); L1.SubMatrix(15,19,3,10) *= 0; Print(L1); } { Tracer et1("Stage 11"); // more tests on submatrices Matrix M(20,30); for (i=1; i<=20; i++) for (j=1; j<=30; j++) M(i,j)=100 * i + j; Matrix M1 = M; for (j=1; j<=30; j++) { ColumnVector CV = 3 * M1.Column(j); M.Column(j) += CV; } for (i=1; i<=20; i++) { RowVector RV = 5 * M1.Row(i); M.Row(i) -= RV; } M += M1; Print(M); } { Tracer et1("Stage 12"); // more tests on Release Matrix M(20,30); for (i=1; i<=20; i++) for (j=1; j<=30; j++) M(i,j)=100 * i + j; Matrix M1 = M; M.Release(); Matrix M2 = M; Matrix X = M; Print(X); X = M1 - M2; Print(X); #ifndef DONT_DO_NRIC nricMatrix N = M1; nricMatrix N1 = N; N.Release(); nricMatrix N2 = N; nricMatrix Y = N; Print(Y); Y = N1 - N2; Print(Y); N = M1 / 2; N1 = N * 2; N.Release(); N2 = N * 2; Y = N; Print(N); Y = (N1 - M1) | (N2 - M1); Print(Y); #endif } { Tracer et("Stage 13"); // test sum of squares of rows or columns MultWithCarry mwc; DiagonalMatrix DM; Matrix X; // rectangular matrix Matrix A(20, 15); FillWithValues(mwc, A); // sum of squares of rows DM << A * A.t(); ColumnVector CV = A.sum_square_rows(); X = CV - DM.AsColumn(); Clean(X, 0.000000001); Print(X); DM << A.t() * A; RowVector RV = A.sum_square_columns(); X = RV - DM.AsRow(); Clean(X, 0.000000001); Print(X); X = RV - A.t().sum_square_rows().t(); Clean(X, 0.000000001); Print(X); X = CV - A.t().sum_square_columns().t(); Clean(X, 0.000000001); Print(X); // UpperTriangularMatrix A.ReSize(17,17); FillWithValues(mwc, A); UpperTriangularMatrix UT; UT << A; Matrix A1 = UT; X = UT.sum_square_rows() - A1.sum_square_rows(); Print(X); X = UT.sum_square_columns() - A1.sum_square_columns(); Print(X); // LowerTriangularMatrix LowerTriangularMatrix LT; LT << A; A1 = LT; X = LT.sum_square_rows() - A1.sum_square_rows(); Print(X); X = LT.sum_square_columns() - A1.sum_square_columns(); Print(X); // SymmetricMatrix SymmetricMatrix SM; SM << A; A1 = SM; X = SM.sum_square_rows() - A1.sum_square_rows(); Print(X); X = SM.sum_square_columns() - A1.sum_square_columns(); Print(X); // DiagonalMatrix DM << A; A1 = DM; X = DM.sum_square_rows() - A1.sum_square_rows(); Print(X); X = DM.sum_square_columns() - A1.sum_square_columns(); Print(X); // BandMatrix BandMatrix BM(17, 3, 5); BM.Inject(A); A1 = BM; X = BM.sum_square_rows() - A1.sum_square_rows(); Print(X); X = BM.sum_square_columns() - A1.sum_square_columns(); Print(X); // SymmetricBandMatrix SymmetricBandMatrix SBM(17, 4); SBM.Inject(A); A1 = SBM; X = SBM.sum_square_rows() - A1.sum_square_rows(); Print(X); X = SBM.sum_square_columns() - A1.sum_square_columns(); Print(X); // IdentityMatrix IdentityMatrix IM(29); X = IM.sum_square_rows() - 1; Print(X); X = IM.sum_square_columns() - 1; Print(X); // Matrix with zero rows A1.ReSize(0,10); X.ReSize(1,10); X = 0; X -= A1.sum_square_columns(); Print(X); X.ReSize(0,1); X -= A1.sum_square_rows(); Print(X); // Matrix with zero columns A1.ReSize(10,0); X.ReSize(10,1); X = 0; X -= A1.sum_square_rows(); Print(X); X.ReSize(1,0); X -= A1.sum_square_columns(); Print(X); } { Tracer et("Stage 14"); // test extend orthonormal MultWithCarry mwc; Matrix A(20,5); FillWithValues(mwc, A); // Orthonormalise UpperTriangularMatrix R; Matrix A_old = A; QRZ(A,R); // Check decomposition Matrix X = A * R - A_old; Clean(X, 0.000000001); Print(X); // Check orthogonality X = A.t() * A - IdentityMatrix(5); Clean(X, 0.000000001); Print(X); // Try orthonality extend SquareMatrix A1(20); A1.Columns(1,5) = A; extend_orthonormal(A1,5); // check columns unchanged X = A - A1.Columns(1,5); Print(X); // Check orthogonality X = A1.t() * A1 - IdentityMatrix(20); Clean(X, 0.000000001); Print(X); X = A1 * A1.t() - IdentityMatrix(20); Clean(X, 0.000000001); Print(X); // Test with smaller number of columns Matrix A2(20,15); A2.Columns(1,5) = A; extend_orthonormal(A2,5); // check columns unchanged X = A - A2.Columns(1,5); Print(X); // Check orthogonality X = A2.t() * A2 - IdentityMatrix(15); Clean(X, 0.000000001); Print(X); // check it works with no columns to start with A2.ReSize(100,100); extend_orthonormal(A2,0); // Check orthogonality X = A2.t() * A2 - IdentityMatrix(100); Clean(X, 0.000000001); Print(X); X = A2 * A2.t() - IdentityMatrix(100); Clean(X, 0.000000001); Print(X); } // cout << "\nEnd of twelfth test\n"; }
void trymatd() { Tracer et("Thirteenth test of Matrix package"); Tracer::PrintTrace(); Matrix X(5,20); int i,j; for (j=1;j<=20;j++) X(1,j) = j+1; for (i=2;i<=5;i++) for (j=1;j<=20; j++) X(i,j) = (long)X(i-1,j) * j % 1001; SymmetricMatrix S; S << X * X.t(); Matrix SM = X * X.t() - S; Print(SM); LowerTriangularMatrix L = Cholesky(S); Matrix Diff = L*L.t()-S; Clean(Diff, 0.000000001); Print(Diff); { Tracer et1("Stage 1"); LowerTriangularMatrix L1(5); Matrix Xt = X.t(); Matrix Xt2 = Xt; QRZT(X,L1); Diff = L - L1; Clean(Diff,0.000000001); Print(Diff); UpperTriangularMatrix Ut(5); QRZ(Xt,Ut); Diff = L - Ut.t(); Clean(Diff,0.000000001); Print(Diff); Matrix Y(3,20); for (j=1;j<=20;j++) Y(1,j) = 22-j; for (i=2;i<=3;i++) for (j=1;j<=20; j++) Y(i,j) = (long)Y(i-1,j) * j % 101; Matrix Yt = Y.t(); Matrix M,Mt; Matrix Y2=Y; QRZT(X,Y,M); QRZ(Xt,Yt,Mt); Diff = Xt - X.t(); Clean(Diff,0.000000001); Print(Diff); Diff = Yt - Y.t(); Clean(Diff,0.000000001); Print(Diff); Diff = Mt - M.t(); Clean(Diff,0.000000001); Print(Diff); Diff = Y2 * Xt2 * S.i() - M * L.i(); Clean(Diff,0.000000001); Print(Diff); } ColumnVector C1(5); { Tracer et1("Stage 2"); X.ReSize(5,5); for (j=1;j<=5;j++) X(1,j) = j+1; for (i=2;i<=5;i++) for (j=1;j<=5; j++) X(i,j) = (long)X(i-1,j) * j % 1001; for (i=1;i<=5;i++) C1(i) = i*i; CroutMatrix A = X; ColumnVector C2 = A.i() * C1; C1 = X.i() * C1; X = C1 - C2; Clean(X,0.000000001); Print(X); } { Tracer et1("Stage 3"); X.ReSize(7,7); for (j=1;j<=7;j++) X(1,j) = j+1; for (i=2;i<=7;i++) for (j=1;j<=7; j++) X(i,j) = (long)X(i-1,j) * j % 1001; C1.ReSize(7); for (i=1;i<=7;i++) C1(i) = i*i; RowVector R1 = C1.t(); Diff = R1 * X.i() - ( X.t().i() * R1.t() ).t(); Clean(Diff,0.000000001); Print(Diff); } { Tracer et1("Stage 4"); X.ReSize(5,5); for (j=1;j<=5;j++) X(1,j) = j+1; for (i=2;i<=5;i++) for (j=1;j<=5; j++) X(i,j) = (long)X(i-1,j) * j % 1001; C1.ReSize(5); for (i=1;i<=5;i++) C1(i) = i*i; CroutMatrix A1 = X*X; ColumnVector C2 = A1.i() * C1; C1 = X.i() * C1; C1 = X.i() * C1; X = C1 - C2; Clean(X,0.000000001); Print(X); } { Tracer et1("Stage 5"); int n = 40; SymmetricBandMatrix B(n,2); B = 0.0; for (i=1; i<=n; i++) { B(i,i) = 6; if (i<=n-1) B(i,i+1) = -4; if (i<=n-2) B(i,i+2) = 1; } B(1,1) = 5; B(n,n) = 5; SymmetricMatrix A = B; ColumnVector X(n); X(1) = 429; for (i=2;i<=n;i++) X(i) = (long)X(i-1) * 31 % 1001; X = X / 100000L; // the matrix B is rather ill-conditioned so the difficulty is getting // good agreement (we have chosen X very small) may not be surprising; // maximum element size in B.i() is around 1400 ColumnVector Y1 = A.i() * X; LowerTriangularMatrix C1 = Cholesky(A); ColumnVector Y2 = C1.t().i() * (C1.i() * X) - Y1; Clean(Y2, 0.000000001); Print(Y2); UpperTriangularMatrix CU = C1.t().i(); LowerTriangularMatrix CL = C1.i(); Y2 = CU * (CL * X) - Y1; Clean(Y2, 0.000000001); Print(Y2); Y2 = B.i() * X - Y1; Clean(Y2, 0.000000001); Print(Y2); LowerBandMatrix C2 = Cholesky(B); Matrix M = C2 - C1; Clean(M, 0.000000001); Print(M); ColumnVector Y3 = C2.t().i() * (C2.i() * X) - Y1; Clean(Y3, 0.000000001); Print(Y3); CU = C1.t().i(); CL = C1.i(); Y3 = CU * (CL * X) - Y1; Clean(Y3, 0.000000001); Print(Y3); Y3 = B.i() * X - Y1; Clean(Y3, 0.000000001); Print(Y3); SymmetricMatrix AI = A.i(); Y2 = AI*X - Y1; Clean(Y2, 0.000000001); Print(Y2); SymmetricMatrix BI = B.i(); BandMatrix C = B; Matrix CI = C.i(); M = A.i() - CI; Clean(M, 0.000000001); Print(M); M = B.i() - CI; Clean(M, 0.000000001); Print(M); M = AI-BI; Clean(M, 0.000000001); Print(M); M = AI-CI; Clean(M, 0.000000001); Print(M); M = A; AI << M; M = AI-A; Clean(M, 0.000000001); Print(M); C = B; BI << C; M = BI-B; Clean(M, 0.000000001); Print(M); } { Tracer et1("Stage 5"); SymmetricMatrix A(4), B(4); A << 5 << 1 << 4 << 2 << 1 << 6 << 1 << 0 << 1 << 7; B << 8 << 1 << 5 << 1 << 0 << 9 << 2 << 1 << 0 << 6; LowerTriangularMatrix AB = Cholesky(A) * Cholesky(B); Matrix M = Cholesky(A) * B * Cholesky(A).t() - AB*AB.t(); Clean(M, 0.000000001); Print(M); M = A * Cholesky(B); M = M * M.t() - A * B * A; Clean(M, 0.000000001); Print(M); } { Tracer et1("Stage 6"); int N=49; int i; SymmetricBandMatrix S(N,1); Matrix B(N,N+1); B=0; for (i=1;i<=N;i++) { S(i,i)=1; B(i,i)=1; B(i,i+1)=-1; } for (i=1;i<N; i++) S(i,i+1)=-.5; DiagonalMatrix D(N+1); D = 1; B = B.t()*S.i()*B - (D-1.0/(N+1))*2.0; Clean(B, 0.000000001); Print(B); } { Tracer et1("Stage 7"); // See if you can pass a CroutMatrix to a function Matrix A(4,4); A.Row(1) << 3 << 2 << -1 << 4; A.Row(2) << -8 << 7 << 2 << 0; A.Row(3) << 2 << -2 << 3 << 1; A.Row(4) << -1 << 5 << 2 << 2; CroutMatrix B = A; Matrix C = A * Inverter(B) - IdentityMatrix(4); Clean(C, 0.000000001); Print(C); } // cout << "\nEnd of Thirteenth test\n"; }