-
Notifications
You must be signed in to change notification settings - Fork 0
/
matrices.hpp
59 lines (49 loc) · 1.86 KB
/
matrices.hpp
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
#pragma once
#include <vector>
#include "complex.hpp"
#include <utility>
#include <stdexcept>
class Matrix
{
private:
//порядок и тип матрицы:
//0 - общий вид, 1 - теплицева,
//2 - циркулянтная, 3 - Фурье
unsigned int _columnIndex;
unsigned int _rowIndex;
int _type;
std::vector<std::vector<Complex>> _coefs;
public:
Matrix(int type, unsigned int columnIndex, unsigned int rowIndex);
//возвращает пару: число столбцов, число строк
std::pair<unsigned int, unsigned int> getOrder() const;
//возвращает коэффициент с произвольной позиции
Complex getCoef(unsigned int columnPos, unsigned int rowPos) const;
//устанавливает коэффициент в произвольную позицию
void setCoef(unsigned int columnPos, unsigned int rowPos, Complex newCoef);
//устанавливает тип матрицы
void setType(int newType);
//изменяет размер до ближайшей степени двойки
void setCorrectSize();
//распечатывает матрицу
void print() const;
Matrix operator*(Matrix matrix)
{
//подготовка к перемножению, инициализация произведения
auto matrixParams = matrix.getOrder();
Matrix result(0, std::get<0>(matrixParams), _rowIndex);
for(unsigned int lRowIter = 0; lRowIter < _rowIndex; ++lRowIter)
{
for(unsigned int rColumnIter = 0; rColumnIter < std::get<0>(matrixParams); ++rColumnIter)
{
Complex sum;
for(unsigned int multIter = 0; multIter < _columnIndex; ++multIter)
{
sum = sum + _coefs[multIter][lRowIter] * matrix.getCoef(rColumnIter, multIter);
}
result.setCoef(rColumnIter, lRowIter, sum);
}
}
return result;
}
};