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 }