WvStreams
wvmatrix.cc
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 }