Loading...
Searching...
No Matches
matrix.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cassert>
4#include <cstddef>
5#include <vector>
6
7namespace q3 {
8
9/**
10 * A simple, contiguous 2D array class to replace std::vector<std::vector<T>>.
11 * This prevents memory fragmentation and improves cache locality in HPC contexts.
12 */
13template <typename T> class [[nodiscard]] Matrix {
14 private:
15 std::vector<T> data_;
16 size_t rows_;
17 size_t cols_;
18
19 public:
20 Matrix() : rows_(0), cols_(0) {}
21
22 Matrix(size_t rows, size_t cols, const T& initial_value = T())
23 : data_(rows * cols, initial_value), rows_(rows), cols_(cols) {}
24
25 /// Resizes the matrix, invalidating previous content structure if dimensions change
26 void resize(size_t rows, size_t cols) {
27 data_.resize(rows * cols);
28 rows_ = rows;
29 cols_ = cols;
30 }
31
32 void resize(size_t rows, size_t cols, const T& initial_value) {
33 data_.assign(rows * cols, initial_value);
34 rows_ = rows;
35 cols_ = cols;
36 }
37
38 void assign(size_t rows, size_t cols, const T& initial_value) {
39 data_.assign(rows * cols, initial_value);
40 rows_ = rows;
41 cols_ = cols;
42 }
43
44 /// Access row `row_index`. Allows matrix[row_index][column_index] syntax to remain valid.
45 T* operator[](size_t row_index) {
46 return data_.data() + row_index * cols_;
47 }
48
49 [[nodiscard]] const T* operator[](size_t row_index) const {
50 return data_.data() + row_index * cols_;
51 }
52
53 /// 2D indexing operator
54 T& operator()(size_t row_index, size_t column_index) {
55 return data_[row_index * cols_ + column_index];
56 }
57
58 [[nodiscard]] const T& operator()(size_t row_index, size_t column_index) const {
59 return data_[row_index * cols_ + column_index];
60 }
61
62 [[nodiscard]] size_t rows() const {
63 return rows_;
64 }
65 [[nodiscard]] size_t cols() const {
66 return cols_;
67 }
68
69 /// Returns the number of rows (to mimic outer std::vector::size())
70 [[nodiscard]] size_t size() const {
71 return rows_;
72 }
73
74 /// Returns the underlying flat data pointer
75 T* data() {
76 return data_.data();
77 }
78 [[nodiscard]] const T* data() const {
79 return data_.data();
80 }
81
82 /// Returns raw vector (useful for MPI calls that need contiguous block)
83 std::vector<T>& raw() {
84 return data_;
85 }
86 [[nodiscard]] const std::vector<T>& raw() const {
87 return data_;
88 }
89
90 [[nodiscard]] bool empty() const {
91 return data_.empty();
92 }
93};
94
95} // namespace q3
const T * data() const
Definition matrix.hpp:78
Matrix(size_t rows, size_t cols, const T &initial_value=T())
Definition matrix.hpp:22
size_t rows() const
Definition matrix.hpp:62
bool empty() const
Definition matrix.hpp:90
T * data()
Returns the underlying flat data pointer.
Definition matrix.hpp:75
void resize(size_t rows, size_t cols, const T &initial_value)
Definition matrix.hpp:32
std::vector< T > & raw()
Returns raw vector (useful for MPI calls that need contiguous block)
Definition matrix.hpp:83
const std::vector< T > & raw() const
Definition matrix.hpp:86
const T * operator[](size_t row_index) const
Definition matrix.hpp:49
void assign(size_t rows, size_t cols, const T &initial_value)
Definition matrix.hpp:38
void resize(size_t rows, size_t cols)
Resizes the matrix, invalidating previous content structure if dimensions change.
Definition matrix.hpp:26
size_t cols() const
Definition matrix.hpp:65
T * operator[](size_t row_index)
Access row row_index. Allows matrix[row_index][column_index] syntax to remain valid.
Definition matrix.hpp:45
const T & operator()(size_t row_index, size_t column_index) const
Definition matrix.hpp:58
size_t size() const
Returns the number of rows (to mimic outer std::vector::size())
Definition matrix.hpp:70
T & operator()(size_t row_index, size_t column_index)
2D indexing operator
Definition matrix.hpp:54