[PATCH v2 07/17] libcamera: matrix: Extend multiplication operator to heterogenous types
Kieran Bingham
kieran.bingham at ideasonboard.com
Mon Mar 31 19:08:42 CEST 2025
Quoting Stefan Klug (2025-03-19 16:11:12)
> From: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>
> It is useful to multiply matrices of heterogneous types, for instance
> float and double. Extend the multiplication operator to support this,
> avoiding the need to convert one of the matrices. The type of the
> returned matrix is selected automatically to avoid loosing precision.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Posted by Stefan, so should probably have your SoB - (or at least RB tag
now :D)
But this sounds like something that will be helpful later in this
series...
Acked-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
> ---
>
> Changes in v2:
> - Added this patch
> ---
> include/libcamera/internal/matrix.h | 10 ++++++----
> src/libcamera/matrix.cpp | 5 +++--
> 2 files changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/include/libcamera/internal/matrix.h b/include/libcamera/internal/matrix.h
> index 6e3c190286fe..688c6fd498f3 100644
> --- a/include/libcamera/internal/matrix.h
> +++ b/include/libcamera/internal/matrix.h
> @@ -8,6 +8,7 @@
>
> #include <algorithm>
> #include <sstream>
> +#include <type_traits>
> #include <vector>
>
> #include <libcamera/base/log.h>
> @@ -129,15 +130,16 @@ constexpr Matrix<U, Rows, Cols> operator*(const Matrix<U, Rows, Cols> &m, T d)
> return d * m;
> }
>
> -template<typename T, unsigned int R1, unsigned int C1, unsigned int R2, unsigned int C2>
> -constexpr Matrix<T, R1, C2> operator*(const Matrix<T, R1, C1> &m1, const Matrix<T, R2, C2> &m2)
> +template<typename T1, unsigned int R1, unsigned int C1, typename T2, unsigned int R2, unsigned int C2>
> +constexpr Matrix<std::common_type_t<T1, T2>, R1, C2> operator*(const Matrix<T1, R1, C1> &m1,
> + const Matrix<T2, R2, C2> &m2)
> {
> static_assert(C1 == R2, "Matrix dimensions must match for multiplication");
> - Matrix<T, R1, C2> result;
> + Matrix<std::common_type_t<T1, T2>, R1, C2> result;
>
> for (unsigned int i = 0; i < R1; i++) {
> for (unsigned int j = 0; j < C2; j++) {
> - T sum = 0;
> + std::common_type_t<T1, T2> sum = 0;
>
> for (unsigned int k = 0; k < C1; k++)
> sum += m1[i][k] * m2[k][j];
> diff --git a/src/libcamera/matrix.cpp b/src/libcamera/matrix.cpp
> index 8590f8efeff3..f9117357dc7e 100644
> --- a/src/libcamera/matrix.cpp
> +++ b/src/libcamera/matrix.cpp
> @@ -138,11 +138,12 @@ LOG_DEFINE_CATEGORY(Matrix)
> */
>
> /**
> - * \fn Matrix<T, R1, C2> operator*(const Matrix<T, R1, C1> &m1, const Matrix<T, R2, C2> &m2)
> + * \fn operator*(const Matrix<T1, R1, C1> &m1, const Matrix<T2, R2, C2> &m2)
> * \brief Matrix multiplication
> - * \tparam T Type of numerical values in the matrices
> + * \tparam T1 Type of numerical values in the first matrix
> * \tparam R1 Number of rows in the first matrix
> * \tparam C1 Number of columns in the first matrix
> + * \tparam T2 Type of numerical values in the secont matrix
> * \tparam R2 Number of rows in the second matrix
> * \tparam C2 Number of columns in the second matrix
> * \param m1 Multiplicand matrix
> --
> 2.43.0
>
More information about the libcamera-devel
mailing list