tmt.cpp

来自「matrix library for linux and windos」· C++ 代码 · 共 432 行

CPP
432
字号
#define WANT_STREAM#include "include.h"#include "newmat.h"#include "tmt.h"#ifdef use_namespace//using namespace NEWMAT;namespace NEWMAT {#endif/**************************** test program ******************************/class PrintCounter{   int count;   const char* s;public:   ~PrintCounter();   PrintCounter(const char * sx) : count(0), s(sx) {}   void operator++() { count++; }};PrintCounter PCZ("Number of non-zero matrices (should be 1) = ");PrintCounter PCN("Number of matrices tested                 = ");PrintCounter::~PrintCounter(){ cout << s << count << "\n"; }void Print(const Matrix& 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(); int nc=X.Ncols();   for (int i=1; i<=nr; i++)   {      for (int j=1; j<=nc; j++)  cout << X(i,j) << "\t";      cout << "\n";   }   cout << flush; ++PCZ;}void Print(const UpperTriangularMatrix& 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(); int nc=X.Ncols();   for (int i=1; i<=nr; i++)   {      int j;      for (j=1; j<i; j++) cout << "\t";      for (j=i; j<=nc; j++)  cout << X(i,j) << "\t";      cout << "\n";   }   cout << flush; ++PCZ;}void Print(const DiagonalMatrix& 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(); int nc=X.Ncols();   for (int i=1; i<=nr; i++)   {      for (int j=1; j<i; j++) cout << "\t";      if (i<=nc) cout << X(i,i) << "\t";      cout << "\n";   }   cout << flush; ++PCZ;}void Print(const SymmetricMatrix& 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(); int nc=X.Ncols();   for (int i=1; i<=nr; i++)   {      int j;      for (j=1; j<i; j++) cout << X(j,i) << "\t";      for (j=i; j<=nc; j++)  cout << X(i,j) << "\t";      cout << "\n";   }   cout << flush; ++PCZ;}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;}void Clean(Matrix& A, Real c){   int nr = A.Nrows(); int nc = A.Ncols();   for (int i=1; i<=nr; i++)   {      for (int j=1; j<=nc; j++)      { Real a = A(i,j); if ((a < c) && (a > -c)) A(i,j) = 0.0; }   }}void Clean(DiagonalMatrix& A, Real c){   int nr = A.Nrows();   for (int i=1; i<=nr; i++)   { Real a = A(i,i); if ((a < c) && (a > -c)) A(i,i) = 0.0; }}void PentiumCheck(Real N, Real D){   Real R = N / D;   R = R * D - N;   if ( R > 1 || R < -1)      cout << "Pentium error detected: % error = " << 100 * R / N << "\n";}#ifdef use_namespace}using namespace NEWMAT;#endif//*************************** main program **********************************void TestTypeAdd();                            // test +void TestTypeMult();                           // test *void TestTypeConcat();                         // test |void TestTypeSP();                             // test SPvoid TestTypeKP();                             // test KPvoid TestTypeOrder();                          // test >=int main(){   Real* s1; Real* s2; Real* s3; Real* s4;   cout << "\nBegin test\n";   // Forces cout to allocate memory at beginning   cout << "Now print a real number: " << 3.14159265 << endl;   // Throw exception to set up exception buffer#ifndef DisableExceptions   Try { Throw(BaseException("Just a dummy\n")); }   CatchAll {}#else   cout << "Not doing exceptions\n";#endif   { Matrix A1(40,200); s1 = A1.Store(); }   { Matrix A1(1,1); s3 = A1.Store(); }   {      Tracer et("Matrix test program");      Matrix A(25,150);      {         int i;         RowVector A(8);         for (i=1;i<=7;i++) A(i)=0.0; A(8)=1.0;         Print(A);      }      cout << "\n";      TestTypeAdd(); TestTypeMult(); TestTypeConcat();      TestTypeSP(); TestTypeKP(); TestTypeOrder();      Try {          trymat1();         trymat2();         trymat3();         trymat4();         trymat5();         trymat6();         trymat7();         trymat8();         trymat9();         trymata();         trymatb();         trymatc();         trymatd();         trymate();         trymatf();         trymatg();         trymath();         trymati();         trymatj();         trymatk();         trymatl();         trymatm();         cout << "\nEnd of tests\n";      }      CatchAll      {         cout << "\nTest program fails - exception generated\n\n";         cout << BaseException::what();      }   }   { Matrix A1(40,200); s2 = A1.Store(); }   cout << "\n(The following memory checks are probably not valid with all\n";   cout << "compilers - see documentation)\n";   cout << "\nChecking for lost memory: "      << (unsigned long)s1 << " " << (unsigned long)s2 << " ";   if (s1 != s2) cout << " - error\n"; else cout << " - ok\n";   { Matrix A1(1,1); s4 = A1.Store(); }   cout << "\nChecking for lost memory: "      << (unsigned long)s3 << " " << (unsigned long)s4 << " ";   if (s3 != s4) cout << " - error\n\n"; else cout << " - ok\n\n";   // check for Pentium bug   PentiumCheck(4195835L,3145727L);   PentiumCheck(5244795L,3932159L);#ifdef DO_FREE_CHECK   FreeCheck::Status();#endif   return 0;}//************************ test type manipulation **************************/// These functions may cause problems for Glockenspiel 2.0c; they are used// only for testing so you can delete themvoid TestTypeAdd(){   MatrixType list[10];   list[0] = MatrixType::UT;   list[1] = MatrixType::LT;   list[2] = MatrixType::Rt;   list[3] = MatrixType::Sm;   list[4] = MatrixType::Dg;   list[5] = MatrixType::BM;   list[6] = MatrixType::UB;   list[7] = MatrixType::LB;   list[8] = MatrixType::SB;   list[9] = MatrixType::Id;   cout << "+     ";   int i;   for (i=0; i<MatrixType::nTypes(); i++) cout << list[i].Value() << " ";   cout << "\n";   for (i=0; i<MatrixType::nTypes(); i++)	{		cout << list[i].Value() << " ";      for (int j=0; j<MatrixType::nTypes(); j++)         cout << (list[j]+list[i]).Value() << " ";      cout << "\n";   }   cout << "\n";}void TestTypeMult(){   MatrixType list[10];   list[0] = MatrixType::UT;   list[1] = MatrixType::LT;   list[2] = MatrixType::Rt;   list[3] = MatrixType::Sm;   list[4] = MatrixType::Dg;   list[5] = MatrixType::BM;   list[6] = MatrixType::UB;   list[7] = MatrixType::LB;   list[8] = MatrixType::SB;   list[9] = MatrixType::Id;   cout << "*     ";   int i;   for (i=0; i<MatrixType::nTypes(); i++)      cout << list[i].Value() << " ";   cout << "\n";   for (i=0; i<MatrixType::nTypes(); i++)   {		cout << list[i].Value() << " ";      for (int j=0; j<MatrixType::nTypes(); j++)         cout << (list[j]*list[i]).Value() << " ";      cout << "\n";   }   cout << "\n";}void TestTypeConcat(){   MatrixType list[10];   list[0] = MatrixType::UT;   list[1] = MatrixType::LT;   list[2] = MatrixType::Rt;   list[3] = MatrixType::Sm;   list[4] = MatrixType::Dg;   list[5] = MatrixType::BM;   list[6] = MatrixType::UB;   list[7] = MatrixType::LB;   list[8] = MatrixType::SB;   list[9] = MatrixType::Id;   cout << "|     ";   int i;   for (i=0; i<MatrixType::nTypes(); i++)      cout << list[i].Value() << " ";   cout << "\n";   for (i=0; i<MatrixType::nTypes(); i++)   {		cout << list[i].Value() << " ";      for (int j=0; j<MatrixType::nTypes(); j++)         cout << (list[j] | list[i]).Value() << " ";      cout << "\n";   }   cout << "\n";}void TestTypeSP(){   MatrixType list[10];   list[0] = MatrixType::UT;   list[1] = MatrixType::LT;   list[2] = MatrixType::Rt;   list[3] = MatrixType::Sm;   list[4] = MatrixType::Dg;   list[5] = MatrixType::BM;   list[6] = MatrixType::UB;   list[7] = MatrixType::LB;   list[8] = MatrixType::SB;   list[9] = MatrixType::Id;   cout << "SP    ";   int i;   for (i=0; i<MatrixType::nTypes(); i++)		cout << list[i].Value() << " ";   cout << "\n";   for (i=0; i<MatrixType::nTypes(); i++)   {		cout << list[i].Value() << " ";      for (int j=0; j<MatrixType::nTypes(); j++)         cout << (list[j].SP(list[i])).Value() << " ";      cout << "\n";   }   cout << "\n";}void TestTypeKP(){   MatrixType list[10];   list[0] = MatrixType::UT;   list[1] = MatrixType::LT;   list[2] = MatrixType::Rt;   list[3] = MatrixType::Sm;   list[4] = MatrixType::Dg;   list[5] = MatrixType::BM;   list[6] = MatrixType::UB;   list[7] = MatrixType::LB;   list[8] = MatrixType::SB;   list[9] = MatrixType::Id;   cout << "KP    ";   int i;   for (i=0; i<MatrixType::nTypes(); i++)		cout << list[i].Value() << " ";   cout << "\n";   for (i=0; i<MatrixType::nTypes(); i++)   {		cout << list[i].Value() << " ";      for (int j=0; j<MatrixType::nTypes(); j++)         cout << (list[j].KP(list[i])).Value() << " ";      cout << "\n";   }   cout << "\n";}void TestTypeOrder(){   MatrixType list[10];   list[0] = MatrixType::UT;   list[1] = MatrixType::LT;   list[2] = MatrixType::Rt;   list[3] = MatrixType::Sm;   list[4] = MatrixType::Dg;   list[5] = MatrixType::BM;   list[6] = MatrixType::UB;   list[7] = MatrixType::LB;   list[8] = MatrixType::SB;   list[9] = MatrixType::Id;   cout << ">=    ";   int i;   for (i = 0; i<MatrixType::nTypes(); i++)      cout << list[i].Value() << " ";   cout << "\n";   for (i=0; i<MatrixType::nTypes(); i++)   {      cout << list[i].Value() << " ";      for (int j=0; j<MatrixType::nTypes(); j++)	 cout << ((list[j]>=list[i]) ? "Yes   " : "No    ");      cout << "\n";   }   cout << "\n";}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?