#ifndef ICL_FIXED_MATRIX_UTILS_H #define ICL_FIXED_MATRIX_UTILS_H #include #include namespace icl{ /// computes inner product of two matrices (element-wise scalar product) \ingroup LINALG template inline T inner_vector_product(const FixedMatrix &a, const FixedMatrix &b){ return std::inner_product(a.begin(),a.end(),b.begin(),T(0)); } /// computes the QR decomposition of a matrix \ingroup LINALG template inline void decompose_QR(FixedMatrix A, FixedMatrix &Q, FixedMatrix &R){ FixedColVector a,q; R = T(0.0); for (unsigned int i=0;i inline FixedMatrix pinv(const FixedMatrix &M){ if(HEIGHT < WIDTH){ FixedMatrix Q; FixedMatrix R; decompose_QR(M.transp(),Q,R); return (R.inv() * Q.transp()).transp(); }else{ FixedMatrix Q; FixedMatrix R; decompose_QR(M,Q,R); return R.inv() * Q.transp(); } } /// Vertical Matrix concatenation \ingroup LINALG /** like ICLQuick image concatenation, dont forget the brackets sometimes */ template inline FixedMatrix operator%(const FixedMatrix &a, const FixedMatrix &b){ FixedMatrix M; for(unsigned int i=0;i inline FixedMatrix operator,(const FixedMatrix &a, const FixedMatrix &b){ FixedMatrix M; for(unsigned int i=0;i