$search
00001 00002 00003 00006 00007 00008 //#define WANT_STREAM 00009 00010 00011 #include "include.h" 00012 #include "newmatap.h" 00013 00014 #include "tmt.h" 00015 00016 #ifdef use_namespace 00017 using namespace NEWMAT; 00018 #endif 00019 00020 00021 00022 00023 void trymatc() 00024 { 00025 // cout << "\nTwelfth test of Matrix package\n"; 00026 Tracer et("Twelfth test of Matrix package"); 00027 Tracer::PrintTrace(); 00028 DiagonalMatrix D(15); D=1.5; 00029 Matrix A(15,15); 00030 int i,j; 00031 for (i=1;i<=15;i++) for (j=1;j<=15;j++) A(i,j)=i*i+j-150; 00032 { A = A + D; } 00033 ColumnVector B(15); 00034 for (i=1;i<=15;i++) B(i)=i+i*i-150.0; 00035 { 00036 Tracer et1("Stage 1"); 00037 ColumnVector B1=B; 00038 B=(A*2.0).i() * B1; 00039 Matrix X = A*B-B1/2.0; 00040 Clean(X, 0.000000001); Print(X); 00041 A.ReSize(3,5); 00042 for (i=1; i<=3; i++) for (j=1; j<=5; j++) A(i,j) = i+100*j; 00043 00044 B = A.AsColumn()+10000; 00045 RowVector R = (A+10000).AsColumn().t(); 00046 Print( RowVector(R-B.t()) ); 00047 } 00048 00049 { 00050 Tracer et1("Stage 2"); 00051 B = A.AsColumn()+10000; 00052 Matrix XR = (A+10000).AsMatrix(15,1).t(); 00053 Print( RowVector(XR-B.t()) ); 00054 } 00055 00056 { 00057 Tracer et1("Stage 3"); 00058 B = (A.AsMatrix(15,1)+A.AsColumn())/2.0+10000; 00059 Matrix MR = (A+10000).AsColumn().t(); 00060 Print( RowVector(MR-B.t()) ); 00061 00062 B = (A.AsMatrix(15,1)+A.AsColumn())/2.0; 00063 MR = A.AsColumn().t(); 00064 Print( RowVector(MR-B.t()) ); 00065 } 00066 00067 { 00068 Tracer et1("Stage 4"); 00069 B = (A.AsMatrix(15,1)+A.AsColumn())/2.0; 00070 RowVector R = A.AsColumn().t(); 00071 Print( RowVector(R-B.t()) ); 00072 } 00073 00074 { 00075 Tracer et1("Stage 5"); 00076 RowVector R = (A.AsColumn()-5000).t(); 00077 B = ((R.t()+10000) - A.AsColumn())-5000; 00078 Print( RowVector(B.t()) ); 00079 } 00080 00081 { 00082 Tracer et1("Stage 6"); 00083 B = A.AsColumn(); ColumnVector B1 = (A+10000).AsColumn() - 10000; 00084 Print(ColumnVector(B1-B)); 00085 } 00086 00087 { 00088 Tracer et1("Stage 7"); 00089 Matrix X = B.AsMatrix(3,5); Print(Matrix(X-A)); 00090 for (i=1; i<=3; i++) for (j=1; j<=5; j++) B(5*(i-1)+j) -= i+100*j; 00091 Print(B); 00092 } 00093 00094 { 00095 Tracer et1("Stage 8"); 00096 A.ReSize(7,7); D.ReSize(7); 00097 for (i=1; i<=7; i++) for (j=1; j<=7; j++) A(i,j) = i*j*j; 00098 for (i=1; i<=7; i++) D(i,i) = i; 00099 UpperTriangularMatrix U; U << A; 00100 Matrix X = A; for (i=1; i<=7; i++) X(i,i) = i; 00101 A.Inject(D); Print(Matrix(X-A)); 00102 X = U; U.Inject(D); A = U; for (i=1; i<=7; i++) X(i,i) = i; 00103 Print(Matrix(X-A)); 00104 } 00105 00106 { 00107 Tracer et1("Stage 9"); 00108 A.ReSize(7,5); 00109 for (i=1; i<=7; i++) for (j=1; j<=5; j++) A(i,j) = i+100*j; 00110 Matrix Y = A; Y = Y - ((const Matrix&)A); Print(Y); 00111 Matrix X = A; 00112 Y = A; Y = ((const Matrix&)X) - A; Print(Y); Y = 0.0; 00113 Y = ((const Matrix&)X) - ((const Matrix&)A); Print(Y); 00114 } 00115 00116 { 00117 Tracer et1("Stage 10"); 00118 // some tests on submatrices 00119 UpperTriangularMatrix U(20); 00120 for (i=1; i<=20; i++) for (j=i; j<=20; j++) U(i,j)=100 * i + j; 00121 UpperTriangularMatrix V = U.SymSubMatrix(1,5); 00122 UpperTriangularMatrix U1 = U; 00123 U1.SubMatrix(4,8,5,9) /= 2; 00124 U1.SubMatrix(4,8,5,9) += 388 * V; 00125 U1.SubMatrix(4,8,5,9) *= 2; 00126 U1.SubMatrix(4,8,5,9) += V; 00127 U1 -= U; UpperTriangularMatrix U2 = U1; 00128 U1 << U1.SubMatrix(4,8,5,9); 00129 U2.SubMatrix(4,8,5,9) -= U1; Print(U2); 00130 U1 -= (777*V); Print(U1); 00131 00132 U1 = U; U1.SubMatrix(4,8,5,9) -= U.SymSubMatrix(1,5); 00133 U1 -= U; U2 = U1; U1 << U1.SubMatrix(4,8,5,9); 00134 U2.SubMatrix(4,8,5,9) -= U1; Print(U2); 00135 U1 += V; Print(U1); 00136 00137 U1 = U; 00138 U1.SubMatrix(3,10,15,19) += 29; 00139 U1 -= U; 00140 Matrix X = U1.SubMatrix(3,10,15,19); X -= 29; Print(X); 00141 U1.SubMatrix(3,10,15,19) *= 0; Print(U1); 00142 00143 LowerTriangularMatrix L = U.t(); 00144 LowerTriangularMatrix M = L.SymSubMatrix(1,5); 00145 LowerTriangularMatrix L1 = L; 00146 L1.SubMatrix(5,9,4,8) /= 2; 00147 L1.SubMatrix(5,9,4,8) += 388 * M; 00148 L1.SubMatrix(5,9,4,8) *= 2; 00149 L1.SubMatrix(5,9,4,8) += M; 00150 L1 -= L; LowerTriangularMatrix L2 = L1; 00151 L1 << L1.SubMatrix(5,9,4,8); 00152 L2.SubMatrix(5,9,4,8) -= L1; Print(L2); 00153 L1 -= (777*M); Print(L1); 00154 00155 L1 = L; L1.SubMatrix(5,9,4,8) -= L.SymSubMatrix(1,5); 00156 L1 -= L; L2 =L1; L1 << L1.SubMatrix(5,9,4,8); 00157 L2.SubMatrix(5,9,4,8) -= L1; Print(L2); 00158 L1 += M; Print(L1); 00159 00160 L1 = L; 00161 L1.SubMatrix(15,19,3,10) -= 29; 00162 L1 -= L; 00163 X = L1.SubMatrix(15,19,3,10); X += 29; Print(X); 00164 L1.SubMatrix(15,19,3,10) *= 0; Print(L1); 00165 } 00166 00167 { 00168 Tracer et1("Stage 11"); 00169 // more tests on submatrices 00170 Matrix M(20,30); 00171 for (i=1; i<=20; i++) for (j=1; j<=30; j++) M(i,j)=100 * i + j; 00172 Matrix M1 = M; 00173 00174 for (j=1; j<=30; j++) 00175 { ColumnVector CV = 3 * M1.Column(j); M.Column(j) += CV; } 00176 for (i=1; i<=20; i++) 00177 { RowVector RV = 5 * M1.Row(i); M.Row(i) -= RV; } 00178 00179 M += M1; Print(M); 00180 00181 } 00182 00183 { 00184 Tracer et1("Stage 12"); 00185 // more tests on Release 00186 Matrix M(20,30); 00187 for (i=1; i<=20; i++) for (j=1; j<=30; j++) M(i,j)=100 * i + j; 00188 Matrix M1 = M; 00189 M.Release(); 00190 Matrix M2 = M; 00191 Matrix X = M; Print(X); 00192 X = M1 - M2; Print(X); 00193 00194 #ifndef DONT_DO_NRIC 00195 nricMatrix N = M1; 00196 nricMatrix N1 = N; 00197 N.Release(); 00198 nricMatrix N2 = N; 00199 nricMatrix Y = N; Print(Y); 00200 Y = N1 - N2; Print(Y); 00201 00202 N = M1 / 2; N1 = N * 2; N.Release(); N2 = N * 2; Y = N; Print(N); 00203 Y = (N1 - M1) | (N2 - M1); Print(Y); 00204 #endif 00205 00206 } 00207 00208 { 00209 Tracer et("Stage 13"); 00210 // test sum of squares of rows or columns 00211 MultWithCarry mwc; 00212 DiagonalMatrix DM; Matrix X; 00213 // rectangular matrix 00214 Matrix A(20, 15); 00215 FillWithValues(mwc, A); 00216 // sum of squares of rows 00217 DM << A * A.t(); 00218 ColumnVector CV = A.sum_square_rows(); 00219 X = CV - DM.AsColumn(); Clean(X, 0.000000001); Print(X); 00220 DM << A.t() * A; 00221 RowVector RV = A.sum_square_columns(); 00222 X = RV - DM.AsRow(); Clean(X, 0.000000001); Print(X); 00223 X = RV - A.t().sum_square_rows().t(); Clean(X, 0.000000001); Print(X); 00224 X = CV - A.t().sum_square_columns().t(); Clean(X, 0.000000001); Print(X); 00225 // UpperTriangularMatrix 00226 A.ReSize(17,17); FillWithValues(mwc, A); 00227 UpperTriangularMatrix UT; UT << A; 00228 Matrix A1 = UT; 00229 X = UT.sum_square_rows() - A1.sum_square_rows(); Print(X); 00230 X = UT.sum_square_columns() - A1.sum_square_columns(); Print(X); 00231 // LowerTriangularMatrix 00232 LowerTriangularMatrix LT; LT << A; 00233 A1 = LT; 00234 X = LT.sum_square_rows() - A1.sum_square_rows(); Print(X); 00235 X = LT.sum_square_columns() - A1.sum_square_columns(); Print(X); 00236 // SymmetricMatrix 00237 SymmetricMatrix SM; SM << A; 00238 A1 = SM; 00239 X = SM.sum_square_rows() - A1.sum_square_rows(); Print(X); 00240 X = SM.sum_square_columns() - A1.sum_square_columns(); Print(X); 00241 // DiagonalMatrix 00242 DM << A; 00243 A1 = DM; 00244 X = DM.sum_square_rows() - A1.sum_square_rows(); Print(X); 00245 X = DM.sum_square_columns() - A1.sum_square_columns(); Print(X); 00246 // BandMatrix 00247 BandMatrix BM(17, 3, 5); BM.Inject(A); 00248 A1 = BM; 00249 X = BM.sum_square_rows() - A1.sum_square_rows(); Print(X); 00250 X = BM.sum_square_columns() - A1.sum_square_columns(); Print(X); 00251 // SymmetricBandMatrix 00252 SymmetricBandMatrix SBM(17, 4); SBM.Inject(A); 00253 A1 = SBM; 00254 X = SBM.sum_square_rows() - A1.sum_square_rows(); Print(X); 00255 X = SBM.sum_square_columns() - A1.sum_square_columns(); Print(X); 00256 // IdentityMatrix 00257 IdentityMatrix IM(29); 00258 X = IM.sum_square_rows() - 1; Print(X); 00259 X = IM.sum_square_columns() - 1; Print(X); 00260 // Matrix with zero rows 00261 A1.ReSize(0,10); 00262 X.ReSize(1,10); X = 0; X -= A1.sum_square_columns(); Print(X); 00263 X.ReSize(0,1); X -= A1.sum_square_rows(); Print(X); 00264 // Matrix with zero columns 00265 A1.ReSize(10,0); 00266 X.ReSize(10,1); X = 0; X -= A1.sum_square_rows(); Print(X); 00267 X.ReSize(1,0); X -= A1.sum_square_columns(); Print(X); 00268 00269 } 00270 00271 { 00272 Tracer et("Stage 14"); 00273 // test extend orthonormal 00274 MultWithCarry mwc; 00275 Matrix A(20,5); FillWithValues(mwc, A); 00276 // Orthonormalise 00277 UpperTriangularMatrix R; 00278 Matrix A_old = A; 00279 QRZ(A,R); 00280 // Check decomposition 00281 Matrix X = A * R - A_old; Clean(X, 0.000000001); Print(X); 00282 // Check orthogonality 00283 X = A.t() * A - IdentityMatrix(5); 00284 Clean(X, 0.000000001); Print(X); 00285 // Try orthonality extend 00286 SquareMatrix A1(20); 00287 A1.Columns(1,5) = A; 00288 extend_orthonormal(A1,5); 00289 // check columns unchanged 00290 X = A - A1.Columns(1,5); Print(X); 00291 // Check orthogonality 00292 X = A1.t() * A1 - IdentityMatrix(20); 00293 Clean(X, 0.000000001); Print(X); 00294 X = A1 * A1.t() - IdentityMatrix(20); 00295 Clean(X, 0.000000001); Print(X); 00296 // Test with smaller number of columns 00297 Matrix A2(20,15); 00298 A2.Columns(1,5) = A; 00299 extend_orthonormal(A2,5); 00300 // check columns unchanged 00301 X = A - A2.Columns(1,5); Print(X); 00302 // Check orthogonality 00303 X = A2.t() * A2 - IdentityMatrix(15); 00304 Clean(X, 0.000000001); Print(X); 00305 // check it works with no columns to start with 00306 A2.ReSize(100,100); 00307 extend_orthonormal(A2,0); 00308 // Check orthogonality 00309 X = A2.t() * A2 - IdentityMatrix(100); 00310 Clean(X, 0.000000001); Print(X); 00311 X = A2 * A2.t() - IdentityMatrix(100); 00312 Clean(X, 0.000000001); Print(X); 00313 } 00314 00315 { 00316 Tracer et("Stage 15"); 00317 // test extend orthonormal for SVD 00318 MultWithCarry mwc; 00319 Matrix A(15,40); FillWithValues(mwc, A); 00320 Matrix U, V; DiagonalMatrix D; 00321 SVD(A.t(),D,V,U); 00322 Matrix VE(40,40); VE.columns(1,15) = V; 00323 extend_orthonormal(VE,15); 00324 Matrix DE(15,40); DE = 0; DE.columns(1,15) = D; 00325 Matrix B = U * DE * VE.t(); 00326 B -= A; 00327 Clean(B, 0.000000001); Print(B); 00328 } 00329 00330 { 00331 Tracer et("Stage 16"); 00332 // test sum of rows or columns 00333 MultWithCarry mwc; 00334 ColumnVector CVX; Matrix X; 00335 // rectangular matrix 00336 Matrix A(20, 15); 00337 FillWithValues(mwc, A); 00338 // sum of rows 00339 ColumnVector Ones(15); Ones = 1; 00340 CVX = A * Ones; 00341 ColumnVector CV = A.sum_rows(); 00342 X = CV - CVX; Clean(X, 0.000000001); Print(X); 00343 Ones.resize(20); Ones = 1; 00344 CVX << A.t() * Ones; 00345 RowVector RV = A.sum_columns(); 00346 X = RV - CVX.AsRow(); Clean(X, 0.000000001); Print(X); 00347 X = RV - A.t().sum_rows().t(); Clean(X, 0.000000001); Print(X); 00348 X = CV - A.t().sum_columns().t(); Clean(X, 0.000000001); Print(X); 00349 // UpperTriangularMatrix 00350 A.ReSize(17,17); FillWithValues(mwc, A); 00351 UpperTriangularMatrix UT; UT << A; 00352 Matrix A1 = UT; 00353 X = UT.sum_rows() - A1.sum_rows(); Print(X); 00354 X = UT.sum_columns() - A1.sum_columns(); Print(X); 00355 // LowerTriangularMatrix 00356 LowerTriangularMatrix LT; LT << A; 00357 A1 = LT; 00358 X = LT.sum_rows() - A1.sum_rows(); Print(X); 00359 X = LT.sum_columns() - A1.sum_columns(); Print(X); 00360 // SymmetricMatrix 00361 SymmetricMatrix SM; SM << A; 00362 A1 = SM; 00363 X = SM.sum_rows() - A1.sum_rows(); Print(X); 00364 X = SM.sum_columns() - A1.sum_columns(); Print(X); 00365 // DiagonalMatrix 00366 DiagonalMatrix DM; DM << A; 00367 A1 = DM; 00368 X = DM.sum_rows() - A1.sum_rows(); Print(X); 00369 X = DM.sum_columns() - A1.sum_columns(); Print(X); 00370 // BandMatrix 00371 BandMatrix BM(17, 3, 5); BM.Inject(A); 00372 A1 = BM; 00373 X = BM.sum_rows() - A1.sum_rows(); Print(X); 00374 X = BM.sum_columns() - A1.sum_columns(); Print(X); 00375 // SymmetricBandMatrix 00376 SymmetricBandMatrix SBM(17, 4); SBM.Inject(A); 00377 A1 = SBM; 00378 X = SBM.sum_rows() - A1.sum_rows(); Print(X); 00379 X = SBM.sum_columns() - A1.sum_columns(); Print(X); 00380 // IdentityMatrix 00381 IdentityMatrix IM(29); 00382 X = IM.sum_rows() - 1; Print(X); 00383 X = IM.sum_columns() - 1; Print(X); 00384 // Matrix with zero rows 00385 A1.ReSize(0,10); 00386 X.ReSize(1,10); X = 0; X -= A1.sum_columns(); Print(X); 00387 X.ReSize(0,1); X -= A1.sum_rows(); Print(X); 00388 // Matrix with zero columns 00389 A1.ReSize(10,0); 00390 X.ReSize(10,1); X = 0; X -= A1.sum_rows(); Print(X); 00391 X.ReSize(1,0); X -= A1.sum_columns(); Print(X); 00392 00393 } 00394 00395 00396 00397 // cout << "\nEnd of twelfth test\n"; 00398 } 00399 00400