| 1 |  | 
|---|
| 2 | #define WANT_STREAM | 
|---|
| 3 |  | 
|---|
| 4 | #define WANT_MATH | 
|---|
| 5 |  | 
|---|
| 6 | #include "newmat.h" | 
|---|
| 7 |  | 
|---|
| 8 | #include "tmt.h" | 
|---|
| 9 |  | 
|---|
| 10 | #ifdef use_namespace | 
|---|
| 11 | using namespace NEWMAT; | 
|---|
| 12 | #endif | 
|---|
| 13 |  | 
|---|
| 14 |  | 
|---|
| 15 |  | 
|---|
| 16 | // test maxima and minima | 
|---|
| 17 |  | 
|---|
| 18 | Real TestMax(const GenericMatrix& GM) | 
|---|
| 19 | { | 
|---|
| 20 |    Matrix M = GM; | 
|---|
| 21 |    ColumnVector CV = GM.AsColumn(); | 
|---|
| 22 |  | 
|---|
| 23 |    int c, i, j, k; int n = CV.Nrows(), nr = M.Nrows(), nc = M.Ncols(); | 
|---|
| 24 |    Real x1, x2, x3; | 
|---|
| 25 |  | 
|---|
| 26 |    MatrixBandWidth mbw = GM.BandWidth(); | 
|---|
| 27 |    int u = mbw.Upper(); int l = mbw.Lower(); | 
|---|
| 28 |    bool IsBandMatrix = u > 0 && l > 0 && !(u == 0 && l == 0); | 
|---|
| 29 |  | 
|---|
| 30 |    x1 = GM.MaximumAbsoluteValue(); | 
|---|
| 31 |    x2 = GM.MaximumAbsoluteValue1(i); | 
|---|
| 32 |    if (fabs(CV(i)) != x2) return 1.1; | 
|---|
| 33 |    x3 = GM.MaximumAbsoluteValue2(i,j); | 
|---|
| 34 |    if (fabs(M(i,j)) != x3) return 1.2; | 
|---|
| 35 |    if (x3 != x1) return 1.3; | 
|---|
| 36 |    if (x2 != x1) return 1.4; | 
|---|
| 37 |    c = 0; | 
|---|
| 38 |    for (k = 1; k <= n; k++) | 
|---|
| 39 |    { | 
|---|
| 40 |       Real cvk = fabs(CV(k)); | 
|---|
| 41 |       if (x1 <= cvk) { if (x1 < cvk) return 1.5; else c++; } | 
|---|
| 42 |    } | 
|---|
| 43 |    if (c == 0) return 1.6; | 
|---|
| 44 |  | 
|---|
| 45 |  | 
|---|
| 46 |    x1 = GM.MinimumAbsoluteValue(); | 
|---|
| 47 |    x2 = GM.MinimumAbsoluteValue1(i); | 
|---|
| 48 |    if (fabs(CV(i)) != x2) return 2.1; | 
|---|
| 49 |    x3 = GM.MinimumAbsoluteValue2(i,j); | 
|---|
| 50 |    if (fabs(M(i,j)) != x3) return 2.2; | 
|---|
| 51 |    if (x3 != x1) return 2.3; | 
|---|
| 52 |    if (x2 != CV.MinimumAbsoluteValue()) return 2.4; | 
|---|
| 53 |    c = 0; | 
|---|
| 54 |    if (IsBandMatrix) | 
|---|
| 55 |    { | 
|---|
| 56 |       for (i = 1; i <= nr; i++) for (j = 1; j <= nc; j++) | 
|---|
| 57 |          if (i - j <= l && j - i <= u) | 
|---|
| 58 |       { | 
|---|
| 59 |          Real mij = fabs(M(i,j)); | 
|---|
| 60 |          if (x1 >= mij) { if (x1 > mij) return 2.51; else c++; } | 
|---|
| 61 |       } | 
|---|
| 62 |    } | 
|---|
| 63 |    else | 
|---|
| 64 |    { | 
|---|
| 65 |       for (k = 1; k <= n; k++) | 
|---|
| 66 |       { | 
|---|
| 67 |          Real cvk = fabs(CV(k)); | 
|---|
| 68 |          if (x1 >= cvk) { if (x1 > cvk) return 2.52; else c++; } | 
|---|
| 69 |       } | 
|---|
| 70 |    } | 
|---|
| 71 |    if (c == 0) return 2.6; | 
|---|
| 72 |  | 
|---|
| 73 |    x1 = GM.Maximum(); | 
|---|
| 74 |    x2 = GM.Maximum1(i); | 
|---|
| 75 |    if (CV(i) != x2) return 3.1; | 
|---|
| 76 |    x3 = GM.Maximum2(i,j); | 
|---|
| 77 |    if (M(i,j) != x3) return 3.2; | 
|---|
| 78 |    if (x3 != x1) return 3.3; | 
|---|
| 79 |    if (x2 != CV.Maximum()) return 3.4; | 
|---|
| 80 |    c = 0; | 
|---|
| 81 |    if (IsBandMatrix) | 
|---|
| 82 |    { | 
|---|
| 83 |       for (i = 1; i <= nr; i++) for (j = 1; j <= nc; j++) | 
|---|
| 84 |          if (i - j <= l && j - i <= u) | 
|---|
| 85 |       { | 
|---|
| 86 |          Real mij = M(i,j); | 
|---|
| 87 |          if (x1 <= mij) { if (x1 < mij) return 3.51; else c++; } | 
|---|
| 88 |       } | 
|---|
| 89 |    } | 
|---|
| 90 |    else | 
|---|
| 91 |    { | 
|---|
| 92 |       for (k = 1; k <= n; k++) | 
|---|
| 93 |       { | 
|---|
| 94 |          Real cvk = CV(k); | 
|---|
| 95 |          if (x1 <= cvk) { if (x1 < cvk) return 3.52; else c++; } | 
|---|
| 96 |       } | 
|---|
| 97 |    } | 
|---|
| 98 |    if (c == 0) return 3.6; | 
|---|
| 99 |  | 
|---|
| 100 |    x1 = GM.Minimum(); | 
|---|
| 101 |    x2 = GM.Minimum1(i); | 
|---|
| 102 |    if (CV(i) != x2) return 4.1; | 
|---|
| 103 |    x3 = GM.Minimum2(i,j); | 
|---|
| 104 |    if (M(i,j) != x3) return 4.2; | 
|---|
| 105 |    if (x3 != x1) return 4.3; | 
|---|
| 106 |    if (x2 != CV.Minimum()) return 4.4; | 
|---|
| 107 |    c = 0; | 
|---|
| 108 |    if (IsBandMatrix) | 
|---|
| 109 |    { | 
|---|
| 110 |       for (i = 1; i <= nr; i++) for (j = 1; j <= nc; j++) | 
|---|
| 111 |          if (i - j <= l && j - i <= u) | 
|---|
| 112 |       { | 
|---|
| 113 |          Real mij = M(i,j); | 
|---|
| 114 |          if (x1 >= mij) { if (x1 > mij) return 4.51; else c++; } | 
|---|
| 115 |       } | 
|---|
| 116 |    } | 
|---|
| 117 |    else | 
|---|
| 118 |    { | 
|---|
| 119 |       for (k = 1; k <= n; k++) | 
|---|
| 120 |       { | 
|---|
| 121 |          Real cvk = CV(k); | 
|---|
| 122 |          if (x1 >= cvk) { if (x1 > cvk) return 4.52; else c++; } | 
|---|
| 123 |       } | 
|---|
| 124 |    } | 
|---|
| 125 |    if (c == 0) return 4.6; | 
|---|
| 126 |  | 
|---|
| 127 |    return 0; | 
|---|
| 128 |  | 
|---|
| 129 | } | 
|---|
| 130 |  | 
|---|
| 131 |  | 
|---|
| 132 | void trymatl() | 
|---|
| 133 | { | 
|---|
| 134 |    Tracer et("Twenty first test of Matrix package"); | 
|---|
| 135 |    Tracer::PrintTrace(); | 
|---|
| 136 |  | 
|---|
| 137 |    Matrix M(4, 4); | 
|---|
| 138 |    M <<  1.5 <<  1.0 << -4.0 <<  4.5 | 
|---|
| 139 |      <<  3.5 <<  7.0 <<  2.0 << -1.0 | 
|---|
| 140 |      << -1.5 <<  7.5 << -6.0 <<  5.0 | 
|---|
| 141 |      <<  0.5 << -8.0 <<  5.5 <<  4.0; | 
|---|
| 142 |    UpperTriangularMatrix UM;  UM << M; | 
|---|
| 143 |    LowerTriangularMatrix LM;  LM << -M; | 
|---|
| 144 |    SymmetricMatrix SM; SM << (UM + UM.t()); | 
|---|
| 145 |    BandMatrix BM(4, 1, 2);  BM.Inject(M); | 
|---|
| 146 |    DiagonalMatrix DM; DM << M; | 
|---|
| 147 |    SymmetricBandMatrix SBM(4,1); SBM.Inject(M); | 
|---|
| 148 |    RowVector Test(28); int k = 0; | 
|---|
| 149 |  | 
|---|
| 150 |    // tests for different shapes | 
|---|
| 151 |    Test(++k) = TestMax(GenericMatrix(M)); | 
|---|
| 152 |    Test(++k) = TestMax(GenericMatrix(UM)); | 
|---|
| 153 |    Test(++k) = TestMax(GenericMatrix(LM)); | 
|---|
| 154 |    Test(++k) = TestMax(GenericMatrix(SM)); | 
|---|
| 155 |    Test(++k) = TestMax(GenericMatrix(DM)); | 
|---|
| 156 |    Test(++k) = TestMax(GenericMatrix(BM)); | 
|---|
| 157 |    Test(++k) = TestMax(GenericMatrix(SBM)); | 
|---|
| 158 |  | 
|---|
| 159 |    // tests for constant matrices - don't put non-zeros in corners of BM | 
|---|
| 160 |    Matrix MX(4,4); | 
|---|
| 161 |    MX = 1; Test(++k) = TestMax(GenericMatrix(MX)); | 
|---|
| 162 |    BM.Inject(MX); Test(++k) = TestMax(GenericMatrix(BM)); | 
|---|
| 163 |    MX = 0; Test(++k) = TestMax(GenericMatrix(MX)); | 
|---|
| 164 |    BM.Inject(MX); Test(++k) = TestMax(GenericMatrix(BM)); | 
|---|
| 165 |    MX = -1; Test(++k) = TestMax(GenericMatrix(MX)); | 
|---|
| 166 |    BM.Inject(MX); Test(++k) = TestMax(GenericMatrix(BM)); | 
|---|
| 167 |  | 
|---|
| 168 |    // test for non-square | 
|---|
| 169 |    MX = M | (2 * M).t(); Test(++k) = TestMax(GenericMatrix(MX)); | 
|---|
| 170 |  | 
|---|
| 171 |    // test on row and column vector | 
|---|
| 172 |    RowVector RV(6); | 
|---|
| 173 |    RV << 1 << 3 << -5 << 2 << -4 << 3; | 
|---|
| 174 |    Test(++k) = TestMax(GenericMatrix(RV)); | 
|---|
| 175 |    Test(++k) = TestMax(GenericMatrix(RV.t())); | 
|---|
| 176 |  | 
|---|
| 177 |    // test for function form | 
|---|
| 178 |    Test(++k) = (MaximumAbsoluteValue(RV) - 5); | 
|---|
| 179 |    Test(++k) = (MinimumAbsoluteValue(RV) - 1); | 
|---|
| 180 |    Test(++k) = (Maximum(RV) - 3); | 
|---|
| 181 |    Test(++k) = (Minimum(RV) + 5); | 
|---|
| 182 |    Test(++k) = (MaximumAbsoluteValue(-RV) - 5); | 
|---|
| 183 |    Test(++k) = (MinimumAbsoluteValue(-RV) - 1); | 
|---|
| 184 |    Test(++k) = (Maximum(-RV) - 5); | 
|---|
| 185 |    Test(++k) = (Minimum(-RV) + 3); | 
|---|
| 186 |  | 
|---|
| 187 |    // test formulae | 
|---|
| 188 |    RowVector RV2(6); | 
|---|
| 189 |    RV2 << 2 << 8 << 1 << 9 << 3 << -1; | 
|---|
| 190 |    Test(++k) = (MaximumAbsoluteValue(RV+RV2) - 11); | 
|---|
| 191 |    Test(++k) = (MinimumAbsoluteValue(RV+RV2) - 1); | 
|---|
| 192 |    Test(++k) = (Maximum(RV+RV2) - 11); | 
|---|
| 193 |    Test(++k) = (Minimum(RV+RV2) + 4); | 
|---|
| 194 |  | 
|---|
| 195 |  | 
|---|
| 196 |    Print(Test); | 
|---|
| 197 | } | 
|---|
| 198 |  | 
|---|