forked from wlach/wvstreams
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwvmatrix.cc
91 lines (67 loc) · 1.37 KB
/
wvmatrix.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "wvmatrix.h"
WvMatrix::WvMatrix(const int _m, const int _n, const int *_data)
: m(_m), n(_n)
{
if (!m || !n)
{
data = NULL;
return;
}
data = new int[m * n];
if (_data)
memcpy(data, _data, m * n * sizeof(int));
else
for (int i = 0; i < m * n; i++)
data[i] = 0;
}
WvMatrix::~WvMatrix()
{
delete[] data;
}
WvMatrix::WvMatrix(const WvMatrix& mx)
: m(mx.m), n(mx.n)
{
data = new int[m * n];
memcpy(data, mx.data, m * n * sizeof(int));
}
WvMatrix& WvMatrix::operator= (const WvMatrix& mx)
{
delete[] data;
data = new int[m * n];
m = mx.m;
n = mx.n;
memcpy(data, mx.data, m * n * sizeof(int));
return *this;
}
WvMatrix WvMatrix::operator+ (const WvMatrix &rhs) const
{
WvMatrix res(rhs);
if (m != rhs.m || n != rhs.n)
return res;
for (int i = 0; i < m * n; i++)
res.data[i] += data[i];
return res;
}
WvMatrix WvMatrix::operator* (const WvMatrix &rhs) const
{
WvMatrix res(m, rhs.n);
if (n != rhs.m)
return res;
int c;
for (int i = 0; i < res.m; i++)
for (int j = 0; j < res.n; j++)
{
c = 0;
for (int k = 0; k < n; k++)
c += (*this)(i, k) * rhs(k, j);
res(i, j) = c;
}
return res;
}
WvString WvMatrix::printable()
{
WvString res("{%s", data[0]);
for (int i = 1; i < m * n; i++)
res.append(", %s", data[i]);
return res;
}