Yurttas/PL/OOL/Cplusplus/F/03/02/03/01/matrix.cpp

From ZCubes Wiki
Jump to navigation Jump to search
  1/*
  2   Copyright(C) 1998
  3   All Rights Reserved. Salih Yurttas, ZCubes, BitsOfCode Software Systems, Inc..
  4
  5   Permission to use, copy, modify, and distribute this
  6   software and its documentation for EDUCATIONAL purposes
  7   and without fee is hereby granted provided that this
  8   copyright notice appears in all copies.
  9
 10   date   : January 1, 1998.
 11   author : Salih Yurttas.
 12
 13   matrix.cpp
 14*/
 15
 16
 17#include <iostream>
 18
 19using namespace std;
 20
 21#include "matrix.h"
 22
 23matrix::
 24matrix(const int r, 
 25       const int c) : r_size(r),
 26                      c_size(c),
 27                      m(new int*[r_size]) {
 28  for(int i=0; i<r_size; ++i) {
 29    m[i]= new int[c_size];
 30    for(int j=0; j<c_size; ++j)
 31      m[i][j] = 0;
 32  }
 33}
 34
 35matrix::
 36matrix(const matrix& m1) : r_size(m1.r_size),
 37                           c_size(m1.c_size),
 38                           m(new int*[r_size]) {
 39  for(int i=0; i<r_size; ++i) {
 40    m[i]= new int[c_size];
 41    for(int j=0; j<c_size; ++j)
 42      m[i][j] = m1.m[i][j];
 43  }
 44}
 45
 46matrix::
 47~matrix() {
 48  for(int i=0; i<r_size; ++i) {
 49    delete [] m[i];
 50    m[i] = NULL;
 51  }
 52  delete [] m;
 53  m = NULL;
 54  r_size = 0;
 55  c_size = 0;
 56}
 57
 58matrix&
 59matrix::
 60operator=(const matrix& m1) {
 61  if(this==&m1) return *this;
 62
 63  for(int i=0; i<r_size; ++i)
 64    delete [] m[i];
 65  delete [] m;
 66
 67  r_size = m1.r_size;
 68  c_size = m1.c_size;
 69
 70  m = new int*[r_size];
 71
 72  for(int i=0; i<r_size; ++i) {
 73    m[i]= new int[c_size];
 74    for(int j=0; j<c_size; ++j)
 75      m[i][j] = m1.m[i][j];
 76  }
 77
 78  return *this;
 79}
 80
 81matrix&
 82matrix::
 83operator+=(const matrix& m1) {
 84  for(int i=0; i<r_size; ++i)
 85    for(int j=0; j<c_size; ++j)
 86      m[i][j] += m1.m[i][j];
 87
 88  return *this;
 89}
 90
 91matrix&
 92matrix::
 93operator-=(const matrix& m1) {
 94  for(int i=0; i<r_size; ++i)
 95    for(int j=0; j<c_size; ++j)
 96      m[i][j] -= m1.m[i][j];
 97
 98  return *this;
 99}
100
101matrix&
102matrix::
103operator*=(const matrix& m1) {
104  for(int i=0; i<r_size; ++i)
105    for(int j=0; j<m1.c_size; ++j) {
106      m[i][j] = 0;
107      for(int k=0; k<c_size; k++)
108        m[i][j] += m[i][k] * m1.m[k][j];
109    }
110
111  return *this;
112}
113
114matrix
115operator+(const matrix& m1,
116          const matrix& m2) {
117  matrix t(m1.r_size,
118           m1.c_size);
119
120  for(int i=0; i<m1.r_size; ++i)
121    for(int j=0; j<m1.c_size; ++j)
122      t.m[i][j] = m1.m[i][j] + m2.m[i][j];
123
124  return t;
125}
126
127matrix
128operator-(const matrix& m1,
129          const matrix& m2) {
130  matrix t(m1.r_size,
131           m1.c_size);
132
133  for(int i=0; i<m1.r_size; ++i)
134    for(int j=0; j<m1.c_size; ++j)
135      t.m[i][j] = m1.m[i][j] - m2.m[i][j];
136
137  return t;
138}
139
140matrix
141operator*(const matrix& m1,
142          const matrix& m2) {
143  matrix t(m1.r_size,
144           m1.c_size);
145
146  for(int i=0; i<m1.r_size; ++i)
147    for(int j=0; j<m2.c_size; ++j) {
148      t.m[i][j] = 0;
149      for(int k=0; k<m1.c_size; k++)
150        t.m[i][j] += m1.m[i][k] * m2.m[k][j];
151    }
152
153  return t;
154}
155
156matrix
157operator*(const matrix& m1,
158          const int s) {
159  matrix t(m1.r_size,
160           m1.c_size);
161
162  for(int i=0; i<m1.r_size; ++i)
163    for(int j=0; j<m1.c_size; ++j)
164      t.m[i][j] = m1.m[i][j] * s;
165
166  return t;
167}
168
169matrix
170operator*(const int s,
171          const matrix& m1) {
172  matrix t(m1.r_size,
173           m1.c_size);
174
175  for(int i=0; i<m1.r_size; ++i)
176    for(int j=0; j<m1.c_size; ++j)
177      t.m[i][j] = s * m1.m[i][j];
178
179  return t;
180}
181
182int
183matrix::
184retrieve_element(const int r,
185                 const int c) const {
186  return m[r][c];
187}
188
189void
190matrix::
191assign_element(const int r,
192               const int c,
193               const int value) {
194  m[r][c] = value;
195}
196
197void
198matrix::
199negate() {
200  for(int i=0; i<r_size; ++i)
201    for(int j=0; j<c_size; ++j)
202      m[i][j] *= -1;
203}
204
205void
206matrix::
207put_matrix() const {
208  for(int i=0; i<r_size; ++i) {
209    for(int j=0; j<c_size; ++j)
210      cout << m[i][j] << ' ';
211    cout << endl;
212  }
213}