home *** CD-ROM | disk | FTP | other *** search
- #include <iostream.h>
- #include <stdarg.h>
- #include <math.h>
-
-
- typedef double matrix_t;
-
-
- class matrix {
- matrix_t *matrix_data;
- size_t matrix_size;
-
- public:
- matrix (size_t matrix_length, ...);
- matrix (char *dummy, size_t matrix_length,matrix_t fill_value=0.0);
- matrix (matrix &m);
- ~matrix (void) { delete matrix_data; }
-
- matrix_t get_elem (size_t row, size_t column) { return *(matrix_data + (row-1)*matrix_size + (column-1)); }
- matrix_t put_elem (size_t row, size_t column, matrix_t elem) { return (*(matrix_data + (row-1)*matrix_size + (column-1)) = elem); }
-
- matrix_t* operator[] (size_t row) { return matrix_data + row*matrix_size; }
- matrix_t& operator() (size_t row, size_t column) { return *(matrix_data + (row-1)*matrix_size + (column-1)); }
- matrix operator= (matrix &m);
- size_t get_matrix_size (void) { return matrix_size; }
- int operator== (matrix m);
- int operator!= (matrix m);
- matrix operator+ (matrix m);
- matrix operator- (matrix m);
- matrix operator- (void);
- friend matrix_t det (matrix m);
- friend matrix_t cofactor (matrix m, size_t m_row, size_t m_column);
- friend matrix minor (matrix m, size_t m_row, size_t m_column);
- friend void transpose (matrix &m);
- friend matrix operator* (matrix m, double r);
- friend matrix operator* (double r, matrix m);
- friend matrix operator* (matrix m, int r);
- friend matrix operator* (int r, matrix m);
- friend ostream& operator<< (ostream &s, matrix m);
-
- void print_matrix (void);
- };
-
- matrix::matrix (size_t matrix_length, ...)
- {
- va_list argptr;
- size_t elem_count;
-
- matrix_size = matrix_length;
- matrix_data = new matrix_t [matrix_size*matrix_size];
-
- matrix_t *i;
- size_t count;
-
- va_start (argptr, matrix_length);
-
- elem_count = matrix_size*matrix_size;
-
- for (i = matrix_data, count = 1; count <= elem_count; i++, count++) {
- *i = (matrix_t) (va_arg (argptr, matrix_t));
- }
-
- va_end (argptr);
-
- cout << "\nCreated object Matrix\n";
- }
-
- matrix::matrix (char *dummy, size_t matrix_length,matrix_t fill_value)
- {
- size_t elem_count;
-
- matrix_size = matrix_length;
- matrix_data = new matrix_t [matrix_size*matrix_size];
-
- matrix_t *i;
- size_t count;
-
- elem_count = matrix_size*matrix_size;
-
- for (i = matrix_data, count = 1; count <= elem_count; count++, i++)
- *i = (matrix_t) fill_value;
-
- cout << "\nCreated zero matrix.\n";
- }
-
- #if 0
-
- matrix::~matrix (void)
- {
- delete matrix_data;
-
- // cout << "\nDeleted object Matrix\n";
- }
- #endif
-
- #if 0
-
- matrix_t matrix::get_elem (size_t row, size_t column)
- {
-
- }
-
- matrix_t matrix::put_elem (size_t row, size_t column, matrix_t elem)
- {
-
- }
-
- #endif
-
- void matrix::print_matrix (void)
- {
- matrix_t *i;
- size_t row_count, column_count;
-
- cout << '\n';
-
- for (i = matrix_data, row_count = 0, column_count = 0; row_count < matrix_size; i++) {
- cout << *i << ' ';
- if (column_count == (matrix_size - 1)) {
- column_count = 0;
- row_count++;
- cout << '\n';
- }
- else
- column_count++;
- }
- }
- #if 0
-
- matrix_t* matrix::operator[] (size_t row)
- {
- // return a reference to the first element in a given row
-
- }
-
- matrix_t& matrix::operator() (size_t row, size_t column)
- {
-
- }
-
- #endif
-
- matrix::matrix (matrix &m)
- {
- matrix_t *i, *j;
- size_t count, elem_count;
-
- matrix_size = m.matrix_size;
- elem_count = matrix_size*matrix_size;
-
- matrix_data = new matrix_t [elem_count];
-
- for (i = matrix_data, j = m.matrix_data, count = 1; count <= elem_count; count++, i++, j++)
- *i = *j;
- }
-
- matrix matrix::operator= (matrix &m)
- {
-
- size_t elem_count;
- matrix_t *i, *j;
-
- size_t count;
-
- delete matrix_data; // erase the current contents of the matrix on the left
- // side of the assignment
-
- matrix_size = m.matrix_size;
- elem_count = matrix_size * matrix_size;
-
- matrix_data = new matrix_t [elem_count]; // allocate space for the new matrix, identical to the argument
-
- for (i = matrix_data, j = m.matrix_data, count = 1; count <= elem_count; count++, i++, j++)
- *i = *j;
-
- return *this;
- }
-
- matrix matrix::operator+ (matrix m)
- {
- matrix temp ("*",matrix_size);
- matrix_t *i, *j, *k;
- size_t counter;
- size_t elem_count;
-
- elem_count = matrix_size * matrix_size;
-
- for (i = matrix_data, j = m.matrix_data, k = temp.matrix_data, counter = 1;
- counter <= elem_count; i++, j++, k++, counter++)
- *k = *i + *j;
-
- return temp;
- }
-
- matrix matrix::operator- (matrix m)
- {
- matrix temp ("*",matrix_size);
- matrix_t *i, *j, *k;
- size_t counter;
- size_t elem_count;
-
- elem_count = matrix_size * matrix_size;
-
- for (i = matrix_data, j = m.matrix_data, k = temp.matrix_data, counter = 1;
- counter <= elem_count; i++, j++, k++, counter++)
- *k = *i - *j;
-
- return temp;
- }
-
-
- inline void swap (matrix_t &a, matrix_t &b)
- {
- matrix_t temp;
-
- temp = a;
- a = b;
- b = temp;
- }
-
-
- void transpose (matrix &m)
- {
- size_t i,j;
-
- for (i = 2; i <= m.matrix_size; i++)
- for (j = 1; j <= i-1; j++)
- swap (m (i,j), m (j,i));
- }
-
-
- matrix minor (matrix m, size_t m_row, size_t m_column)
- {
- matrix temp ("*", m.matrix_size-1);
- size_t column, row;
- size_t temp_column, temp_row;
-
- for (column = 1, temp_column = 1; column <= m.matrix_size; column++) {
- if (column != m_column) {
- for (row = 1, temp_row = 1; row <= m.matrix_size; row++)
- if (row != m_row) {
- temp (temp_row, temp_column) = m (row, column);
- temp_row++;
- }
-
- temp_column++;
- }
- }
-
- return temp;
- }
-
- #if 0
-
- matrix_t det (matrix m)
- {
-
- int factor;
-
- if (m.matrix_size == 2)
- return m (1,1)*m (2,2) - m (1,2)*m (2,1);
- else {
- matrix_t value = 0.0;
- size_t col;
- size_t temp_row, temp_col;
- size_t current_col;
- matrix temp ("*",m.matrix_size-1);
-
- for (col = 1, factor = 1; col <= m.matrix_size; col++, factor *= (-1)) {
- for (current_col = 1, temp_col = 1; current_col <= m.matrix_size; current_col++)
- if (current_col != col) {
- for (temp_row = 2; temp_row <= m.matrix_size; temp_row++)
- temp (temp_row-1,temp_col) = m (temp_row,current_col);
-
- temp_col++;
- }
-
- value += m (1, col) * det (temp) * factor;
- }
-
- return value;
- }
- }
-
- #endif
-
-
- matrix_t det (matrix m)
- {
- if (m.matrix_size == 2)
- return m (1,1)*m (2,2) - m (1,2)*m (2,1);
- else {
- size_t i;
- matrix_t value = 0;
-
- for (i = 1; i <= m.matrix_size; i++)
- value += m (1,i) * cofactor (m, 1, i);
-
- return value;
- }
- }
-
-
-
- int matrix::operator== (matrix m)
- {
-
- if (matrix_size == m.matrix_size)
- return ! memcmp (matrix_data, m.matrix_data, matrix_size*matrix_size);
- else
- return 0;
- }
-
-
- int matrix::operator!= (matrix m)
- {
-
- if (matrix_size == m.matrix_size)
- return memcmp (matrix_data, m.matrix_data, matrix_size*matrix_size);
- else
- return 1;
- }
-
- matrix operator* (matrix m, double r)
- {
- matrix temp ("*",m.matrix_size);
- matrix_t *i, *t;
- size_t count, elem_count = m.matrix_size*m.matrix_size;
-
- for (i = m.matrix_data, t = temp.matrix_data, count = 1; count <= elem_count; i++, t++, count++)
- *t = *i * r;
-
- return temp;
- }
-
- matrix operator* (double r, matrix m)
- {
- matrix temp ("*",m.matrix_size);
- matrix_t *i, *t;
- size_t count, elem_count = m.matrix_size*m.matrix_size;
-
- for (i = m.matrix_data, t = temp.matrix_data, count = 1; count <= elem_count; i++, t++, count++)
- *t = *i * r;
-
- return temp;
- }
-
- matrix operator* (matrix m, int r)
- {
- matrix temp ("*",m.matrix_size);
- matrix_t *i, *t;
- size_t count, elem_count = m.matrix_size*m.matrix_size;
-
- for (i = m.matrix_data, t = temp.matrix_data, count = 1; count <= elem_count; i++, t++, count++)
- *t = *i * r;
-
- return temp;
- }
-
- matrix operator* (int r, matrix m)
- {
- matrix temp ("*",m.matrix_size);
- matrix_t *i, *t;
- size_t count, elem_count = m.matrix_size*m.matrix_size;
-
- for (i = m.matrix_data, t = temp.matrix_data, count = 1; count <= elem_count; i++, t++, count++)
- *t = *i * r;
-
- return temp;
- }
-
- matrix_t cofactor (matrix m, size_t m_row, size_t m_column)
- {
- int factor;
-
- if ((m_row+m_column) % 2)
- factor = (-1);
- else
- factor = 1;
-
- return (matrix_t) factor * det (minor (m, m_row, m_column));
- }
-
-
- matrix matrix::operator- (void)
- {
- matrix temp ("*",matrix_size);
- matrix_t *i, *t;
- size_t count, elem_count = matrix_size*matrix_size;
-
- for (i = matrix_data, t = temp.matrix_data, count = 1; count <= elem_count; i++, t++, count++)
- *t = -*i;
-
- return temp;
- }
-
- ostream& operator<< (ostream &s, matrix m)
- {
- size_t i,j;
-
- s << '\n';
-
- for (i = 1; i <= m.matrix_size; i++) {
- for (j = 1; j <= m.matrix_size; j++)
- s << m (i,j) << ' ';
-
- s << '\n';
- }
-
- return s;
- }
-
- main (void)
- {
- matrix matrix_a (3,1.0,2.0,3.0,
- 4.0,5.0,6.0,
- 7.0,7.0,7.0);
-
- matrix matrix_b (3,1.0,1.0,3.0,
- 4.0,5.0,6.0,
- 7.0,8.0,9.0);
-
- matrix matrix_c ("*",3);
-
- matrix matrix_test (4, 2.0, 9.0, 9.0, 4.0,
- 2.0, -3.0, 12.0, 8.0,
- 4.0, 8.0, 3.0, -5.0,
- 1.0, 2.0, 6.0, 4.0);
-
- matrix matrix_minor (3, 2.0,9.0,4.0,
- 4.0,8.0,-5.0,
- 1.0,2.0,4.0);
-
-
- cout << "\nTesting the output operator.\n";
-
- cout << '\n';
- cout << matrix_test;
- cout << '\n';
-
- return 0;
- }
-