[PATCH] ipa: libipa: vector: Add matrix-vector multiplication

Paul Elder paul.elder at ideasonboard.com
Mon Jun 10 16:25:01 CEST 2024


On Mon, Jun 10, 2024 at 12:53:22PM +0100, Kieran Bingham wrote:
> Quoting Paul Elder (2024-06-07 09:20:45)
> > Add an operation for multiplying a matrix with a vector.
> > 
> > Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> > 
> > ---
> > Depends on v6 of "ipa: libipa: Add Matrix class" and v5 of "ipa: libipa:
> > Add Vector class"
> > ---
> >  src/ipa/libipa/vector.cpp | 12 ++++++++++++
> >  src/ipa/libipa/vector.h   | 22 ++++++++++++++++++++++
> >  2 files changed, 34 insertions(+)
> > 
> > diff --git a/src/ipa/libipa/vector.cpp b/src/ipa/libipa/vector.cpp
> > index bdc3c447c..e18426fe5 100644
> > --- a/src/ipa/libipa/vector.cpp
> > +++ b/src/ipa/libipa/vector.cpp
> > @@ -145,6 +145,18 @@ namespace ipa {
> >   * \return The length of the vector
> >   */
> >  
> > +/**
> > + * \fn Vector<T, R1> operator*(const Matrix<T, R1, C1> &m, const Vector<T, R2> &v)
> > + * \brief Multiply a matrix by a vector
> > + * \tparam T Numerical type of the contents of the matrix and vector
> > + * \tparam R1 The number of rows in the matrix
> > + * \tparam C1 The number of colums in the matrix
> > + * \tparam R2 The number of elements in the vector
> > + * \param m The matrix
> > + * \param v The vector
> > + * \return Product of matrix \a m and vector \a v
> > + */
> > +
> >  /**
> >   * \fn bool operator==(const Vector<T, R> &lhs, const Vector<T, R> &rhs)
> >   * \brief Compare vectors for equality
> > diff --git a/src/ipa/libipa/vector.h b/src/ipa/libipa/vector.h
> > index 87aad28b5..934b44494 100644
> > --- a/src/ipa/libipa/vector.h
> > +++ b/src/ipa/libipa/vector.h
> > @@ -17,6 +17,8 @@
> >  
> >  #include "libcamera/internal/yaml_parser.h"
> >  
> > +#include "matrix.h"
> > +
> >  namespace libcamera {
> >  
> >  LOG_DECLARE_CATEGORY(Vector)
> > @@ -166,6 +168,26 @@ private:
> >         std::array<T, R> data_;
> >  };
> >  
> > +#ifndef __DOXYGEN__
> > +template<typename T,
> > +        unsigned int R1, unsigned int C1,
> > +        unsigned int R2,
> > +        std::enable_if_t<std::is_arithmetic_v<T> && C1 == R2> * = nullptr>
> > +#endif /* __DOXYGEN__ */
> > +Vector<T, R1> operator*(const Matrix<T, R1, C1> &m, const Vector<T, R2> &v)
> > +{
> > +       Vector<T, R1> result;
> > +
> 
> Does this need to ASSERT(C1 == R2); or such?

It's in SFINAE... is that not sufficient?

> 
> Other than that it looks ok to me, but I haven't seen the usage yet (or
> tests :D)
> 
> 
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>


Thanks,

Paul

> 
> 
> > +       for (unsigned int i = 0; i < R1; i++) {
> > +               T sum = 0;
> > +               for (unsigned int j = 0; j < C1; j++)
> > +                       sum += m[i][j] * v[j];
> > +               result[i] = sum;
> > +       }
> > +
> > +       return result;
> > +}
> > +
> >  #ifndef __DOXYGEN__
> >  template<typename T, unsigned int R,
> >          std::enable_if_t<std::is_arithmetic_v<T>> * = nullptr>
> > -- 
> > 2.39.2
> >


More information about the libcamera-devel mailing list