#include "itbase.h"

using std::cout;
using std::endl;
using namespace itpp;

int main(void)
{
  mat A = randn(3,4);
  mat B = randn(3,4);
  mat C = randn(4,3);
  vec v = randn(4);
  vec u = randn(3);

  mat E = randn(1,3);

  mat D;
  vec s;

  cout << "====================================================" << endl;
  cout << "mat_test: Test of matrix operations in mat.h/mat.cpp" << endl;
  cout << "====================================================" << endl;
  cout << "A = " << A << endl;
  cout << "B = " << B << endl;
  cout << "C = " << C << endl;
  cout << "E = " << E << endl;

  cout << "Testing indexing" << endl;
  cout << "================" << endl;
  cout << "A(1,2) = " << A(1,2) << endl;
  cout << "A(2,3) = " << A(2,3) << endl;
  cout << "A(6) = " << A(6) << endl;
  cout << "A(0,2,1,3) = " << A(0,2,1,3) << endl;
  cout << "A.get_row(1) = " << A.get_row(1) << endl;
  cout << "A.get_rows(1,2) = " << A.get_rows(1,2) << endl;
  cout << "A.get_col(2) = " << A.get_col(2) << endl;
  cout << "A.get_cols(2,3) = " << A.get_cols(2,3) << endl;

  cout << "Testing setting/copying/swapping" << endl;
  cout << "================================" << endl;
  cout << "v = " << v << endl;
  cout << "u = " << u << endl;
  D = A;
  cout << "D = " << D << endl;
  D.set_row(1, v);
  cout << "D.set_row(1, v):" << endl;
  cout << "D = " << D << endl;
  D.set_col(2, u);
  cout << "D.set_col(2, u):" << endl;
  cout << "D = " << D << endl;
  D.copy_row(1, 2);
  cout << "D.copy_row(1, 2):" << endl;
  cout << "D = " << D << endl;
  D.copy_col(2, 3);
  cout << "D.copy_col(2, 3):" << endl;
  cout << "D = " << D << endl;
  D.swap_rows(0, 2);
  cout << "D.swap_rows(0, 2):" << endl;
  cout << "D = " << D << endl;
  D.swap_cols(0, 3);
  cout << "D.swap_cols(0, 3):" << endl;
  cout << "D = " << D << endl;

  D.set_submatrix(1,2,2,3, A(0,1,0,1));
  cout << "D.set_submatrix(1,2,2,3, A(0,1,0,1): " << endl;
  cout << "D = " << D << endl;
  D.set_submatrix(1,2,2,3, 5.3);
  cout << "D.set_submatrix(1,2,2,3, 5.3): " << endl;
  cout << "D = " << D << endl;

  cout << "A = " << A << endl;
  cout << "B = " << B << endl;
  D = concat_horizontal(A,B);
  cout << "D = concat_horizontal(A,B):" << endl;
  cout << "D = " << D << endl;
  D = concat_vertical(A,B);
  cout << "D = concat_vertical(A,B):" << endl;
  cout << "D = " << D << endl;

  cout << "Testing operators (=, +, - *, /)" << endl;
  cout << "================================" << endl;
  D = A;
  cout << "D = A = " << D << endl;
  D = 5.3;
  cout << "D = 5.3 = " << D << endl;

  D = A+B;
  cout << "D = A+B = " << D << endl;
  D += A;
  cout << "D += A = " << D << endl;
  D = A+5.3;
  cout << "D = A+5.3 = " << D << endl;
  D += 5.3;
  cout << "D += 5.3 = " << D << endl;

  D = A-B;
  cout << "D = A-B = " << D << endl;
  D -= A;
  cout << "D -= A = " << D << endl;
  D = A-5.3;
  cout << "D = A-5.3 = " << D << endl;
  D -= 5.3;
  cout << "D -= 5.3 = " << D << endl;

  D = A*C;
  cout << "D = A*C = " << D << endl;
  D *= A;
  cout << "D *= A = " << D << endl;
  D = A*5.3;
  cout << "D = A*5.3 = " << D << endl;
  D = 3.9*A;
  cout << "D = 3.9*A = " << D << endl;
  D *= 5.3;
  cout << "D *= 5.3 = " << D << endl;
  D = elem_mult(A,B);
  cout << "D = elem_mult(A,B) = " << D << endl;

  s = A*v;
  cout << "s = A*v = " << s << endl;
  D = u*E;
  cout << "D = u*E = " << D << endl;

  D = A/5.3;
  cout << "D = A/5.3 = " << D << endl;
  D /= 5.3;
  cout << "D /= 5.3 = " << D << endl;
  D = elem_div(A,B);
  cout << "D = elem_div(A,B) = " << D << endl;
  D /= A;
  cout << "D /= A = " << D << endl;

  return 0;

}


syntax highlighted by Code2HTML, v. 0.9.1