
/**********************************************************************/



class Matrix {
protected:  // because vector will inherit these vars
  int num_rows, num_cols;
  double* data;
public:
  Matrix(){num_rows=num_cols=0;data=null;}
  Matrix(int r, int c){num_rows=r;num_cols=c;data=new double[r*c];}
  void set(int r, int c, double d){
    if (data==null) exit(-1);
    if ((r<0)||(c<0)||(r+1>num_rows)||(c+1>num_cols))
      {cerr << "Matrix set error" << endl; exit (-1);}
    data[num_cols*(r)+(c)]=d;}
  double get(int r, int c){
    if (data==null) exit(-1);
    if ((r+1<1)||(c+1<1)||(r+1>num_rows)||(c+1>num_cols))    
      {cerr << "Matrix get error" << endl; exit (-1);}    
    return data[num_cols*(r)+(c)];}
  void set_rows_and_cols(int r, int c){
    if (num_rows || num_cols) exit(-1);
    num_rows=r;num_cols=c;data=new double[r*c];}
  int get_rows(){if (!num_rows) exit(-1); return num_rows;}
  int get_cols(){if (!num_cols) exit(-1); return num_cols;}
  Matrix *copy(){
    Matrix *A=new Matrix(this->num_rows,this->num_cols);
    for(int i=0;i<num_rows;i++)
      for (int j=0;j<num_cols;j++)
	A->set(i,j,this->get(i,j));
    return A;}
  void exchange(int r1,int r2){
    if ((r1+1<1)||(r2+1<1)||(r1+1>num_rows)||(r2+1>num_rows)) exit(-1);
    double temp;
    for (int i=0;i<num_cols;i++){
      temp=this->get(r1,i);
      this->set(r1,i,this->get(r2,i));
      this->set(r2,i,temp);}}
  void print(){
    for (int i=0;i<num_rows;i++){
      for (int j=0;j<num_cols;j++)
	cout << this->get(i,j) << " ";
      cout << endl;}
  }
};
