30#include <initializer_list>
35namespace fuzzy_transfer_distance
41 Matrix(
const size_t rows,
const size_t columns);
42 Matrix(
const std::initializer_list<std::initializer_list<T>> init);
48 void resize(
const size_t rows,
const size_t columns,
const T default_value = 0);
51 T &operator()(
const size_t x,
const size_t y);
52 const T &operator()(
const size_t x,
const size_t y)
const;
57 inline size_t minsize()
59 return ((m_rows < m_columns) ? m_rows : m_columns);
62 inline size_t columns()
const
66 inline size_t rows()
const
71 friend std::ostream &operator<<(std::ostream &os,
const Matrix &matrix)
73 os <<
"Matrix:" << std::endl;
74 for (
size_t row = 0; row < matrix.rows(); row++)
76 for (
size_t col = 0; col < matrix.columns(); col++)
79 os << matrix(row, col) <<
",";
99template <
class T> Matrix<T>::Matrix(
const std::initializer_list<std::initializer_list<T>> init)
102 m_rows = init.size();
109 m_columns = init.begin()->size();
112 resize(m_rows, m_columns);
117 for (
auto row = init.begin(); row != init.end(); ++row, ++i)
119 assert(row->size() == m_columns &&
"All rows must have the same number of columns.");
121 for (
auto value = row->begin(); value != row->end(); ++value, ++j)
123 m_matrix[i][j] = *value;
128template <
class T> Matrix<T>::Matrix(
const Matrix<T> &other)
130 if (other.m_matrix !=
nullptr)
134 resize(other.m_rows, other.m_columns);
135 for (
size_t i = 0; i < m_rows; i++)
137 for (
size_t j = 0; j < m_columns; j++)
139 m_matrix[i][j] = other.m_matrix[i][j];
151template <
class T> Matrix<T>::Matrix(
const size_t rows,
const size_t columns)
154 resize(rows, columns);
157template <
class T> Matrix<T> &Matrix<T>::operator=(
const Matrix<T> &other)
159 if (other.m_matrix !=
nullptr)
162 resize(other.m_rows, other.m_columns);
163 for (
size_t i = 0; i < m_rows; i++)
165 for (
size_t j = 0; j < m_columns; j++)
167 m_matrix[i][j] = other.m_matrix[i][j];
174 for (
size_t i = 0; i < m_columns; i++)
176 delete[] m_matrix[i];
189template <
class T> Matrix<T>::~Matrix()
191 if (m_matrix !=
nullptr)
194 for (
size_t i = 0; i < m_rows; i++)
196 delete[] m_matrix[i];
204template <
class T>
void Matrix<T>::resize(
const size_t rows,
const size_t columns,
const T default_value)
206 assert(rows > 0 && columns > 0 &&
"Columns and rows must exist.");
208 if (m_matrix ==
nullptr)
211 m_matrix =
new T *[rows];
212 for (
size_t i = 0; i < rows; i++)
214 m_matrix[i] =
new T[columns];
226 new_matrix =
new T *[rows];
227 for (
size_t i = 0; i < rows; i++)
229 new_matrix[i] =
new T[columns];
230 for (
size_t j = 0; j < columns; j++)
232 new_matrix[i][j] = default_value;
237 size_t minrows = std::min(rows, m_rows);
238 size_t mincols = std::min(columns, m_columns);
239 for (
size_t x = 0; x < minrows; x++)
241 for (
size_t y = 0; y < mincols; y++)
243 new_matrix[x][y] = m_matrix[x][y];
248 if (m_matrix !=
nullptr)
250 for (
size_t i = 0; i < m_rows; i++)
252 delete[] m_matrix[i];
258 m_matrix = new_matrix;
265template <
class T>
void Matrix<T>::clear()
267 assert(m_matrix !=
nullptr);
269 for (
size_t i = 0; i < m_rows; i++)
271 for (
size_t j = 0; j < m_columns; j++)
278template <
class T>
inline T &Matrix<T>::operator()(
const size_t x,
const size_t y)
281 assert(y < m_columns);
282 assert(m_matrix !=
nullptr);
283 return m_matrix[x][y];
286template <
class T>
inline const T &Matrix<T>::operator()(
const size_t x,
const size_t y)
const
289 assert(y < m_columns);
290 assert(m_matrix !=
nullptr);
291 return m_matrix[x][y];
294template <
class T>
const T Matrix<T>::min()
const
296 assert(m_matrix !=
nullptr);
298 assert(m_columns > 0);
299 T min = m_matrix[0][0];
301 for (
size_t i = 0; i < m_rows; i++)
303 for (
size_t j = 0; j < m_columns; j++)
305 min = std::min<T>(min, m_matrix[i][j]);
312template <
class T>
const T Matrix<T>::max()
const
314 assert(m_matrix !=
nullptr);
316 assert(m_columns > 0);
317 T max = m_matrix[0][0];
319 for (
size_t i = 0; i < m_rows; i++)
321 for (
size_t j = 0; j < m_columns; j++)
323 max = std::max<T>(max, m_matrix[i][j]);
Generic components for polymorphism analysis.
Definition polymorphism.hpp:16