[PATCH v3 08/16] libcamera: vector: Extend matrix multiplication operator to heterogenous types
Stefan Klug
stefan.klug at ideasonboard.com
Thu Apr 3 17:49:13 CEST 2025
From: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
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 at ideasonboard.com>
Signed-off-by: Stefan Klug <stefan.klug at ideasonboard.com>
Acked-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
---
Changes in v2:
- Added this patch
Changes in v3:
- Collected tag
---
include/libcamera/internal/vector.h | 9 +++++----
src/libcamera/vector.cpp | 5 +++--
2 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/include/libcamera/internal/vector.h b/include/libcamera/internal/vector.h
index 4e9ef1ee6853..16b6aef0b38f 100644
--- a/include/libcamera/internal/vector.h
+++ b/include/libcamera/internal/vector.h
@@ -13,6 +13,7 @@
#include <numeric>
#include <optional>
#include <ostream>
+#include <type_traits>
#include <libcamera/base/log.h>
#include <libcamera/base/span.h>
@@ -295,13 +296,13 @@ private:
template<typename T>
using RGB = Vector<T, 3>;
-template<typename T, unsigned int Rows, unsigned int Cols>
-Vector<T, Rows> operator*(const Matrix<T, Rows, Cols> &m, const Vector<T, Cols> &v)
+template<typename T, typename U, unsigned int Rows, unsigned int Cols>
+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++) {
- T sum = 0;
+ std::common_type_t<T, U> sum = 0;
for (unsigned int j = 0; j < Cols; j++)
sum += m[i][j] * v[j];
result[i] = sum;
diff --git a/src/libcamera/vector.cpp b/src/libcamera/vector.cpp
index 5567d5b8defb..4dad1b9001c5 100644
--- a/src/libcamera/vector.cpp
+++ b/src/libcamera/vector.cpp
@@ -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
- * \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 Cols The number of columns in the matrix (= rows in the vector)
* \param m The matrix
--
2.43.0
More information about the libcamera-devel
mailing list