61 template<
typename T,
size_t n,
size_t m>
86 return *(
reinterpret_cast<const numvector<T, m>*
>(this->data() + (i*m)));
102 for (
size_t i = 0; i < n*m; ++i)
103 this->data()[i] *= c;
116 template <
typename P>
119 for (
size_t i = 0; i < n*m; ++i)
120 this->data()[i] /= c;
133 template <
typename P>
136 for (
size_t i = 0; i < n*m; ++i)
137 this->data()[i] += y.data()[i];
150 template <
typename P>
153 for (
size_t i = 0; i < n*m; ++i)
154 this->data()[i] -= y.data()[i];
167 template <
typename P>
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];
185 template <
typename P>
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];
200 template <
typename P>
201 auto operator*(
const P c)
const ->
nummatrix<
typename std::remove_const<decltype(this->data()[0] * c)>::type, n, m>
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];
220 for (
size_t i = 0; i < n*m; ++i)
221 res.data()[i] = -this->data()[i];
234 template <
typename P>
237 for (
size_t i = 0; i < n*m; ++i)
238 if (this->data()[i] != y.data()[i])
252 template <
typename P>
255 return !(*
this == y);
262 std::pair<size_t, size_t>
size()
const {
return{ n, m }; }
268 auto norm1() const -> typename
std::remove_const<typename
std::remove_reference<decltype(this->data()[0])>::type>::type
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());
280 auto norminf() const -> typename
std::remove_const<typename
std::remove_reference<decltype(this->data()[0])>::type>::type
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());
299 for (
size_t i = 0; i < n*m; ++i)
300 this->data()[i] = val;
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;
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];
339 return (*
this + this->
t())*0.5;
350 template <
typename P>
353 for (
size_t i = 0; i < n*m; ++i)
364 template <
typename P>
367 for (
size_t i = 0; i < n*m; ++i)
368 this->data()[i] = mtr.data()[i];
378 template <
typename P>
381 if ((vec.size() != n) || (vec[0].
size() != m))
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];
395 template <
typename P>
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];
404 #if !defined(__CUDACC__) 414 for (
size_t i = 0; i < n; ++i)
417 for (
size_t j = 0; j < m; ++j)
418 this->data()[i*m + j] = numv[j];
428 template <
typename P>
433 for (
size_t i = 0; i < n; ++i)
436 for (
size_t j = 0; j < m; ++j)
437 this->data()[i*m + j] = numv[j];
446 operator std::vector<std::vector<T>>()
const 448 std::vector<std::vector<T>> vec;
450 for (
size_t i = 0; i < n; ++i)
453 for (
size_t j = 0; j < m; ++j)
454 vec[i].push_back(this->data()[i*m + j]);
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];
480 numvector<
typename std::remove_const<decltype(this->data()[0] * x[0])>::type, n>
482 numvector<
typename std::remove_const<decltype(this->data()[0] * x[0])>::type, n> res;
484 for (
size_t i = 0; i < n; ++i)
485 res[i] = (*
this)[i] & x;
497 template<
typename P,
size_t p>
499 nummatrix<
typename std::remove_const<decltype(this->data()[0] * B.data()[0])>::type, n, p>
502 nummatrix<
typename std::remove_const<decltype(this->data()[0] * B.data()[0])>::type, n, p> res;
504 for (
size_t i = 0; i < n; ++i)
505 for (
size_t j = 0; j < p; ++j)
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];
527 template<
typename T,
typename P,
size_t n,
size_t m>
529 numvector<
typename std::remove_const<decltype(x[0] * A.data()[0])>::type, m>
531 numvector<
typename std::remove_const<decltype(x[0] * A.data()[0])>::type, m> res;
532 for (
size_t i = 0; i < m; ++i)
535 for (
size_t j = 0; j < n; ++j)
536 res[i] += x[j] * A[j][i];
543 template<
typename T,
typename P,
size_t n,
size_t m>
545 nummatrix<typename std::remove_const<decltype(x[0] * y[0])>::type, n, m>
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];
567 template<
typename T,
size_t n,
size_t m>
568 std::ostream& operator<< (std::ostream& str, const nummatrix<T, n, m>& x)
571 for (
size_t j = 0; j < n - 1; ++j)
std::pair< size_t, size_t > size() const
Вычисление размерности матрицы (числа строк и столбцов в ней)
auto operator*(const P c) const -> nummatrix< typename std::remove_const< decltype(this->data()[0]*c)>::type, n, m >
Перегрузка оператора "*" умножения матрицы справа на число
const numvector< T, m > & operator[](size_t i) const
Перегрузка оператора "[]" доступа к строке
Шаблонный класс, определяющий вектор фиксированной длины Фактически представляет собой массив...
Описание класса numvector.
nummatrix(const P z)
Конструктор, инициализирующий всю матрицу одной и той же константой
nummatrix< T, n, m > & operator*=(const P c)
Перегрузка оператора "*=" домножения матрицы на действительное число
nummatrix< T, m, n > t() const
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 >
Умножение вектора на вектор внешним образом
nummatrix< T, n, n > & toIdentity()
auto operator&(const nummatrix< P, m, p > &B) const -> nummatrix< typename std::remove_const< decltype(this->data()[0]*B.data()[0])>::type, n, p >
Умножение матрицы на матрицу
Шаблонный класс, определяющий матрицу фиксированного размера Фактически представляет собой массив...
nummatrix< T, n, m > & toZero(T val=0.0)
auto operator+(const nummatrix< P, n, m > &y) const -> nummatrix< typename std::remove_const< decltype(this->data()[0]+y.data()[0])>::type, n, m >
Перегрузка оператора "+" сложения двух матриц
auto operator&(const numvector< P, m > &x) -> numvector< typename std::remove_const< decltype(this->data()[0]*x[0])>::type, n >
Умножение матрицы на вектор
numvector< T, m > & operator[](size_t i)
Перегрузка оператора "[]" доступа к строке
nummatrix< T, n, m > & operator+=(const nummatrix< P, n, m > &y)
Перегрузка оператора "+=" прибавления другой матрицы
bool operator==(const nummatrix< P, n, m > &y) const
Перегрузка оператора "==" логического равенства
nummatrix< T, n, n > sym() const
nummatrix< T, n, m > operator-() const
Перегрузка оператора "-" унарного минуса
nummatrix< T, n, m > & operator/=(const P c)
Перегрузка оператора "/=" деления матрицы на действительное число
bool operator!=(const nummatrix< P, n, m > &y) const
Перегрузка оператора "!=" логического неравенства
nummatrix< T, m, n > transpose() const
Транспонирование
nummatrix(const nummatrix< P, n, m > &mtr)
Конструктор копирования
auto operator-(const nummatrix< P, n, m > &y) const -> nummatrix< typename std::remove_const< decltype(this->data()[0]-y.data()[0])>::type, n, m >
Перегрузка оператора "-" вычитания двух матриц
nummatrix(const numvector< numvector< P, m >, n > &mtr)
Конструктор инициализации при помощи numvector из numvector.
nummatrix< T, n, m > & operator-=(const nummatrix< P, n, m > &y)
Перегрузка оператора "-=" вычитания другой матрицы
auto norm1() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data()[0])>::type >::type
Вычисление 1-нормы матрицы
nummatrix(const std::vector< std::vector< P >> &vec)
Конструктор инициализации с помощью std::vector из std::vector.
nummatrix()
Пустой конструктор
nummatrix(const std::initializer_list< numvector< P, m >> &z)
Шаблонный конструктор инициализации списком из numvector.
auto norminf() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data()[0])>::type >::type
Вычисление inf-нормы матрицы