VM2D  1.12
Vortex methods for 2D flows simulation
nummatrix.h
Go to the documentation of this file.
1 /*--------------------------------*- VMlib -*----------------*---------------*\
2 | ## ## ## ## ## ## ## | | Version 1.12 |
3 | ## ## ### ### ## ## | VMlib: VM2D/VM3D Library | 2024/01/14 |
4 | ## ## ## # ## ## ## #### | Open Source Code *----------------*
5 | #### ## ## ## ## ## ## | https://www.github.com/vortexmethods/VM2D |
6 | ## ## ## #### ### #### | https://www.github.com/vortexmethods/VM3D |
7 | |
8 | Copyright (C) 2017-2024 Ilia Marchevsky |
9 *-----------------------------------------------------------------------------*
10 | File name: nummatrix.h |
11 | Info: Source code of VMlib |
12 | |
13 | This file is part of VMlib. |
14 | VMLib is free software: you can redistribute it and/or modify it |
15 | under the terms of the GNU General Public License as published by |
16 | the Free Software Foundation, either version 3 of the License, or |
17 | (at your option) any later version. |
18 | |
19 | VMlib is distributed in the hope that it will be useful, but WITHOUT |
20 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
21 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
22 | for more details. |
23 | |
24 | You should have received a copy of the GNU General Public License |
25 | along with VMlib. If not, see <http://www.gnu.org/licenses/>. |
26 \*---------------------------------------------------------------------------*/
27 
28 
37 #ifndef NUMMATRIX_H_
38 #define NUMMATRIX_H_
39 
40 #include "numvector.h"
41 
42 namespace VMlib
43 {
44 
61  template<typename T, size_t n, size_t m>
62  class nummatrix : public std::array<T, n*m>
63  {
64 
65  public:
66 
67  public:
68 
75  {
76  return *(reinterpret_cast<numvector<T, m>*>(this->data() + (i*m)));
77  }
78 
84  const numvector<T, m>& operator[](size_t i) const
85  {
86  return *(reinterpret_cast<const numvector<T, m>*>(this->data() + (i*m)));
87  }
88 
89 
90 
99  template <typename P>
101  {
102  for (size_t i = 0; i < n*m; ++i)
103  this->data()[i] *= c;
104  return *this;
105  }//operator*=
106 
107 
116  template <typename P>
118  {
119  for (size_t i = 0; i < n*m; ++i)
120  this->data()[i] /= c;
121  return *this;
122  }//operator/=
123 
124 
133  template <typename P>
135  {
136  for (size_t i = 0; i < n*m; ++i)
137  this->data()[i] += y.data()[i];
138  return *this;
139  }//operator+=
140 
141 
150  template <typename P>
152  {
153  for (size_t i = 0; i < n*m; ++i)
154  this->data()[i] -= y.data()[i];
155  return *this;
156  }//operator-=
157 
158 
167  template <typename P>
168  auto operator+(const nummatrix<P, n, m>& y) const -> nummatrix<typename std::remove_const<decltype(this->data()[0] + y.data()[0])>::type, n, m>
169  {
170  nummatrix<typename std::remove_const<decltype(this->data()[0] + y.data()[0])>::type, n, m> res;
171  for (size_t i = 0; i < n*m; ++i)
172  res.data()[i] = this->data()[i] + y.data()[i];
173  return res;
174  }//operator+
175 
176 
185  template <typename P>
186  auto operator-(const nummatrix<P, n, m>& y) const -> nummatrix<typename std::remove_const<decltype(this->data()[0] - y.data()[0])>::type, n, m>
187  {
188  nummatrix<typename std::remove_const<decltype(this->data()[0] - y.data()[0])>::type, n, m> res;
189  for (size_t i = 0; i < n*m; ++i)
190  res.data()[i] = this->data()[i] - y.data()[i];
191  return res;
192  }//operator-
193 
194 
200  template <typename P>
201  auto operator*(const P c) const -> nummatrix<typename std::remove_const<decltype(this->data()[0] * c)>::type, n, m>
202  {
203  nummatrix<typename std::remove_const<decltype(this->data()[0] * c)>::type, n, m> res;
204  for (size_t i = 0; i < n*m; ++i)
205  res.data()[i] = c * this->data()[i];
206  return res;
207  }//operator*
208 
209 
210 
218  {
219  nummatrix<T, n, m> res;
220  for (size_t i = 0; i < n*m; ++i)
221  res.data()[i] = -this->data()[i];
222  return res;
223  }//operator-
224 
225 
234  template <typename P>
235  bool operator==(const nummatrix<P, n, m>& y) const
236  {
237  for (size_t i = 0; i < n*m; ++i)
238  if (this->data()[i] != y.data()[i])
239  return false;
240  return true;
241  }//operator==
242 
243 
252  template <typename P>
253  bool operator!=(const nummatrix<P, n, m>& y) const
254  {
255  return !(*this == y);
256  }//operator!=
257 
258 
262  std::pair<size_t, size_t> size() const { return{ n, m }; }
263 
264 
268  auto norm1() const -> typename std::remove_const<typename std::remove_reference<decltype(this->data()[0])>::type>::type
269  {
270  std::vector<typename std::remove_const<typename std::remove_reference<decltype(this->data()[0])>::type>::type> ms(m, 0);
271  for (size_t i = 0; i < m; ++i)
272  for (size_t j = 0; j < n; ++j)
273  ms[i] += abs(this->data()[j*m + i]);
274  return std::max_element(ms.begin(), ms.end());
275  }
276 
280  auto norminf() const -> typename std::remove_const<typename std::remove_reference<decltype(this->data()[0])>::type>::type
281  {
282  std::vector<typename std::remove_const<typename std::remove_reference<decltype(this->data()[0])>::type>::type> ms(n, 0);
283  for (size_t i = 0; i < n; ++i)
284  for (size_t j = 0; j < m; ++j)
285  ms[i] += abs(this->data()[i*m + j]);
286  return std::max_element(ms.begin(), ms.end());
287  }
288 
289 
298  {
299  for (size_t i = 0; i < n*m; ++i)
300  this->data()[i] = val;
301  return *this;
302  }
303 
304 
311  {
312  for (size_t i = 0; i < n; ++i)
313  for (size_t j = 0; j < m; ++j)
314  this->data()[i*m + j] = (i == j) ? 1 : 0;
315  return *this;
316  }
317 
325  {
326  nummatrix<T, m, n> res;
327  for (size_t i = 0; i < n; ++i)
328  for (size_t j = 0; j < m; ++j)
329  res[j][i] = (*this)[i][j];
330  }
331 
338  {
339  return (*this + this->t())*0.5;
340  }
341 
343  nummatrix() { };
344 
345 
350  template <typename P>
351  explicit nummatrix(const P z)
352  {
353  for (size_t i = 0; i < n*m; ++i)
354  this->data()[i] = z;
355  }//nummatrix(...)
356 
357 
364  template <typename P>
366  {
367  for (size_t i = 0; i < n*m; ++i)
368  this->data()[i] = mtr.data()[i];
369  }//nummatrix(...)
370 
371 
378  template <typename P>
379  nummatrix(const std::vector<std::vector<P>>& vec)
380  {
381  if ((vec.size() != n) || (vec[0].size() != m))
382  throw;
383  for (size_t i = 0; i < n; ++i)
384  for (size_t j = 0; j < m; ++j)
385  this->data()[i*m + j] = vec[i][j];
386  }//nummatrix(...)
387 
388 
395  template <typename P>
397  {
398  for (size_t i = 0; i < n; ++i)
399  for (size_t j = 0; j < m; ++j)
400  this->data()[i*m + j] = mtr[i][j];
401  }//nummatrix(...)
402 
403 
404 #if !defined(__CUDACC__)
405  nummatrix(const std::initializer_list<numvector<T, m>>& z)
411  {
412  if (z.size() != n)
413  throw;
414  for (size_t i = 0; i < n; ++i)
415  {
416  const numvector<T, m>& numv = *(z.begin() + i);
417  for (size_t j = 0; j < m; ++j)
418  this->data()[i*m + j] = numv[j];
419  }
420  }//nummatrix(...)
421 
422 
428  template <typename P>
429  nummatrix(const std::initializer_list<numvector<P, m>>& z)
430  {
431  if (z.size() != n)
432  throw;
433  for (size_t i = 0; i < n; ++i)
434  {
435  const numvector<T, m>& numv = *(z.begin() + i);
436  for (size_t j = 0; j < m; ++j)
437  this->data()[i*m + j] = numv[j];
438  }
439  }//nummatrix(...)
440 #endif
441 
442 
446  operator std::vector<std::vector<T>>() const
447  {
448  std::vector<std::vector<T>> vec;
449  vec.reserve(n);
450  for (size_t i = 0; i < n; ++i)
451  {
452  vec[i].reserve(m);
453  for (size_t j = 0; j < m; ++j)
454  vec[i].push_back(this->data()[i*m + j]);
455  }
456  return vec;
457  }
458 
459 
462  {
463  nummatrix<T, m, n> res;
464  for (size_t i = 0; i < n; ++i)
465  for (size_t j = 0; j < m; ++j)
466  res[j][i] = this->data()[i*m + j];
467  return res;
468  }//Transpose(...)
469 
470 
478  template<typename P>
479  auto operator&(const numvector<P, m>& x) -> \
480  numvector<typename std::remove_const<decltype(this->data()[0] * x[0])>::type, n>
481  {
482  numvector<typename std::remove_const<decltype(this->data()[0] * x[0])>::type, n> res;
483 
484  for (size_t i = 0; i < n; ++i)
485  res[i] = (*this)[i] & x;
486 
487  return res;
488  }//operator&
489 
497  template<typename P, size_t p>
498  auto operator&(const nummatrix<P, m, p>& B) const -> \
499  nummatrix<typename std::remove_const<decltype(this->data()[0] * B.data()[0])>::type, n, p>
500  {
502  nummatrix<typename std::remove_const<decltype(this->data()[0] * B.data()[0])>::type, n, p> res;
503 
504  for (size_t i = 0; i < n; ++i)
505  for (size_t j = 0; j < p; ++j)
506  res[i][j] = 0;
507 
508  for (size_t i = 0; i < n; ++i)
509  for (size_t j = 0; j < p; ++j)
510  for (size_t k = 0; k < m; ++k)
511  res[i][j] += (*this)[i][k] * B[k][j];
512  return res;
513  }//operator&
514 
515  };
516 
517 
527  template<typename T, typename P, size_t n, size_t m>
528  auto operator&(const numvector<P, n>& x, const nummatrix<T, n, m>& A) -> \
529  numvector<typename std::remove_const<decltype(x[0] * A.data()[0])>::type, m>
530  {
531  numvector<typename std::remove_const<decltype(x[0] * A.data()[0])>::type, m> res;
532  for (size_t i = 0; i < m; ++i)
533  {
534  res[i] = 0;
535  for (size_t j = 0; j < n; ++j)
536  res[i] += x[j] * A[j][i];
537  }
538  return res;
539  }//operator&(...)
540 
541 
543  template<typename T, typename P, size_t n, size_t m>
544  inline auto operator| (const numvector<T, n>& x, const numvector<P, m>& y) -> \
545  nummatrix<typename std::remove_const<decltype(x[0] * y[0])>::type, n, m>
546  {
548 
549  for (size_t i = 0; i < n; ++i)
550  for (size_t j = 0; j < m; ++j)
551  res[i][j] = x[i] * y[j];
552 
553  return res;
554  }//operator|(...)
555 
556 
557 
567  template<typename T, size_t n, size_t m>
568  std::ostream& operator<< (std::ostream& str, const nummatrix<T, n, m>& x)
569  {
570  str << "{ ";
571  for (size_t j = 0; j < n - 1; ++j)
572  str << x[j] << ", ";
573  str << x[n - 1];
574  str << " }";
575  return str;
576  }//operator<<
577 
578 }//namespace VMlib
579 
580 using VMlib::nummatrix;
581 
582 #endif
std::pair< size_t, size_t > size() const
Вычисление размерности матрицы (числа строк и столбцов в ней)
Definition: nummatrix.h:262
auto operator*(const P c) const -> nummatrix< typename std::remove_const< decltype(this->data()[0]*c)>::type, n, m >
Перегрузка оператора "*" умножения матрицы справа на число
Definition: nummatrix.h:201
const numvector< T, m > & operator[](size_t i) const
Перегрузка оператора "[]" доступа к строке
Definition: nummatrix.h:84
Шаблонный класс, определяющий вектор фиксированной длины Фактически представляет собой массив...
Definition: numvector.h:95
Описание класса numvector.
nummatrix(const P z)
Конструктор, инициализирующий всю матрицу одной и той же константой
Definition: nummatrix.h:351
nummatrix< T, n, m > & operator*=(const P c)
Перегрузка оператора "*=" домножения матрицы на действительное число
Definition: nummatrix.h:100
nummatrix< T, m, n > t() const
Definition: nummatrix.h:324
auto operator|(const numvector< T, n > &x, const numvector< P, m > &y) -> nummatrix< typename std::remove_const< decltype(x[0]*y[0])>::type, n, m >
Умножение вектора на вектор внешним образом
Definition: nummatrix.h:544
STL namespace.
nummatrix< T, n, n > & toIdentity()
Definition: nummatrix.h:310
auto operator&(const nummatrix< P, m, p > &B) const -> nummatrix< typename std::remove_const< decltype(this->data()[0]*B.data()[0])>::type, n, p >
Умножение матрицы на матрицу
Definition: nummatrix.h:498
Шаблонный класс, определяющий матрицу фиксированного размера Фактически представляет собой массив...
Definition: nummatrix.h:62
nummatrix< T, n, m > & toZero(T val=0.0)
Definition: nummatrix.h:297
auto operator+(const nummatrix< P, n, m > &y) const -> nummatrix< typename std::remove_const< decltype(this->data()[0]+y.data()[0])>::type, n, m >
Перегрузка оператора "+" сложения двух матриц
Definition: nummatrix.h:168
auto operator&(const numvector< P, m > &x) -> numvector< typename std::remove_const< decltype(this->data()[0]*x[0])>::type, n >
Умножение матрицы на вектор
Definition: nummatrix.h:479
numvector< T, m > & operator[](size_t i)
Перегрузка оператора "[]" доступа к строке
Definition: nummatrix.h:74
nummatrix< T, n, m > & operator+=(const nummatrix< P, n, m > &y)
Перегрузка оператора "+=" прибавления другой матрицы
Definition: nummatrix.h:134
bool operator==(const nummatrix< P, n, m > &y) const
Перегрузка оператора "==" логического равенства
Definition: nummatrix.h:235
nummatrix< T, n, n > sym() const
Definition: nummatrix.h:337
nummatrix< T, n, m > operator-() const
Перегрузка оператора "-" унарного минуса
Definition: nummatrix.h:217
nummatrix< T, n, m > & operator/=(const P c)
Перегрузка оператора "/=" деления матрицы на действительное число
Definition: nummatrix.h:117
bool operator!=(const nummatrix< P, n, m > &y) const
Перегрузка оператора "!=" логического неравенства
Definition: nummatrix.h:253
nummatrix< T, m, n > transpose() const
Транспонирование
Definition: nummatrix.h:461
nummatrix(const nummatrix< P, n, m > &mtr)
Конструктор копирования
Definition: nummatrix.h:365
auto operator-(const nummatrix< P, n, m > &y) const -> nummatrix< typename std::remove_const< decltype(this->data()[0]-y.data()[0])>::type, n, m >
Перегрузка оператора "-" вычитания двух матриц
Definition: nummatrix.h:186
nummatrix(const numvector< numvector< P, m >, n > &mtr)
Конструктор инициализации при помощи numvector из numvector.
Definition: nummatrix.h:396
nummatrix< T, n, m > & operator-=(const nummatrix< P, n, m > &y)
Перегрузка оператора "-=" вычитания другой матрицы
Definition: nummatrix.h:151
auto norm1() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data()[0])>::type >::type
Вычисление 1-нормы матрицы
Definition: nummatrix.h:268
nummatrix(const std::vector< std::vector< P >> &vec)
Конструктор инициализации с помощью std::vector из std::vector.
Definition: nummatrix.h:379
nummatrix()
Пустой конструктор
Definition: nummatrix.h:343
nummatrix(const std::initializer_list< numvector< P, m >> &z)
Шаблонный конструктор инициализации списком из numvector.
Definition: nummatrix.h:429
auto norminf() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data()[0])>::type >::type
Вычисление inf-нормы матрицы
Definition: nummatrix.h:280