#pragma once #include #include #include #include "Vector.h" namespace J3ML::LinearAlgebra { template class Matrix { static constexpr uint Diag = std::min(ROWS, COLS); using RowVector = Vector; using ColVector = Vector; using DiagVector = Vector; enum { Rows = ROWS }; enum { Cols = COLS }; void AssertRowSize(uint rows) { assert(rows < Rows && ""); } void AssertColumnSize(uint cols) { assert(cols < Cols && ""); } RowVector GetRow(uint index) const; ColVector GetColumn(uint index) const; void SetRow(uint index, RowVector); void SetColumn(uint index, ColVector); RowVector &Row(uint index) const; ColVector &Column(uint index) const; const T At(uint row, uint col) const { AssertRowSize(row); AssertColumnSize(col); return elems[row][col]; } T &At(uint row, uint col) { AssertRowSize(row); AssertColumnSize(col); return elems[row][col]; } float* ptr(); const float* ptr() const; float operator[](uint index) const; float& operator[](uint index); private: T elems[ROWS][COLS]; }; }