summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2025-04-03 17:49:13 +0200
committerStefan Klug <stefan.klug@ideasonboard.com>2025-05-20 09:49:09 +0200
commit1e67b96fb0b6b45b9b73dc2e13833efff5254ee1 (patch)
tree58285c1494e41e9c25a37a339236184a4c22b868
parent754798b664888e55402bc5c5708e56fa461c0ba1 (diff)
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>
-rw-r--r--include/libcamera/internal/vector.h9
-rw-r--r--src/libcamera/vector.cpp5
2 files changed, 8 insertions, 6 deletions
diff --git a/include/libcamera/internal/vector.h b/include/libcamera/internal/vector.h
index 4e9ef1ee..16b6aef0 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 5567d5b8..4dad1b90 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