00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <math.h>
00019 #include "matpackI.h"
00020 #include "matpackIII.h"
00021 #include "array.h"
00022 #include "make_array.h"
00023 #include "mystring.h"
00024 #include "make_vector.h"
00025 #include "math_funcs.h"
00026
00027
00029 Joker joker;
00030
00031 Numeric by_reference(const Numeric& x)
00032 {
00033 return x+1;
00034 }
00035
00036 Numeric by_value(Numeric x)
00037 {
00038 return x+1;
00039 }
00040
00041 void fill_with_junk(VectorView x)
00042 {
00043 x = 999;
00044 }
00045
00046 void fill_with_junk(MatrixView x)
00047 {
00048 x = 888;
00049 }
00050
00051 int test1()
00052 {
00053 Vector v(20);
00054
00055 cout << "v.nelem() = " << v.nelem() << "\n";
00056
00057 for (Index i=0; i<v.nelem(); ++i )
00058 v[i] = i;
00059
00060 cout << "v.begin() = " << *v.begin() << "\n";
00061
00062 cout << "v = \n" << v << "\n";
00063
00064 fill_with_junk(v[Range(1,8,2)][Range(2,joker)]);
00065
00066
00067 Vector v2 = v[Range(2,4)];
00068
00069 cout << "v2 = \n" << v2 << "\n";
00070
00071 for (Index i=0 ; i<1000; ++i)
00072 {
00073 Vector v3(1000);
00074 v3 = i;
00075 }
00076
00077 v2[Range(joker)] = 88;
00078
00079 v2[Range(0,2)] = 77;
00080
00081 cout << "v = \n" << v << "\n";
00082 cout << "v2 = \n" << v2 << "\n";
00083 cout << "v2.nelem() = \n" << v2.nelem() << "\n";
00084
00085 Vector v3;
00086 v3.resize(v2.nelem());
00087 v3 = v2;
00088
00089 cout << "\nv3 = \n" << v3 << "\n";
00090 fill_with_junk(v2);
00091 cout << "\nv3 after junking v2 = \n" << v3 << "\n";
00092 v3 *= 2;
00093 cout << "\nv3 after *2 = \n" << v3 << "\n";
00094
00095 Matrix M(10,15);
00096 {
00097 Numeric n=0;
00098 for (Index i=0; i<M.nrows(); ++i)
00099 for (Index j=0; j<M.ncols(); ++j)
00100 M(i,j) = ++n;
00101 }
00102
00103 cout << "\nM =\n" << M << "\n";
00104
00105 cout << "\nM(Range(2,4),Range(2,4)) =\n" << M(Range(2,4),Range(2,4)) << "\n";
00106
00107 cout << "\nM(Range(2,4),Range(2,4))(Range(1,2),Range(1,2)) =\n"
00108 << M(Range(2,4),Range(2,4))(Range(1,2),Range(1,2)) << "\n";
00109
00110 cout << "\nM(1,Range(joker)) =\n" << M(1,Range(joker)) << "\n";
00111
00112 cout << "\nFilling M(1,Range(1,2)) with junk.\n";
00113 fill_with_junk(M(1,Range(1,2)));
00114
00115 cout << "\nM(Range(0,4),Range(0,4)) =\n" << M(Range(0,4),Range(0,4)) << "\n";
00116
00117 cout << "\nFilling M(Range(4,2,2),Range(6,3)) with junk.\n";
00118
00119 MatrixView s = M(Range(4,2,2),Range(6,3));
00120 fill_with_junk(s);
00121
00122 cout << "\nM =\n" << M << "\n";
00123
00124 const Matrix C = M;
00125
00126 cout << "\nC(Range(3,4,2),Range(2,3,3)) =\n"
00127 << C(Range(3,4,2),Range(2,3,3)) << "\n";
00128
00129 cout << "\nC(Range(3,4,2),Range(2,3,3)).transpose() =\n"
00130 << transpose(C(Range(3,4,2),Range(2,3,3))) << "\n";
00131
00132 return 0;
00133 }
00134
00135 void test2()
00136 {
00137 Vector v(50000000);
00138
00139 cout << "v.nelem() = " << v.nelem() << "\n";
00140
00141 cout << "Filling\n";
00142
00143
00144 v = 1.;
00145 cout << "Done\n";
00146
00147 }
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170 void test4()
00171 {
00172 Vector a(10);
00173 Vector b(a.nelem());
00174
00175 for ( Index i=0; i<a.nelem(); ++i )
00176 {
00177 a[i] = i+1;
00178 b[i] = a.nelem()-i;
00179 }
00180
00181 cout << "a = \n" << a << "\n";
00182 cout << "b = \n" << b << "\n";
00183 cout << "a*b \n= " << a*b << "\n";
00184
00185 Matrix A(11,6);
00186 Matrix B(10,20);
00187 Matrix C(20,5);
00188
00189 B = 2;
00190 C = 3;
00191 mult(A(Range(1,joker),Range(1,joker)),B,C);
00192
00193
00194
00195 cout << "\nB*C =\n" << A << "\n";
00196
00197 }
00198
00199 void test5()
00200 {
00201 Vector a(10);
00202 Vector b(20);
00203 Matrix M(10,20);
00204
00205
00206 b = 1;
00207 M = 2;
00208
00209 cout << "b = \n" << b << "\n";
00210 cout << "M =\n" << M << "\n";
00211
00212 mult(a,M,b);
00213 cout << "\na = M*b = \n" << a << "\n";
00214
00215 mult(transpose(b),transpose(a),M);
00216 cout << "\nb^t = a^t * M = \n" << transpose(b) << "\n";
00217
00218 }
00219
00220 void test6()
00221 {
00222 Index n = 5000;
00223 Vector x(1,n,1), y(n);
00224 Matrix M(n,n);
00225 M = 1;
00226
00227
00228 cout << "Transforming.\n";
00229
00230
00231
00232 for (Index i=0; i<1000; ++i)
00233 {
00234
00235 transform(y,sin,static_cast<MatrixView>(x));
00236 x+=1;
00237 }
00238
00239
00240 cout << "Done.\n";
00241 }
00242
00243 void test7()
00244 {
00245 Vector x(1,20000000,1);
00246 Vector y(x.nelem());
00247 transform(y,sin,x);
00248 cout << "min(sin(x)), max(sin(x)) = " << min(y) << ", " << max(y) << "\n";
00249 }
00250
00251 void test8()
00252 {
00253 Vector x(80000000);
00254 for ( Index i=0; i<x.nelem(); ++i )
00255 x[i] = i;
00256 cout << "Done." << "\n";
00257 }
00258
00259 void test9()
00260 {
00261
00262 Matrix A(4,8);
00263 Matrix B(A(Range(joker),Range(0,3)));
00264 cout << "B = " << B << "\n";
00265 }
00266
00267 void test10()
00268 {
00269
00270
00271
00272
00273 Vector v(1,8,1);
00274 Matrix M((const Vector)v);
00275 cout << "M = " << M << "\n";
00276 }
00277
00278 void test11()
00279 {
00280
00281
00282
00283
00284 Vector v(1,8,1);
00285 Matrix M(v.nelem(),1);
00286 M = v;
00287 cout << "M = " << M << "\n";
00288 }
00289
00290 void test12()
00291 {
00292
00293
00294 Array<String> sa(3);
00295 sa[0] = "It's ";
00296 sa[1] = "a ";
00297 sa[2] = "test.";
00298
00299 Array<String> sb(sa), sc(sa.nelem());
00300
00301 cout << "sb = \n" << sb << "\n";
00302
00303 sc = sa;
00304
00305 cout << "sc = \n" << sc << "\n";
00306
00307 }
00308
00309 void test13()
00310 {
00311
00312 const Vector v(1,8,1);
00313
00314
00315 Matrix M(v);
00316 M += v;
00317 cout << "M = \n" << M << "\n";
00318 }
00319
00320 void test14()
00321 {
00322
00323 Array<String> a = MakeArray<String>("Test");
00324 Array<Index> b = MakeArray<Index>(1,2);
00325 Array<Numeric> c = MakeArray<Numeric>(1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0);
00326 cout << "a = \n" << a << "\n";
00327 cout << "b = \n" << b << "\n";
00328 cout << "c = \n" << c << "\n";
00329 }
00330
00331 void test15()
00332 {
00333
00334 String a = "Nur ein Test.";
00335 cout << "a = " << a << "\n";
00336 String b(a,5,-1);
00337 cout << "b = " << b << "\n";
00338 }
00339
00340 void test16()
00341 {
00342
00343 Vector a;
00344 Array<Numeric> b;
00345 b.push_back(1);
00346 b.push_back(2);
00347 b.push_back(3);
00348 a.resize(b.nelem());
00349 a = b;
00350 cout << "b =\n" << b << "\n";
00351 cout << "a =\n" << a << "\n";
00352 }
00353
00354 void test17()
00355 {
00356
00357 Vector a(1,10,1);
00358 cout << "a.sum() = " << a.sum() << "\n";
00359 }
00360
00361 void test18()
00362 {
00363
00364 Vector a(1,10,1);
00365 a *= a;
00366 cout << "a *= a =\n" << a << "\n";
00367 }
00368
00369 void test19()
00370 {
00371
00372
00373
00374
00375 Vector a(1,10,1);
00376 Vector b(5.3,10,0);
00377 cout << "a =\n" << a << "\n";
00378 cout << "b =\n" << b << "\n";
00379 }
00380
00381 void test20()
00382 {
00383
00384 MakeVector a(1,2,3,4,5,6,7,8,9,10);
00385 cout << "a =\n" << a << "\n";
00386 }
00387
00388 void test21()
00389 {
00390 Numeric s=0;
00391
00392 cout << "By reference:\n";
00393 for ( Index i=0; i<1e8; ++i )
00394 {
00395 s += by_reference(s);
00396 s -= by_reference(s);
00397 }
00398 cout << "s = " << s << "\n";
00399 }
00400
00401 void test22()
00402 {
00403 Numeric s=0;
00404
00405 cout << "By value:\n";
00406 for ( Index i=0; i<1e8; ++i )
00407 {
00408 s += by_value(s);
00409 s -= by_value(s);
00410 }
00411 cout << "s = " << s << "\n";
00412 }
00413
00414 void test23()
00415 {
00416
00417 Vector a(10,3.5);
00418 cout << "a =\n" << a << "\n";
00419 Matrix b(10,10,4.5);
00420 cout << "b =\n" << b << "\n";
00421 }
00422
00423 void test24()
00424 {
00425
00426 Matrix a(5,1,2.5);
00427 Vector b(1,5,1);
00428 a *= b;
00429 cout << "a*=b =\n" << a << "\n";
00430 a /= b;
00431 cout << "a/=b =\n" << a << "\n";
00432 a += b;
00433 cout << "a+=b =\n" << a << "\n";
00434 a -= b;
00435 cout << "a-=b =\n" << a << "\n";
00436 }
00437
00438 void test25()
00439 {
00440
00441 MakeArray<Index> a(1,2,3,4,5,6,5,4,3,2,1);
00442 cout << "min/max of a = " << min(a) << "/" << max(a) << "\n";
00443 }
00444
00445 void test26()
00446 {
00447 cout << "Test filling constructor for Array:\n";
00448 Array<String> a(4,"Hello");
00449 cout << "a =\n" << a << "\n";
00450 }
00451
00452 void test27()
00453 {
00454 cout << "Test Arrays of Vectors:\n";
00455 Array<Vector> a;
00456 a.push_back(MakeVector(1.0,2.0));
00457 a.push_back(Vector(1.0,10,1.0));
00458 cout << "a =\n" << a << "\n";
00459 }
00460
00461 void test28()
00462 {
00463 cout << "Test default constructor for Matrix:\n";
00464 Matrix a;
00465 Matrix b(a);
00466 cout << "b =\n" << b << "\n";
00467 }
00468
00469 void test29()
00470 {
00471 cout << "Test Arrays of Matrix:\n";
00472 ArrayOfMatrix a;
00473 Matrix b;
00474
00475 b.resize(2,2);
00476 b(0,0) = 1;
00477 b(0,1) = 2;
00478 b(1,0) = 3;
00479 b(1,1) = 4;
00480 a.push_back(b);
00481 b *= 2;
00482 a.push_back(b);
00483
00484 a[0].resize(2,3);
00485 a[0] = 4;
00486
00487 a.resize(3);
00488 a[2].resize(4,5);
00489 a[2] = 5;
00490
00491 cout << "a =\n" << a << "\n";
00492 }
00493
00494 void test30()
00495 {
00496 cout << "Test Matrices of size 0:\n";
00497 Matrix a(0,0);
00498
00499 a.resize(2,2);
00500 a = 1;
00501 cout << "a =\n" << a << "\n";
00502
00503 Matrix b(3,0);
00504
00505 b.resize(b.nrows(),b.ncols()+3);
00506 b = 2;
00507 cout << "b =\n" << b << "\n";
00508
00509 Matrix c(0,3);
00510
00511 c.resize(c.nrows()+3,c.ncols());
00512 c = 3;
00513 cout << "c =\n" << c << "\n";
00514 }
00515
00516 void test31()
00517 {
00518 cout << "Test Tensor3:\n";
00519
00520 Tensor3 a(2,3,4,1.0);
00521
00522 Index fill = 0;
00523
00524
00525 for ( Index i=0; i<a.npages(); ++i )
00526 for ( Index j=0; j<a.nrows(); ++j )
00527 for ( Index k=0; k<a.ncols(); ++k )
00528 a(i,j,k) = ++fill;
00529
00530 cout << "a =\n" << a << "\n";
00531
00532 cout << "Taking out first row of first page:\n"
00533 << a(0,0,Range(joker)) << "\n";
00534
00535 cout << "Taking out last column of second page:\n"
00536 << a(1,Range(joker),a.ncols()-1) << "\n";
00537
00538 cout << "Taking out the first letter on every page:\n"
00539 << a(Range(joker),0,0) << "\n";
00540
00541 cout << "Taking out first page:\n"
00542 << a(0,Range(joker),Range(joker)) << "\n";
00543
00544 cout << "Taking out last row of all pages:\n"
00545 << a(Range(joker),a.nrows()-1,Range(joker)) << "\n";
00546
00547 cout << "Taking out second column of all pages:\n"
00548 << a(Range(joker),Range(joker),1) << "\n";
00549
00550 a *= 2;
00551
00552 cout << "After element-vise multiplication with 2:\n"
00553 << a << "\n";
00554
00555 transform(a,sqrt,a);
00556
00557 cout << "After taking the square-root:\n"
00558 << a << "\n";
00559
00560 Index s = 200;
00561 cout << "Let's allocate a large tensor, "
00562 << s*s*s*8/1024./1024.
00563 << " MB...\n";
00564
00565 a.resize(s,s,s);
00566
00567 cout << "Set it to 1...\n";
00568
00569 a = 1;
00570
00571 cout << "a(900,900,900) = " << a(90,90,90) << "\n";
00572
00573 fill = 0;
00574
00575 cout << "Fill with running numbers, using for loops...\n";
00576 for ( Index i=0; i<a.npages(); ++i )
00577 for ( Index j=0; j<a.nrows(); ++j )
00578 for ( Index k=0; k<a.ncols(); ++k )
00579 a(i,j,k) = ++fill;
00580
00581 cout << "Max(a) = ...\n";
00582
00583 cout << max(a) << "\n";
00584
00585 }
00586
00587 int main()
00588 {
00589 test31();
00590 return 0;
00591 }