This class illustrates a simple matrix class. Like the vector class, the matrix class overloads the indexing and insertor operators. This class also defines a slicing function. In contrast to slicing function for the vector class, every matrix renames its elements to start at (0,0).
Notice that indexing is done one step at a time. To make
this work correctly, we had to define a subclass,
mat_row to be the result of indexing a matrix.
This subclass only defines a constructor and an indexing
operation.
//
// matrix.C
//
// a simple matrix package to illustrate the fundamental ideas that
// would be implemented in a real matrix package.
//
//
// A. B. Maccabe
// March 11, 1997
//
#include <assert.h>
#include <iostream.h>
#include <iomanip.h>
class Matrix {
public:
// a constructor -- you must know the size when you
// construct a matrix
Matrix( int r, int c ) {
nrows = r;
ncols = c;
col_start = 0;
true_cols = ncols;
data = new double [r*c];
}
friend Matrix operator +( Matrix x, Matrix y ) {
assert( x.nrows==x.nrows && x.ncols==x.ncols );
Matrix res(x.nrows, x.ncols);
for( int row = 0 ; row < x.nrows ; row++ ) {
for( int col = 0 ; col < x.ncols ; col++ ) {
// fill in the details
}
}
return res;
};
// a subclass for indexing
class mat_row {
public:
// constructor
mat_row( int n, double *dat ) {
ncols = n;
data = dat;
};
double& operator []( int indx ) {
assert( 0<=indx && indx<ncols );
return data[indx];
}
private:
int ncols;
double *data;
};
mat_row operator []( int indx ) {
assert( 0<=indx && indx<nrows );
return mat_row( ncols, &data[true_cols*indx + col_start] );
};
Matrix slice( int start_row, int start_col, int rows, int cols ) {
assert( 0<=start_row && 0<=rows && start_row+rows<=nrows );
assert( 0<=start_col && 0<=cols && start_col+cols<=ncols );
Matrix res( &data[start_row*true_cols], rows, cols,
start_col+col_start, true_cols );
return res;
};
friend ostream& operator <<( ostream& os, Matrix m ) {
int indx = m.col_start;
for( int i = 0 ; i < m.nrows ; i++ ) {
for( int j = 0 ; j < m.ncols ; j++ ) {
os << setw(4) << m.data[indx++];
}
indx += m.true_cols - m.ncols;
os << endl;
}
return os;
};
private:
// a private constructor
Matrix( double *dat, int rows, int cols, int cstart, int tcols ) {
data = dat;
nrows = rows;
ncols = cols;
col_start = cstart;
true_cols = tcols;
};
int nrows, ncols;
double *data;
int col_start, true_cols;
};
int main( ) {
Matrix m1(7,7);
for( int i = 0 ; i < 7 ; i++ ) {
for( int j = 0 ; j < 7 ; j++ ) {
m1[i][j] = 7;
}
}
cout << m1 << endl;
Matrix m2 = m1.slice( 1, 1, 4, 5 );
cout << m2 << endl;
for( int i = 0 ; i < 4 ; i++ ) {
for( int j = 0 ; j < 5 ; j++ ) {
m2[i][j] = 3;
}
}
cout << m1 << endl;
Matrix m3 = m2.slice( 1, 1, 3, 2 );
cout << m3 << endl;
for( int i = 0 ; i < 3 ; i++ ) {
for( int j = 0 ; j < 2 ; j++ ) {
m3[i][j] = 5;
}
}
cout << m1 << endl;
}