⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tmth.cpp

📁 C++矩阵算法库
💻 CPP
📖 第 1 页 / 共 2 页
字号:

//#define WANT_STREAM

#include "include.h"

#include "newmatap.h"
//#include "newmatio.h"

#include "tmt.h"

#ifdef use_namespace
using namespace NEWMAT;
#endif

static int my_max(int p, int q) { return (p > q) ? p : q; }

static int my_min(int p, int q) { return (p < q) ? p : q; }


void BandFunctions(int l1, int u1, int l2, int u2)
{
   int i, j;
   BandMatrix BM1(20, l1, u1); BM1 = 999999.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= 20; ++j)
      if (i - j <= l1 && i - j >= -u1) BM1(i, j) = 100 * i + j;

   BandMatrix BM2 = BM1; Matrix M = BM2 - BM1; Print(M);

   BM2.ReSize(20, l2, u2); BM2 = 777777.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= 20; ++j)
      if (i - j <= l2 && i - j >= -u2) BM2(i, j) = (100 * i + j) * 11;

   BandMatrix BMA = BM1 + BM2, BMS = BM1 - BM2, BMSP = SP(BM1, BM2),
      BMM = BM1 * BM2, BMN = -BM1;

   Matrix M1(20,20); M1 = 0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= 20; ++j)
      if (i - j <= l1 && i - j >= -u1) M1(i, j) = 100 * i + j;

   Matrix M2(20,20); M2 = 0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= 20; ++j)
      if (i - j <= l2 && i - j >= -u2) M2(i, j) = (100 * i + j) * 11;

   Matrix MA = M1 + M2, MS = M1 - M2, MSP = SP(M1, M2), MM = M1 * M2, MN = -M1;
   MA -= BMA; MS -= BMS; MSP -= BMSP; MM -= BMM; MN -= BMN;
   Print(MA); Print(MS); Print(MSP); Print(MM); Print(MN);

   Matrix Test(7, 2);
   Test(1,1) = BM1.BandWidth().Lower() - l1;
   Test(1,2) = BM1.BandWidth().Upper() - u1;
   Test(2,1) = BM2.BandWidth().Lower() - l2;
   Test(2,2) = BM2.BandWidth().Upper() - u2;
   Test(3,1) = BMA.BandWidth().Lower() - my_max(l1,l2);
   Test(3,2) = BMA.BandWidth().Upper() - my_max(u1,u2);
   Test(4,1) = BMS.BandWidth().Lower() - my_max(l1,l2);
   Test(4,2) = BMS.BandWidth().Upper() - my_max(u1,u2);
   Test(5,1) = BMSP.BandWidth().Lower() - my_min(l1,l2);
   Test(5,2) = BMSP.BandWidth().Upper() - my_min(u1,u2);
   Test(6,1) = BMM.BandWidth().Lower() - (l1 + l2);
   Test(6,2) = BMM.BandWidth().Upper() - (u1 + u2);
   Test(7,1) = BMN.BandWidth().Lower() - l1;
   Test(7,2) = BMN.BandWidth().Upper() - u1;
   Print(Test);

   // test element function
   BandMatrix BM1E(20, l1, u1); BM1E = 999999.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= 20; ++j)
      if (i - j <= l1 && i - j >= -u1) BM1E.element(i-1, j-1) = 100 * i + j;
   BandMatrix BM2E = BM1E; BM2E.ReSize(BM2); BM2E = 777777.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= 20; ++j)
      if (i - j <= l2 && i - j >= -u2)
         BM2E.element(i-1, j-1) = (100 * i + j) * 11;
   M1 = BM1E - BM1; Print(M1);
   M2 = BM2E - BM2; Print(M2);

   // test element function with constant
   BM1E = 444444.04; BM2E = 555555.0;
   const BandMatrix BM1C = BM1, BM2C = BM2;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= 20; ++j)
      if (i - j <= l1 && i - j >= -u1)
         BM1E.element(i-1, j-1) = BM1C.element(i-1, j-1);
   for (i = 1; i <= 20; ++i) for (j = 1; j <= 20; ++j)
      if (i - j <= l2 && i - j >= -u2)
         BM2E.element(i-1, j-1) = BM2C.element(i-1, j-1);
   M1 = BM1E - BM1; Print(M1);
   M2 = BM2E - BM2; Print(M2);

   // test subscript function with constant
   BM1E = 444444.04; BM2E = 555555.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= 20; ++j)
      if (i - j <= l1 && i - j >= -u1) BM1E(i, j) = BM1C(i, j);
   for (i = 1; i <= 20; ++i) for (j = 1; j <= 20; ++j)
      if (i - j <= l2 && i - j >= -u2) BM2E(i, j) = BM2C(i, j);
   M1 = BM1E - BM1; Print(M1);
   M2 = BM2E - BM2; Print(M2);
}

void LowerBandFunctions(int l1, int l2)
{
   int i, j;
   LowerBandMatrix BM1(20, l1); BM1 = 999999.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l1) BM1(i, j) = 100 * i + j;

   LowerBandMatrix BM2 = BM1; Matrix M = BM2 - BM1; Print(M);

   BM2.ReSize(20, l2); BM2 = 777777.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l2) BM2(i, j) = (100 * i + j) * 11;

   LowerBandMatrix BMA = BM1 + BM2, BMS = BM1 - BM2, BMSP = SP(BM1, BM2),
      BMM = BM1 * BM2, BMN = -BM1;

   Matrix M1(20,20); M1 = 0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l1) M1(i, j) = 100 * i + j;

   Matrix M2(20,20); M2 = 0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l2) M2(i, j) = (100 * i + j) * 11;

   Matrix MA = M1 + M2, MS = M1 - M2, MSP = SP(M1, M2), MM = M1 * M2, MN = -M1;
   MA -= BMA; MS -= BMS; MSP -= BMSP; MM -= BMM; MN -= BMN;
   Print(MA); Print(MS); Print(MSP); Print(MM); Print(MN);

   Matrix Test(7, 2);
   Test(1,1) = BM1.BandWidth().Lower() - l1;
   Test(1,2) = BM1.BandWidth().Upper();
   Test(2,1) = BM2.BandWidth().Lower() - l2;
   Test(2,2) = BM2.BandWidth().Upper();
   Test(3,1) = BMA.BandWidth().Lower() - my_max(l1,l2);
   Test(3,2) = BMA.BandWidth().Upper();
   Test(4,1) = BMS.BandWidth().Lower() - my_max(l1,l2);
   Test(4,2) = BMS.BandWidth().Upper();
   Test(5,1) = BMSP.BandWidth().Lower() - my_min(l1,l2);
   Test(5,2) = BMSP.BandWidth().Upper();
   Test(6,1) = BMM.BandWidth().Lower() - (l1 + l2);
   Test(6,2) = BMM.BandWidth().Upper();
   Test(7,1) = BMN.BandWidth().Lower() - l1;
   Test(7,2) = BMN.BandWidth().Upper();
   Print(Test);

   // test element function
   LowerBandMatrix BM1E(20, l1); BM1E = 999999.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l1) BM1E.element(i-1, j-1) = 100 * i + j;
   LowerBandMatrix BM2E = BM1E; BM2E.ReSize(BM2); BM2E = 777777.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l2) BM2E.element(i-1, j-1) = (100 * i + j) * 11;
   M1 = BM1E - BM1; Print(M1);
   M2 = BM2E - BM2; Print(M2);

   // test element function with constant
   BM1E = 444444.04; BM2E = 555555.0;
   const LowerBandMatrix BM1C = BM1, BM2C = BM2;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l1) BM1E.element(i-1, j-1) = BM1C.element(i-1, j-1);
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l2) BM2E.element(i-1, j-1) = BM2C.element(i-1, j-1);
   M1 = BM1E - BM1; Print(M1);
   M2 = BM2E - BM2; Print(M2);

   // test subscript function with constant
   BM1E = 444444.04; BM2E = 555555.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l1) BM1E(i, j) = BM1C(i, j);
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l2) BM2E(i, j) = BM2C(i, j);
   M1 = BM1E - BM1; Print(M1);
   M2 = BM2E - BM2; Print(M2);
}

void UpperBandFunctions(int u1, int u2)
{
   int i, j;
   UpperBandMatrix BM1(20, u1); BM1 = 999999.0;
   for (i = 1; i <= 20; ++i) for (j = i; j <= 20; ++j)
      if (i - j >= -u1) BM1(i, j) = 100 * i + j;

   UpperBandMatrix BM2 = BM1; Matrix M = BM2 - BM1; Print(M);

   BM2.ReSize(20, u2); BM2 = 777777.0;
   for (i = 1; i <= 20; ++i) for (j = i; j <= 20; ++j)
      if (i - j >= -u2) BM2(i, j) = (100 * i + j) * 11;

   UpperBandMatrix BMA = BM1 + BM2, BMS = BM1 - BM2, BMSP = SP(BM1, BM2),
      BMM = BM1 * BM2, BMN = -BM1;

   Matrix M1(20,20); M1 = 0;
   for (i = 1; i <= 20; ++i) for (j = i; j <= 20; ++j)
      if (i - j >= -u1) M1(i, j) = 100 * i + j;

   Matrix M2(20,20); M2 = 0;
   for (i = 1; i <= 20; ++i) for (j = i; j <= 20; ++j)
      if (i - j >= -u2) M2(i, j) = (100 * i + j) * 11;

   Matrix MA = M1 + M2, MS = M1 - M2, MSP = SP(M1, M2), MM = M1 * M2, MN = -M1;
   MA -= BMA; MS -= BMS; MSP -= BMSP; MM -= BMM; MN -= BMN;
   Print(MA); Print(MS); Print(MSP); Print(MM); Print(MN);

   Matrix Test(7, 2);
   Test(1,1) = BM1.BandWidth().Lower();
   Test(1,2) = BM1.BandWidth().Upper() - u1;
   Test(2,1) = BM2.BandWidth().Lower();
   Test(2,2) = BM2.BandWidth().Upper() - u2;
   Test(3,1) = BMA.BandWidth().Lower();
   Test(3,2) = BMA.BandWidth().Upper() - my_max(u1,u2);
   Test(4,1) = BMS.BandWidth().Lower();
   Test(4,2) = BMS.BandWidth().Upper() - my_max(u1,u2);
   Test(5,1) = BMSP.BandWidth().Lower();
   Test(5,2) = BMSP.BandWidth().Upper() - my_min(u1,u2);
   Test(6,1) = BMM.BandWidth().Lower();
   Test(6,2) = BMM.BandWidth().Upper() - (u1 + u2);
   Test(7,1) = BMN.BandWidth().Lower();
   Test(7,2) = BMN.BandWidth().Upper() - u1;
   Print(Test);

   // test element function
   UpperBandMatrix BM1E(20, u1); BM1E = 999999.0;
   for (i = 1; i <= 20; ++i) for (j = i; j <= 20; ++j)
      if (i - j >= -u1) BM1E.element(i-1, j-1) = 100 * i + j;
   UpperBandMatrix BM2E = BM1E; BM2E.ReSize(BM2); BM2E = 777777.0;
   for (i = 1; i <= 20; ++i) for (j = i; j <= 20; ++j)
      if (i - j >= -u2) BM2E.element(i-1, j-1) = (100 * i + j) * 11;
   M1 = BM1E - BM1; Print(M1);
   M2 = BM2E - BM2; Print(M2);

   // test element function with constant
   BM1E = 444444.04; BM2E = 555555.0;
   const UpperBandMatrix BM1C = BM1, BM2C = BM2;
   for (i = 1; i <= 20; ++i) for (j = i; j <= 20; ++j)
      if (i - j >= -u1) BM1E.element(i-1, j-1) = BM1C.element(i-1, j-1);
   for (i = 1; i <= 20; ++i) for (j = i; j <= 20; ++j)
      if (i - j >= -u2) BM2E.element(i-1, j-1) = BM2C.element(i-1, j-1);
   M1 = BM1E - BM1; Print(M1);
   M2 = BM2E - BM2; Print(M2);

   // test subscript function with constant
   BM1E = 444444.04; BM2E = 555555.0;
   for (i = 1; i <= 20; ++i) for (j = i; j <= 20; ++j)
      if (i - j >= -u1) BM1E(i, j) = BM1C(i, j);
   for (i = 1; i <= 20; ++i) for (j = i; j <= 20; ++j)
      if (i - j >= -u2) BM2E(i, j) = BM2C(i, j);
   M1 = BM1E - BM1; Print(M1);
   M2 = BM2E - BM2; Print(M2);
}

void SymmetricBandFunctions(int l1, int l2)
{
   int i, j;
   SymmetricBandMatrix BM1(20, l1); BM1 = 999999.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l1) BM1(i, j) = 100 * i + j;

   SymmetricBandMatrix BM2 = BM1; Matrix M = BM2 - BM1; Print(M);

   BM2.ReSize(20, l2); BM2 = 777777.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l2) BM2(i, j) = (100 * i + j) * 11;

   SymmetricBandMatrix BMA = BM1 + BM2, BMS = BM1 - BM2, BMSP = SP(BM1, BM2),
      BMN = -BM1;
   BandMatrix BMM = BM1 * BM2;

   SymmetricMatrix M1(20); M1 = 0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l1) M1(i, j) = 100 * i + j;

   SymmetricMatrix M2(20); M2 = 0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l2) M2(i, j) = (100 * i + j) * 11;

   SymmetricMatrix MA = M1 + M2, MS = M1 - M2, MSP = SP(M1, M2), MN = -M1;
   Matrix MM = M1 * M2;
   MA -= BMA; MS -= BMS; MSP -= BMSP; MM -= BMM; MN -= BMN;
   Print(MA); Print(MS); Print(MSP); Print(MM); Print(MN);

   Matrix Test(7, 2);
   Test(1,1) = BM1.BandWidth().Lower() - l1;
   Test(1,2) = BM1.BandWidth().Upper() - l1;
   Test(2,1) = BM2.BandWidth().Lower() - l2;
   Test(2,2) = BM2.BandWidth().Upper() - l2;
   Test(3,1) = BMA.BandWidth().Lower() - my_max(l1,l2);
   Test(3,2) = BMA.BandWidth().Upper() - my_max(l1,l2);
   Test(4,1) = BMS.BandWidth().Lower() - my_max(l1,l2);
   Test(4,2) = BMS.BandWidth().Upper() - my_max(l1,l2);
   Test(5,1) = BMSP.BandWidth().Lower() - my_min(l1,l2);
   Test(5,2) = BMSP.BandWidth().Upper() - my_min(l1,l2);
   Test(6,1) = BMM.BandWidth().Lower() - (l1 + l2);
   Test(6,2) = BMM.BandWidth().Upper() - (l1 + l2);
   Test(7,1) = BMN.BandWidth().Lower() - l1;
   Test(7,2) = BMN.BandWidth().Upper() - l1;
   Print(Test);

   // test element function
   SymmetricBandMatrix BM1E(20, l1); BM1E = 999999.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l1) BM1E.element(i-1, j-1) = 100 * i + j;
   SymmetricBandMatrix BM2E = BM1E; BM2E.ReSize(BM2); BM2E = 777777.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l2) BM2E.element(i-1, j-1) = (100 * i + j) * 11;
   M1 = BM1E - BM1; Print(M1);
   M2 = BM2E - BM2; Print(M2);

   // reverse subscripts
   BM1E = 999999.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l1) BM1E.element(j-1, i-1) = 100 * i + j;
   BM2E = 777777.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l2) BM2E.element(j-1, i-1) = (100 * i + j) * 11;
   M1 = BM1E - BM1; Print(M1);
   M2 = BM2E - BM2; Print(M2);

   // test element function with constant
   BM1E = 444444.04; BM2E = 555555.0;
   const SymmetricBandMatrix BM1C = BM1, BM2C = BM2;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l1) BM1E.element(i-1, j-1) = BM1C.element(i-1, j-1);
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l2) BM2E.element(i-1, j-1) = BM2C.element(i-1, j-1);
   M1 = BM1E - BM1; Print(M1);
   M2 = BM2E - BM2; Print(M2);

   // reverse subscripts
   BM1E = 444444.0; BM2E = 555555.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l1) BM1E.element(j-1, i-1) = BM1C.element(j-1, i-1);
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l2) BM2E.element(j-1, i-1) = BM2C.element(j-1, i-1);
   M1 = BM1E - BM1; Print(M1);
   M2 = BM2E - BM2; Print(M2);

   // test subscript function with constant
   BM1E = 444444.0; BM2E = 555555.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l1) BM1E(i, j) = BM1C(i, j);
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l2) BM2E(i, j) = BM2C(i, j);
   M1 = BM1E - BM1; Print(M1);
   M2 = BM2E - BM2; Print(M2);

   // reverse subscripts
   BM1E = 444444.0; BM2E = 555555.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l1) BM1E(j, i) = BM1C(j, i);
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l2) BM2E(j, i) = BM2C(j, i);
   M1 = BM1E - BM1; Print(M1);
   M2 = BM2E - BM2; Print(M2);

   // partly reverse subscripts
   BM1E = 444444.0; BM2E = 555555.0;
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l1) BM1E(j, i) = BM1C(i, j);
   for (i = 1; i <= 20; ++i) for (j = 1; j <= i; ++j)
      if (i - j <= l2) BM2E(j, i) = BM2C(i, j);
   M1 = BM1E - BM1; Print(M1);
   M2 = BM2E - BM2; Print(M2);

}



void trymath()
{
//   cout << "\nSeventeenth test of Matrix package\n";
//   cout << "\n";
   Tracer et("Seventeenth test of Matrix package");
   Tracer::PrintTrace();


   {
      Tracer et1("Stage 1");
      int i, j;
      BandMatrix B(8,3,1);
      for (i=1; i<=8; i++) for (j=-3; j<=1; j++)
         { int k = i+j; if (k>0 && k<=8) B(i,k) = i + k/64.0; }

      IdentityMatrix I(8); BandMatrix B1; B1 = I;
      UpperTriangularMatrix UT = I; Print(Matrix(B1-UT));
      Print(Matrix(B * B - B * 2 + I - (B - I) * (B - I)));
      Matrix A = B; BandMatrix C; C = B;
      Print(Matrix(B * A - C * 2 + I - (A - I) * (B - I)));

      C.ReSize(8,2,2); C = 0.0; C.Inject(B);
      Matrix X = A.t();
      B1.ReSize(8,2,2); B1.Inject(X); Print(Matrix(C.t()-B1));

      Matrix BI = B.i(); A = A.i()-BI; Clean(A,0.000000001); Print(A);
      BandLUMatrix BLU = B.t();
      BI = BLU.i(); A = X.i()-BI; Clean(A,0.000000001); Print(A);
      X.ReSize(1,1);

⌨️ 快捷键说明

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