libcamera: vector: Extend matrix multiplication operator to heterogenous types

It is useful to multiply matrices and vectors of heterogeneous types, for
instance float and double. Extend the multiplication operator to support
this, avoiding the need to convert one of the operations. The type of the
returned vector is selected automatically to avoid loosing precision.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
This commit is contained in:
Laurent Pinchart 2025-04-03 17:49:13 +02:00 committed by Stefan Klug
parent 754798b664
commit 1e67b96fb0
2 changed files with 8 additions and 6 deletions

View file

@ -13,6 +13,7 @@
#include <numeric> #include <numeric>
#include <optional> #include <optional>
#include <ostream> #include <ostream>
#include <type_traits>
#include <libcamera/base/log.h> #include <libcamera/base/log.h>
#include <libcamera/base/span.h> #include <libcamera/base/span.h>
@ -295,13 +296,13 @@ private:
template<typename T> template<typename T>
using RGB = Vector<T, 3>; using RGB = Vector<T, 3>;
template<typename T, unsigned int Rows, unsigned int Cols> template<typename T, typename U, unsigned int Rows, unsigned int Cols>
Vector<T, Rows> operator*(const Matrix<T, Rows, Cols> &m, const Vector<T, Cols> &v) Vector<std::common_type_t<T, U>, Rows> operator*(const Matrix<T, Rows, Cols> &m, const Vector<U, Cols> &v)
{ {
Vector<T, Rows> result; Vector<std::common_type_t<T, U>, Rows> result;
for (unsigned int i = 0; i < Rows; i++) { for (unsigned int i = 0; i < Rows; i++) {
T sum = 0; std::common_type_t<T, U> sum = 0;
for (unsigned int j = 0; j < Cols; j++) for (unsigned int j = 0; j < Cols; j++)
sum += m[i][j] * v[j]; sum += m[i][j] * v[j];
result[i] = sum; result[i] = sum;

View file

@ -308,9 +308,10 @@ LOG_DEFINE_CATEGORY(Vector)
*/ */
/** /**
* \fn Vector<T, Rows> operator*(const Matrix<T, Rows, Cols> &m, const Vector<T, Cols> &v) * \fn operator*(const Matrix<T, Rows, Cols> &m, const Vector<U, Cols> &v)
* \brief Multiply a matrix by a vector * \brief Multiply a matrix by a vector
* \tparam T Numerical type of the contents of the matrix and vector * \tparam T Numerical type of the contents of the matrix
* \tparam U Numerical type of the contents of the vector
* \tparam Rows The number of rows in the matrix * \tparam Rows The number of rows in the matrix
* \tparam Cols The number of columns in the matrix (= rows in the vector) * \tparam Cols The number of columns in the matrix (= rows in the vector)
* \param m The matrix * \param m The matrix