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 }