14 #include <libcamera/base/span.h> 23 template<
typename T,
unsigned int Rows,
unsigned int Cols,
24 std::enable_if_t<std::is_arithmetic_v<T>> * =
nullptr>
26 template<
typename T,
unsigned int Rows,
unsigned int Cols>
33 data_.fill(static_cast<T>(0));
38 std::copy(data.begin(), data.end(), data_.begin());
44 for (
size_t i = 0; i < std::min(Rows, Cols); i++)
45 ret[i][i] = static_cast<T>(1);
53 std::stringstream out;
56 for (
unsigned int i = 0; i < Rows; i++) {
58 for (
unsigned int j = 0; j < Cols; j++) {
60 out << ((j + 1 < Cols) ?
", " :
" ");
62 out << ((i + 1 < Rows) ?
"], " :
"]");
69 Span<const T, Rows * Cols>
data()
const {
return data_; }
73 return Span<const T, Cols>{ &data_.data()[i * Cols], Cols };
78 return Span<T, Cols>{ &data_.data()[i * Cols], Cols };
82 template<
typename U, std::enable_if_t<std::is_arithmetic_v<U>>>
88 for (
unsigned int i = 0; i < Rows * Cols; i++)
94 std::array<T, Rows * Cols> data_;
98 template<
typename T,
typename U,
unsigned int Rows,
unsigned int Cols,
99 std::enable_if_t<std::is_arithmetic_v<T>> * =
nullptr>
101 template<
typename T,
typename U,
unsigned int Rows,
unsigned int Cols>
107 for (
unsigned int i = 0; i < Rows; i++) {
108 for (
unsigned int j = 0; j < Cols; j++)
109 result[i][j] = d * m[i][j];
116 template<
typename T,
typename U,
unsigned int Rows,
unsigned int Cols,
117 std::enable_if_t<std::is_arithmetic_v<T>> * =
nullptr>
119 template<
typename T,
typename U,
unsigned int Rows,
unsigned int Cols>
128 unsigned int R1,
unsigned int C1,
129 unsigned int R2,
unsigned int C2,
130 std::enable_if_t<C1 == R2> * =
nullptr>
132 template<
typename T,
unsigned int R1,
unsigned int C1,
unsigned int R2,
unsigned in C2>
138 for (
unsigned int i = 0; i < R1; i++) {
139 for (
unsigned int j = 0; j < C2; j++) {
142 for (
unsigned int k = 0; k < C1; k++)
143 sum += m1[i][k] * m2[k][j];
152 template<
typename T,
unsigned int Rows,
unsigned int Cols>
157 for (
unsigned int i = 0; i < Rows; i++) {
158 for (
unsigned int j = 0; j < Cols; j++)
159 result[i][j] = m1[i][j] + m2[i][j];
166 bool matrixValidateYaml(
const YamlObject &obj,
unsigned int size);
170 template<
typename T,
unsigned int Rows,
unsigned int Cols>
171 std::ostream &operator<<(std::ostream &out, const Matrix<T, Rows, Cols> &m)
177 template<
typename T,
unsigned int Rows,
unsigned int Cols>
178 struct YamlObject::Getter<Matrix<T, Rows, Cols>> {
179 std::optional<Matrix<T, Rows, Cols>>
get(
const YamlObject &obj)
const 181 if (!matrixValidateYaml(obj, Rows * Cols))
185 T *
data = &matrix[0][0];
189 const auto value = entry.get<T>();
Span< const T, Cols > operator[](size_t i) const
Index to a row in the matrix.
Definition: matrix.h:71
Top-level libcamera namespace.
Definition: backtrace.h:17
Span< T, Cols > operator[](size_t i)
Index to a row in the matrix.
Definition: matrix.h:76
ListAdapter asList() const
Wrap a list YamlObject in an adapter that exposes iterators.
Definition: yaml_parser.h:206
Matrix< T, Rows, Cols > operator+(const Matrix< T, Rows, Cols > &m1, const Matrix< T, Rows, Cols > &m2)
Matrix addition.
Definition: matrix.h:153
Matrix< T, Rows, Cols > & operator*=(U d)
Multiply the matrix by a scalar in-place.
Definition: matrix.h:86
Matrix class.
Definition: matrix.h:28
Matrix< U, Rows, Cols > operator*(T d, const Matrix< U, Rows, Cols > &m)
Multiply the matrix by a scalar.
Definition: matrix.h:103
const std::string toString() const
Assemble and return a string describing the matrix.
Definition: matrix.h:51
#define LOG_DECLARE_CATEGORY(name)
Declare a category of log messages.
Matrix()
Construct a zero matrix.
Definition: matrix.h:31
A class representing the tree structure of the YAML content.
Definition: yaml_parser.h:27
Matrix(const std::array< T, Rows *Cols > &data)
Construct a matrix from supplied data.
Definition: matrix.h:36
Span< const T, Rows *Cols > data() const
Access the matrix data as a linear array.
Definition: matrix.h:69
static Matrix identity()
Construct an identity matrix.
Definition: matrix.h:41