WvStreams
|
00001 #include "wvmatrix.h" 00002 00003 WvMatrix::WvMatrix(const int _m, const int _n, const int *_data) 00004 : m(_m), n(_n) 00005 { 00006 if (!m || !n) 00007 { 00008 data = NULL; 00009 return; 00010 } 00011 00012 data = new int[m * n]; 00013 00014 if (_data) 00015 memcpy(data, _data, m * n * sizeof(int)); 00016 else 00017 for (int i = 0; i < m * n; i++) 00018 data[i] = 0; 00019 } 00020 00021 00022 WvMatrix::~WvMatrix() 00023 { 00024 delete[] data; 00025 } 00026 00027 00028 WvMatrix::WvMatrix(const WvMatrix& mx) 00029 : m(mx.m), n(mx.n) 00030 { 00031 data = new int[m * n]; 00032 memcpy(data, mx.data, m * n * sizeof(int)); 00033 } 00034 00035 00036 WvMatrix& WvMatrix::operator= (const WvMatrix& mx) 00037 { 00038 delete[] data; 00039 data = new int[m * n]; 00040 00041 m = mx.m; 00042 n = mx.n; 00043 memcpy(data, mx.data, m * n * sizeof(int)); 00044 00045 return *this; 00046 } 00047 00048 00049 WvMatrix WvMatrix::operator+ (const WvMatrix &rhs) const 00050 { 00051 WvMatrix res(rhs); 00052 00053 if (m != rhs.m || n != rhs.n) 00054 return res; 00055 00056 for (int i = 0; i < m * n; i++) 00057 res.data[i] += data[i]; 00058 00059 return res; 00060 } 00061 00062 00063 WvMatrix WvMatrix::operator* (const WvMatrix &rhs) const 00064 { 00065 WvMatrix res(m, rhs.n); 00066 00067 if (n != rhs.m) 00068 return res; 00069 00070 int c; 00071 00072 for (int i = 0; i < res.m; i++) 00073 for (int j = 0; j < res.n; j++) 00074 { 00075 c = 0; 00076 for (int k = 0; k < n; k++) 00077 c += (*this)(i, k) * rhs(k, j); 00078 res(i, j) = c; 00079 } 00080 00081 return res; 00082 } 00083 00084 00085 WvString WvMatrix::printable() 00086 { 00087 WvString res("{%s", data[0]); 00088 for (int i = 1; i < m * n; i++) 00089 res.append(", %s", data[i]); 00090 return res; 00091 }