Ymir  .9
Fast\C++toolforcomputationofassemblingprobabilities,statisticalinferenceofassemblingstatisticalmodelandgenerationofartificialsequencesofT-cellreceptorsdata.
matrix.h
1 //
2 // Created by Vadim N. on 27/05/2015.
3 //
4 
5 #ifndef YMIR_MATRIX_H
6 #define YMIR_MATRIX_H
7 
8 
9 #include <iostream>
10 #include <stdexcept>
11 
12 
13 namespace ymir {
14 
15 
20  template <typename _Scalar, typename _Dim>
21  class Matrix {
22 
23  public:
24 
25  // def
26  Matrix()
27  : _rows(0),
28  _cols(0),
29  _data(nullptr)
30  {
31  }
32 
33 
34  Matrix(_Dim rows, _Dim columns, _Scalar val = 0) : _rows(rows), _cols(columns) {
35  _data = new _Scalar[rows * columns];
36  this->fill(val);
37  }
38 
39 
40  // copy
41  Matrix(const Matrix &other) {
42  _rows = other._rows;
43  _cols = other._cols;
44  if (_data) { delete [] _data; }
45  if (_rows * _cols != 0) {
46  _data = new _Scalar[_rows * _cols];
47  for (_Dim r = 0; r < _rows; ++r) {
48  for (_Dim c = 0; c < _cols; ++c) {
49  _data[r * _cols + c] = other._data[r * _cols + c];
50  }
51  }
52  } else {
53  _data = nullptr;
54  }
55  }
56 
57 
58  // dest
59  virtual ~Matrix() {
60  delete [] _data;
61  }
62 
63 
64  void fill(_Scalar val = 0) {
65  for (_Dim r = 0; r < _rows; ++r) {
66  for (_Dim c = 0; c < _cols; ++c) {
67  _data[r * _cols + c] = val;
68  }
69  }
70  }
71 
72  // eq
73  Matrix& operator=(const Matrix &other) {
74  _rows = other._rows;
75  _cols = other._cols;
76  if (_data) { delete [] _data; }
77  if (_rows * _cols != 0) {
78  _data = new _Scalar[_rows * _cols];
79  for (_Dim r = 0; r < _rows; ++r) {
80  for (_Dim c = 0; c < _cols; ++c) {
81  _data[r * _cols + c] = other._data[r * _cols + c];
82  }
83  }
84  } else {
85  _data = nullptr;
86  }
87  return *this;
88  }
89 
90  // resize
91  void resize(_Dim rows, _Dim columns) {
92  _rows = rows;
93  _cols = columns;
94  if (_data) { delete [] _data; }
95  _data = new _Scalar[_rows * _cols];
96  }
97 
98  // rows
99  _Dim rows() const { return _rows; }
100 
101  // cols
102  _Dim cols() const { return _cols; }
103 
104 
105 // operator() with check
106  _Scalar& operator()(_Dim row, _Dim col) {
107 #ifdef YDEBUG
108  if (!(row >= 0 && row < _rows && col >= 0 && col < _cols)) { throw(std::runtime_error("Rows / columns number check failed!")); }
109 #endif
110  return _data[row * _cols + col];
111  }
112 
113 
114  const _Scalar& operator()(_Dim row, _Dim col) const {
115 #ifdef YDEBUG
116  if (!(row >= 0 && row < _rows && col >= 0 && col < _cols)) { throw(std::runtime_error("Rows / columns number check failed!")); }
117 #endif
118  return _data[row * _cols + col];
119  }
120 
121 
122  // operator ==
123  bool operator==(const Matrix &other) const {
124  if (_rows != other._rows || _cols != other._cols) { return false; }
125 
126  for (_Dim r = 0; r < _rows; ++r) {
127  for (_Dim c = 0; c < _cols; ++c) {
128  if (_data[r * _cols + c] != other._data[r * _cols + c]) {
129  return false;
130  }
131  }
132  }
133 
134  return true;
135  }
136 
137 
138  // operator*
139  Matrix operator*(const Matrix &other) const {
140 #ifdef YDEBUG
141  if (_cols != other._rows) { throw(std::runtime_error("Multiplication of matrices with wrong dimensions!")); }
142 #endif
143 
144  Matrix res(_rows, other._cols, 0);
145  for (_Dim i = 0; i < _rows; ++i) {
146  for (_Dim j = 0; j < other._cols; ++j) {
147  for (_Dim k = 0; k < _cols; ++k) {
148  res(i, j) += (*this)(i, k) * other(k, j);
149 // std::cout << "mult:" << (*this)(i, k) << "*" << other(k, j) << "=" << res(i, j) << std::endl;
150  }
151  }
152  }
153  return res;
154  }
155 
156 
157  Matrix operator*(const _Scalar &val) const {
158  Matrix res(_rows, _cols);
159  for (_Dim i = 0; i < _rows; ++i) {
160  for (_Dim j = 0; j < _cols; ++j) {
161  res(i, j) = (*this)(i, j) * val;
162  }
163  }
164  return res;
165  }
166 
167 
168  size_t nonzeros() const {
169  size_t res = 0;
170  for (_Dim i = 0; i < _rows; ++i) {
171  for (_Dim j = 0; j < _cols; ++j) {
172  res += (*this)(i, j) != 0;
173  }
174  }
175  return res;
176  }
177 
178 
179  size_t zeros() const {
180  size_t res = 0;
181  for (_Dim i = 0; i < _rows; ++i) {
182  for (_Dim j = 0; j < _cols; ++j) {
183  res += (*this)(i, j) == 0;
184  }
185  }
186  return res;
187  }
188 
189 
190  std::string print() const {
191  std::string res = "";
192  for (size_t i = 0; i < _rows; ++i) {
193  for (size_t j = 0; j < _cols; ++j) {
194  res += std::to_string((*this)(i, j)) + "\t";
195  }
196  res += "\n";
197  }
198  return res;
199  }
200 
201 
202  protected:
203 
204  _Scalar *_data;
205  _Dim _rows, _cols;
206 
207  };
208 
209 
210  template <typename _Scalar, typename _Dim>
211  inline Matrix<_Scalar, _Dim> operator*(_Scalar val, const Matrix<_Scalar, _Dim> &rhs) {
212  Matrix<_Scalar, _Dim> res(rhs.rows(), rhs.cols());
213  for (_Dim i = 0; i < rhs.rows(); ++i) {
214  for (_Dim j = 0; j < rhs.cols(); ++j) {
215  res(i, j) = rhs(i, j) * val;
216  }
217  }
218  return res;
219  }
220 
221 }
222 
223 #endif //YMIR_MATRIX_H
Definition: aligner.h:37
Simple matrix class.
Definition: matrix.h:21