61    template<
typename T, 
size_t rowCount, 
size_t colCount>
 
   64        static_assert(rowCount > 0 && colCount > 0, 
"rowCount and colCount must be > 0");
 
   67        using Storage = std::array<T, rowCount * colCount>;
 
   69        static constexpr bool invertSupported = ((rowCount == 4 && colCount == 4) || (rowCount == 3 && colCount == 3))
 
   70                                                && (std::is_same<T, float>::value || std::is_same<T, double>::value);
 
   91        static constexpr size_t rows{ rowCount };
 
   96        static constexpr size_t cols{ colCount };
 
  108        explicit Matrix(
const std::array<T, colCount * rowCount> &arrArr)
 
  113        template<
typename Iterator>
 
  116            if(std::distance(beginIt, endIt) != 
rows * 
cols)
 
  118                 throw std::out_of_range(
 
  119                    "Matrix constructor got input that does not match matrix size. Expected " 
  120                    + std::to_string(
rows * 
cols) + 
" items, got " + std::to_string(std::distance(beginIt, endIt))
 
  124            std::copy(beginIt, endIt, m_mat.begin());
 
  128        explicit Matrix(std::initializer_list<T> values)
 
  133        explicit Matrix(std::initializer_list<std::initializer_list<T>> values)
 
  135            if(values.size() != 
rows)
 
  137                throw std::out_of_range(
 
  138                    "Matrix constructor got input that does not match matrix size. Expected " + std::to_string(
rows)
 
  139                    + 
" rows, got " + std::to_string(values.size()) + 
" rows");
 
  142            auto iterator = 
begin();
 
  143            for(
const auto &row : values)
 
  145                if(row.size() != 
cols)
 
  147                    throw std::out_of_range(
 
  148                        "Matrix constructor got input that does not match matrix size. Expected all rows to be of size " 
  149                        + std::to_string(
cols) + 
", got row with " + std::to_string(row.size()) + 
" values");
 
  151                std::copy(std::begin(row), std::end(row), iterator);
 
  152                std::advance(iterator, 
cols);
 
  159            return m_mat.begin();
 
  171            return m_mat.begin();
 
  183            return m_mat.cbegin();
 
  193        T &
at(
size_t row, 
size_t col)
 
  195            throwIfOutOfBounds(row, col);
 
  196            return m_mat[row * 
cols + col];
 
  200        const T &
at(
size_t row, 
size_t col)
 const 
  202            throwIfOutOfBounds(row, col);
 
  203            return m_mat[row * 
cols + col];
 
  209            return m_mat[row * 
cols + col];
 
  215            return m_mat[row * 
cols + col];
 
  234        void save(
const std::string &fileName) 
const;
 
  241        void load(
const std::string &fileName);
 
  248        template<typename Q = T, typename = typename std::enable_if<invertSupported, Q>::type>
 
  255            std::stringstream ss;
 
  257            for(
size_t row = 0; row < rowCount; row++)
 
  259                ss << (row == 0 ? 
"[" : 
"\n  [");
 
  260                for(
size_t col = 0; col < colCount; col++)
 
  262                    const auto value{ m_mat[row * colCount + col] };
 
  263                    ss << (value >= 0 ? 
" " : 
"") << std::to_string(value);
 
  264                    ss << (col == colCount - 1 ? 
"" : 
", ");
 
  266                ss << (row == rowCount - 1 ? 
"]" : 
"], ");
 
  273        static void throwIfOutOfBounds(
size_t row, 
size_t col)
 
  277                throw std::out_of_range{ 
"Trying to access row with index " + std::to_string(row)
 
  278                                         + 
", but allowed range is [0, " + std::to_string(
rows - 1) + 
"]" };
 
  282                throw std::out_of_range{ 
"Trying to access column with index " + std::to_string(col)
 
  283                                         + 
", but allowed range is [0, " + std::to_string(
cols - 1) + 
"]" };
 
  291    template<
typename T, 
size_t rowCount, 
size_t colCount>
 
  322        saveFloatMatrix(
const float *data, 
size_t rowCount, 
size_t colCount, 
const std::string &fileName);
 
  325        loadFloatMatrix(
float *data, 
size_t rowCount, 
size_t colCount, 
const std::string &fileName);
 
  330    extern template ZIVID_CORE_EXPORT Matrix<float, 4, 4> Matrix<float, 4, 4>::inverse<float, float>() 
const;
 
  332    extern template ZIVID_CORE_EXPORT Matrix<double, 4, 4> Matrix<double, 4, 4>::inverse<double, double>() 
const;
 
  334    extern template ZIVID_CORE_EXPORT Matrix<float, 3, 3> Matrix<float, 3, 3>::inverse<float, float>() 
const;
 
  336    extern template ZIVID_CORE_EXPORT Matrix<double, 3, 3> Matrix<double, 3, 3>::inverse<double, double>() 
const;
 
  338    template<
typename T, 
size_t rowCount, 
size_t colCount>
 
  341        static_assert(std::is_same<T, float>::value, 
"Saving matrices of this type is not supported");
 
  343        Detail::saveFloatMatrix(data(), rowCount, colCount, fileName);
 
  346    template<
typename T, 
size_t rowCount, 
size_t colCount>
 
  349        static_assert(std::is_same<T, float>::value, 
"Loading matrices of this type is not supported");
 
  351        Detail::loadFloatMatrix(data(), rowCount, colCount, fileName);
 
#define ZIVID_CORE_EXPORT
Definition CoreExport.h:56
 
A fixed size matrix in row major order.
Definition Matrix.h:63
 
static constexpr size_t rows
The number of rows in the matrix.
Definition Matrix.h:91
 
T ValueType
The type stored in the matrix.
Definition Matrix.h:76
 
T * data()
Pointer to the underlying data.
Definition Matrix.h:219
 
void load(const std::string &fileName)
Load the matrix from the given file.
 
ConstIterator begin() const
Iterator to the beginning of the matrix.
Definition Matrix.h:169
 
void save(const std::string &fileName) const
Save the matrix to the given file.
 
typename Storage::iterator Iterator
The matrix iterator type for mutable access. It iterates over individual matrix elements in row major...
Definition Matrix.h:81
 
Matrix(Iterator beginIt, Iterator endIt)
Constructor.
Definition Matrix.h:114
 
Matrix(std::initializer_list< T > values)
Constructor.
Definition Matrix.h:128
 
Matrix(const std::array< T, colCount *rowCount > &arrArr)
Constructor.
Definition Matrix.h:108
 
Matrix(const std::string &fileName)
Load the matrix from a file.
Definition Matrix.h:102
 
const T * data() const
Pointer to the underlying data.
Definition Matrix.h:225
 
static constexpr size_t cols
The number of columns in the matrix.
Definition Matrix.h:96
 
Iterator begin()
Iterator to the beginning of the matrix.
Definition Matrix.h:157
 
Matrix()=default
Constructor.
 
ConstIterator cbegin() const
Iterator to the beginning of the matrix.
Definition Matrix.h:181
 
T & at(size_t row, size_t col)
Access specified element with bounds checking.
Definition Matrix.h:193
 
std::string toString() const
Get string representation of the Matrix.
Definition Matrix.h:253
 
ConstIterator end() const
Iterator to the end of the matrix.
Definition Matrix.h:175
 
Matrix(std::initializer_list< std::initializer_list< T > > values)
Constructor.
Definition Matrix.h:133
 
const T & at(size_t row, size_t col) const
Access specified element with bounds checking.
Definition Matrix.h:200
 
const T & operator()(size_t row, size_t col) const
Access specified element without bounds checking.
Definition Matrix.h:213
 
Iterator end()
Iterator to the end of the matrix.
Definition Matrix.h:163
 
ZIVID_CORE_EXPORT Matrix inverse() const
Get the inverse of this matrix.
 
ConstIterator cend() const
Iterator to the end of the matrix.
Definition Matrix.h:187
 
T & operator()(size_t row, size_t col)
Access specified element without bounds checking.
Definition Matrix.h:207
 
typename Storage::const_iterator ConstIterator
The matrix iterator type for immutable access. It iterates over individual matrix elements in row maj...
Definition Matrix.h:86
 
The main Zivid namespace. All Zivid code is found here.
Definition Application.h:54
 
std::ostream & operator<<(std::ostream &stream, const Array2D< T > &array)
Serialize array information to a stream.
Definition Array2D.h:285