@@ -26,22 +26,44 @@ namespace cp_algo::linalg {
26
26
27
27
matrix (Base const & t): Base(t) {}
28
28
matrix (Base &&t): Base(std::move(t)) {}
29
-
30
- static matrix from (auto &&r) {
31
- return std::ranges::to<Base>(r);
32
- }
29
+
30
+ template <std::ranges::input_range R>
31
+ matrix (R &&r): Base(std::ranges::to<Base>(std::forward<R>(r))) {}
33
32
34
33
size_t n () const {return size (*this );}
35
34
size_t m () const {return n () ? size (row (0 )) : 0 ;}
36
- auto dim () const {return std::array{n (), m ()};}
35
+
36
+ void resize (size_t n, size_t m) {
37
+ Base::resize (n);
38
+ for (auto &it: *this ) {
39
+ it.resize (m);
40
+ }
41
+ }
37
42
38
43
auto & row (size_t i) {return (*this )[i];}
39
44
auto const & row (size_t i) const {return (*this )[i];}
40
45
46
+ auto elements () {return *this | std::views::join;}
47
+ auto elements () const {return *this | std::views::join;}
41
48
42
- auto operator -() const {
43
- return from ( *this | std::views::transform ([](auto x) {return vec_t (-x);}) );
49
+ matrix operator -() const {
50
+ return *this | std::views::transform ([](auto x) {return vec_t (-x);});
44
51
}
52
+ matrix& operator +=(matrix const & t) {
53
+ for (auto [a, b]: std::views::zip (elements (), t.elements ())) {
54
+ a += b;
55
+ }
56
+ return *this ;
57
+ }
58
+ matrix& operator -=(matrix const & t) {
59
+ for (auto [a, b]: std::views::zip (elements (), t.elements ())) {
60
+ a -= b;
61
+ }
62
+ return *this ;
63
+ }
64
+ matrix operator +(matrix const & t) const {return matrix (*this ) += t;}
65
+ matrix operator -(matrix const & t) const {return matrix (*this ) -= t;}
66
+
45
67
matrix& operator *=(base t) {for (auto &it: *this ) it *= t; return *this ;}
46
68
matrix operator *(base t) const {return matrix (*this ) *= t;}
47
69
matrix& operator /=(base t) {return *this *= base (1 ) / t;}
@@ -109,6 +131,11 @@ namespace cp_algo::linalg {
109
131
}
110
132
return res;
111
133
}
134
+ void assign_submatrix (auto viewx, auto viewy, matrix const & t) {
135
+ for (auto [a, b]: std::views::zip (*this | viewx, t)) {
136
+ std::ranges::copy (b, begin (a | viewy));
137
+ }
138
+ }
112
139
auto submatrix (auto viewx, auto viewy) const {
113
140
return *this | viewx | std::views::transform ([viewy](auto const & y) {
114
141
return y | viewy;
@@ -214,7 +241,7 @@ namespace cp_algo::linalg {
214
241
det *= b[i][i];
215
242
b[i] *= base (1 ) / b[i][i];
216
243
}
217
- return {det, from ( b.submatrix (std::views::all, std::views::drop (n () )))};
244
+ return {det, b.submatrix (std::views::all, std::views::drop (n ()))};
218
245
}
219
246
220
247
// Can also just run gauss on T() | eye(m)
@@ -238,15 +265,15 @@ namespace cp_algo::linalg {
238
265
// [solution, basis], transposed
239
266
std::optional<std::array<matrix, 2 >> solve (matrix t) const {
240
267
matrix sols = (*this | t).kernel ();
241
- if (sols.n () < t.m () || from (sols.submatrix (
268
+ if (sols.n () < t.m () || matrix (sols.submatrix (
242
269
std::views::drop (sols.n () - t.m ()),
243
270
std::views::drop (m ())
244
271
)) != -eye (t.m ())) {
245
272
return std::nullopt;
246
273
} else {
247
274
return std::array{
248
- from (sols.submatrix (std::views::drop (sols.n () - t.m ()), std::views::take (m ()))),
249
- from (sols.submatrix (std::views::take (sols.n () - t.m ()), std::views::take (m ())))
275
+ matrix (sols.submatrix (std::views::drop (sols.n () - t.m ()), std::views::take (m ()))),
276
+ matrix (sols.submatrix (std::views::take (sols.n () - t.m ()), std::views::take (m ())))
250
277
};
251
278
}
252
279
}
0 commit comments