64 template<
typename T,
size_t n,
size_t m>
89 return *(
reinterpret_cast<const numvector<T, m>*
>(this->data() + (i*m)));
102 template <
typename P>
105 for (
size_t i = 0; i < n*m; ++i)
106 this->data()[i] *= c;
119 template <
typename P>
122 for (
size_t i = 0; i < n*m; ++i)
123 this->data()[i] /= c;
136 template <
typename P>
139 for (
size_t i = 0; i < n*m; ++i)
140 this->data()[i] += y.data()[i];
153 template <
typename P>
156 for (
size_t i = 0; i < n*m; ++i)
157 this->data()[i] -= y.data()[i];
170 template <
typename P>
173 nummatrix<
typename std::remove_const<
decltype(this->data()[0] + y.data()[0])>::type, n, m> res;
174 for (
size_t i = 0; i < n*m; ++i)
175 res.data()[i] = this->data()[i] + y.data()[i];
188 template <
typename P>
191 nummatrix<
typename std::remove_const<
decltype(this->data()[0] - y.data()[0])>::type, n, m> res;
192 for (
size_t i = 0; i < n*m; ++i)
193 res.data()[i] = this->data()[i] - y.data()[i];
203 template <
typename P>
204 auto operator*(
const P c)
const ->
nummatrix<
typename std::remove_const<
decltype(this->data()[0] * c)>::type, n, m>
206 nummatrix<
typename std::remove_const<
decltype(this->data()[0] * c)>::type, n, m> res;
207 for (
size_t i = 0; i < n*m; ++i)
208 res.data()[i] = c * this->data()[i];
223 for (
size_t i = 0; i < n*m; ++i)
224 res.data()[i] = -this->data()[i];
237 template <
typename P>
240 for (
size_t i = 0; i < n*m; ++i)
241 if (this->data()[i] != y.data()[i])
255 template <
typename P>
258 return !(*
this == y);
265 std::pair<size_t, size_t>
size()
const {
return{ n, m }; }
271 auto norm1() const -> typename std::remove_const<typename std::remove_reference<decltype(this->data()[0])>::type>::type
273 std::vector<
typename std::remove_const<
typename std::remove_reference<
decltype(this->data()[0])>::type>::type> ms(m, 0);
274 for (
size_t i = 0; i < m; ++i)
275 for (
size_t j = 0; j < n; ++j)
276 ms[i] += abs(this->data()[j*m + i]);
277 return std::max_element(ms.begin(), ms.end());
283 auto norminf() const -> typename std::remove_const<typename std::remove_reference<decltype(this->data()[0])>::type>::type
285 std::vector<
typename std::remove_const<
typename std::remove_reference<
decltype(this->data()[0])>::type>::type> ms(n, 0);
286 for (
size_t i = 0; i < n; ++i)
287 for (
size_t j = 0; j < m; ++j)
288 ms[i] += abs(this->data()[i*m + j]);
289 return std::max_element(ms.begin(), ms.end());
302 for (
size_t i = 0; i < n*m; ++i)
303 this->data()[i] = val;
315 for (
size_t i = 0; i < n; ++i)
316 for (
size_t j = 0; j < m; ++j)
317 this->data()[i*m + j] = (i == j) ? 1 : 0;
330 for (
size_t i = 0; i < n; ++i)
331 for (
size_t j = 0; j < m; ++j)
332 res[j][i] = (*
this)[i][j];
343 return (*
this + this->
t())*0.5;
354 template <
typename P>
357 for (
size_t i = 0; i < n*m; ++i)
368 template <
typename P>
371 for (
size_t i = 0; i < n*m; ++i)
372 this->data()[i] = mtr.data()[i];
382 template <
typename P>
385 if ((vec.size() != n) || (vec[0].size() != m))
387 for (
size_t i = 0; i < n; ++i)
388 for (
size_t j = 0; j < m; ++j)
389 this->data()[i*m + j] = vec[i][j];
399 template <
typename P>
402 for (
size_t i = 0; i < n; ++i)
403 for (
size_t j = 0; j < m; ++j)
404 this->data()[i*m + j] = mtr[i][j];
408#if !defined(__CUDACC__)
418 for (
size_t i = 0; i < n; ++i)
421 for (
size_t j = 0; j < m; ++j)
422 this->data()[i*m + j] = numv[j];
432 template <
typename P>
437 for (
size_t i = 0; i < n; ++i)
440 for (
size_t j = 0; j < m; ++j)
441 this->data()[i*m + j] = numv[j];
450 operator std::vector<std::vector<T>>()
const
452 std::vector<std::vector<T>> vec;
454 for (
size_t i = 0; i < n; ++i)
457 for (
size_t j = 0; j < m; ++j)
458 vec[i].push_back(this->data()[i*m + j]);
468 for (
size_t i = 0; i < n; ++i)
469 for (
size_t j = 0; j < m; ++j)
470 res[j][i] = this->data()[i*m + j];
484 numvector<
typename std::remove_const<
decltype(this->data()[0] * x[0])>::type, n>
486 numvector<
typename std::remove_const<
decltype(this->data()[0] * x[0])>::type, n> res;
488 for (
size_t i = 0; i < n; ++i)
489 res[i] = (*
this)[i] & x;
501 template<
typename P,
size_t p>
503 nummatrix<
typename std::remove_const<
decltype(this->data()[0] * B.data()[0])>::type, n, p>
506 nummatrix<
typename std::remove_const<
decltype(this->data()[0] * B.data()[0])>::type, n, p> res;
508 for (
size_t i = 0; i < n; ++i)
509 for (
size_t j = 0; j < p; ++j)
512 for (
size_t i = 0; i < n; ++i)
513 for (
size_t j = 0; j < p; ++j)
514 for (
size_t k = 0; k < m; ++k)
515 res[i][j] += (*
this)[i][k] * B[k][j];
531 template<
typename T,
typename P,
size_t n,
size_t m>
533 numvector<
typename std::remove_const<
decltype(x[0] * A.data()[0])>::type, m>
535 numvector<
typename std::remove_const<
decltype(x[0] * A.data()[0])>::type, m> res;
536 for (
size_t i = 0; i < m; ++i)
539 for (
size_t j = 0; j < n; ++j)
540 res[i] += x[j] * A[j][i];
547 template<
typename T,
typename P,
size_t n,
size_t m>
549 nummatrix<
typename std::remove_const<
decltype(x[0] * y[0])>::type, n, m>
551 nummatrix<
typename std::remove_const<
decltype(x[0] * y[0])>::type, n, m> res;
553 for (
size_t i = 0; i < n; ++i)
554 for (
size_t j = 0; j < m; ++j)
555 res[i][j] = x[i] * y[j];
571 template<
typename T,
size_t n,
size_t m>
575 for (
size_t j = 0; j < n - 1; ++j)
Шаблонный класс, определяющий матрицу фиксированного размера Фактически представляет собой массив,...
nummatrix< T, m, n > transpose() const
Транспонирование
nummatrix(const numvector< numvector< P, m >, n > &mtr)
Конструктор инициализации при помощи numvector из numvector.
nummatrix< T, n, n > & toIdentity()
nummatrix(const P z)
Конструктор, инициализирующий всю матрицу одной и той же константой
nummatrix(const std::initializer_list< numvector< T, m > > &z)
Нешаблонный конструктор инициализации списком из numvector.
nummatrix< T, n, m > operator-() const
Перегрузка оператора "-" унарного минуса
nummatrix< T, m, n > t() const
auto operator&(const nummatrix< P, m, p > &B) const -> nummatrix< typename std::remove_const< decltype(this->data()[0] *B.data()[0])>::type, n, p >
Умножение матрицы на матрицу
auto norminf() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data()[0])>::type >::type
Вычисление inf-нормы матрицы
nummatrix()
Пустой конструктор
nummatrix(const std::initializer_list< numvector< P, m > > &z)
Шаблонный конструктор инициализации списком из numvector.
auto operator&(const numvector< P, m > &x) -> numvector< typename std::remove_const< decltype(this->data()[0] *x[0])>::type, n >
Умножение матрицы на вектор
auto operator+(const nummatrix< P, n, m > &y) const -> nummatrix< typename std::remove_const< decltype(this->data()[0]+y.data()[0])>::type, n, m >
Перегрузка оператора "+" сложения двух матриц
bool operator!=(const nummatrix< P, n, m > &y) const
Перегрузка оператора "!=" логического неравенства
bool operator==(const nummatrix< P, n, m > &y) const
Перегрузка оператора "==" логического равенства
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 nummatrix< P, n, m > &mtr)
Конструктор копирования
nummatrix< T, n, m > & toZero(T val=0.0)
nummatrix< T, n, m > & operator-=(const nummatrix< P, n, m > &y)
Перегрузка оператора "-=" вычитания другой матрицы
nummatrix< T, n, n > sym() const
auto norm1() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data()[0])>::type >::type
Вычисление 1-нормы матрицы
nummatrix< T, n, m > & operator/=(const P c)
Перегрузка оператора "/=" деления матрицы на действительное число
const numvector< T, m > & operator[](size_t i) const
Перегрузка оператора "[]" доступа к строке
nummatrix< T, n, m > & operator+=(const nummatrix< P, n, m > &y)
Перегрузка оператора "+=" прибавления другой матрицы
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 >
Перегрузка оператора "*" умножения матрицы справа на число
nummatrix< T, n, m > & operator*=(const P c)
Перегрузка оператора "*=" домножения матрицы на действительное число
nummatrix(const std::vector< std::vector< P > > &vec)
Конструктор инициализации с помощью std::vector из std::vector.
numvector< T, m > & operator[](size_t i)
Перегрузка оператора "[]" доступа к строке
Шаблонный класс, определяющий вектор фиксированной длины Фактически представляет собой массив,...
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 >
Умножение вектора на вектор внешним образом
auto operator&(const numvector< P, n > &x, const nummatrix< T, n, m > &A) -> numvector< typename std::remove_const< decltype(x[0] *A.data()[0])>::type, m >
Умножение вектора на матрицу
std::ostream & operator<<(std::ostream &_stream, const std::vector< T > &_vec)
Переопределение оператора "<<" для вывода в поток вектора std::vector.
Описание класса numvector.