1 #ifndef math_Matrix_H__
2 #define math_Matrix_H__
20 typedef std::vector<Entry>::reference
EntryRef ;
21 typedef std::vector<Entry>::const_reference
EntryRefK;
26 std::vector<Entry> entries_;
29 rows_(0), cols_(0), entries_(0) {
31 Myself(Myself
const& b):
32 rows_(b.rows_), cols_(b.cols_), entries_(b.entries_) {
34 Myself(
size_t r,
size_t c, Entry
const& e):
35 rows_(r), cols_(c),
entries(r * c, e) {
40 size_t index(
size_t r,
size_t c)
const {
74 Matrix(
size_t r,
size_t c, Entry
const& e): self(Myself(r, c, e)) {
107 void reset(
size_t r,
size_t c, Entry
const& e) {
110 self()->entries_.clear();
111 self()->entries_.resize(r * c, e);
143 size_t rows(
size_t r, Entry
const& e) {
145 self()->entries_.resize(r *
cols(), e);
160 size_t cols(
size_t c, Entry
const& e) {
164 self()->entries_.resize(
rows() * c);
166 for (
size_t i = 0, I =
rows(); i < I; i++) {
167 size_t j, J1 = std::min(old->cols_,
cols()), J2 =
cols();
168 for (j = 0; j < J1; j++)
169 self()->entries_[
self->index(i, j)] = old->entries_[old->index(i, j)];
170 for (j = J1; j < J2; j++)
171 self()->entries_[
self->index(i, j)] = e;
187 size_t size(
size_t r,
size_t c, Entry
const& e) {
195 return self->entries_[
self->index(r, c)];
200 self()->entries_[self->index(r, c)] = e;
206 return self()->entries_[self->index(r, c)];
220 ssize_t cFirst, ssize_t cLast,
222 for (ssize_t r = rFirst; r <= rLast; r++) {
223 for (ssize_t c = cFirst; c <=cFirst; c++) {
241 size_t cFirst,
size_t cLast)
const {
242 if (rFirst > rLast || cFirst > cLast)
return Matrix();
243 if (rFirst == 0 || cFirst == 0) {
245 ret.
size(rLast + 1, cLast + 1, Entry(0));
248 Matrix ret(rLast - rFirst + 1, cLast - cFirst + 1,
entry(rFirst, cFirst));
249 for (
size_t r = rFirst; r <= rLast; r++)
250 for (
size_t c = cFirst; c <= cLast; c++)
251 ret.
entry(r - rFirst, c - cFirst,
entry(r, c));
273 for (
size_t r = 0, R =
rows(); r < R; r++)
274 for (
size_t c = 0, C =
cols(); c < C; c++)
286 for (
size_t r = 0, R =
rows(); r < R; r++)
287 for (
size_t c = 0, C =
cols(); c < C; c++)
299 for (
size_t r = 0, R =
rows(); r < R; r++)
300 for (
size_t c = 0, C =
cols(); c < C; c++)
312 for (
size_t r = 0, R =
rows(); r < R; r++)
313 for (
size_t c = 0, C = m.
cols(); c < C; c++)
314 for (
size_t k = 0, K =
cols(); k < K; k++)
322 for (
size_t r = 0, R =
rows(); r < R; r++)
323 for (
size_t c = 0, C =
cols(); c < C; c++)
331 for (
size_t r = 0, R =
rows(); r < R; r++)
332 for (
size_t c = 0, C =
cols(); c < C; c++)
350 for (
size_t r = 0, R =
rows(); r < R; r++)
351 for (
size_t c = 0, C =
cols(); c < C; c++)
352 entry(r, c, (r == c ? Entry(1) : Entry(0)));
364 for (
size_t r = 0, R =
rows(); r < R; r++) {
365 for (
size_t c = 0, C =
cols(); c < C; c++) {
367 tmp.
entry(r, c +
cols(), (r == c ? Entry(1) : Entry(0)));
371 for (ssize_t r =
rows() - 1; r >= 0; r--) {
373 for (ssize_t r2 = r - 1; r2 >= 0; r2--) {
374 Entry rat(-tmp.
entry(r2, r) / tmp.
entry(r, r));
375 for (
size_t c = r, C = tmp.
cols(); c < C; c++) {
376 tmp.
entry(r2, c, tmp.
entry(r2, c) + rat * tmp(r, c));
379 Entry rat(tmp.
entry(r, r));
380 for (
size_t c =
cols(), C = tmp.
cols(); c < C; c++) {
397 for (
size_t r = 0, R =
cols(); r < R; r++)
398 for (
size_t c = 0, C =
rows(); c < C; c++)
418 for (
size_t r = 0, c = 0, R =
rows(), C =
cols(); r < R && c < C; r++) {
420 for ( ; c < C; c++) {
422 for (
size_t r2 = r; r2 < R; r2++)
425 if (
entry(maxR, c) != Entry(0))
break;
428 if (maxR != (ssize_t)r) {
429 for (
size_t c2 = c; c2 < C; c2++)
430 std::swap(
self()->entries_[self->index( r, c2)],
431 self()->entries_[self->index(maxR, c2)]);
433 for (
size_t r2 = r + 1; r2 < R; r2++) {
435 entry(r2, c, Entry(0));
436 for (
size_t c2 = c + 1; c2 < C; c2++)
455 return entry(r, c, e);
496 #endif // math_Matrix_H__