28 #ifndef mrpt_math_matrix_ops_H
29 #define mrpt_math_matrix_ops_H
61 template <
size_t NROWS,
size_t NCOLS>
65 ASSERTMSG_(M.cols()==aux.cols() && M.rows()==aux.rows(),
format(
"Size mismatch: deserialized is %ux%u, expected is %ux%u",(
unsigned)aux.getRowCount(),(unsigned)aux.getColCount(),(unsigned)NROWS,(
unsigned)NCOLS))
70 template <
size_t NROWS,
size_t NCOLS>
74 ASSERTMSG_(M.cols()==aux.cols() && M.rows()==aux.rows(),
format(
"Size mismatch: deserialized is %ux%u, expected is %ux%u",(
unsigned)aux.getRowCount(),(unsigned)aux.getColCount(),(unsigned)NROWS,(
unsigned)NCOLS))
80 template <
size_t NROWS,
size_t NCOLS>
81 mrpt::utils::CStream &operator<<(mrpt::utils::CStream &out,const CMatrixFixedNumeric<float,NROWS,NCOLS> & M) {
83 out.WriteObject(&aux);
87 template <
size_t NROWS,
size_t NCOLS>
88 mrpt::utils::CStream &operator<<(mrpt::utils::CStream &out,const CMatrixFixedNumeric<double,NROWS,NCOLS> & M) {
90 out.WriteObject(&aux);
102 template <
typename T,
size_t NROWS,
size_t NCOLS>
103 inline std::ostream & operator << (std::ostream & s, const CMatrixFixedNumeric<T,NROWS,NCOLS>& m)
105 Eigen::IOFormat fmt; fmt.matSuffix=
"\n";
106 return s << m.format(fmt);
111 inline std::ostream & operator << (std::ostream & s, const CMatrixTemplateNumeric<T>& m)
113 Eigen::IOFormat fmt; fmt.matSuffix=
"\n";
114 return s << m.format(fmt);
119 inline std::ostream & operator << (std::ostream & s, const mrpt::dynamicsize_vector<T>& m)
121 Eigen::IOFormat fmt; fmt.rowSeparator=
" "; fmt.matPrefix=
"["; fmt.matSuffix=
"]";
122 return s << m.format(fmt);
129 template <
class Derived>
130 inline const typename Eigen::MatrixBase<Derived>::AdjointReturnType
operator ~(
const Eigen::MatrixBase<Derived> &m) {
135 template <
class Derived>
136 inline typename Eigen::MatrixBase<Derived>::PlainObject
operator !(
const Eigen::MatrixBase<Derived> &m) {
144 template <
typename MAT_H,
typename MAT_C,
typename MAT_R>
149 bool accumResultInOutput )
151 if (accumResultInOutput)
152 R += ( (H * C.template selfadjointView<Eigen::Lower>()).eval() * H.adjoint()).eval().template selfadjointView<Eigen::Lower>();
154 R = ( (H * C.template selfadjointView<Eigen::Lower>()).eval() * H.adjoint()).eval().template selfadjointView<Eigen::Lower>();
158 template <
typename VECTOR_H,
typename MAT_C>
162 return (H.matrix().adjoint() * C * H.matrix()).eval()(0,0);
166 template <
typename MAT_H,
typename MAT_C,
typename MAT_R>
171 bool accumResultInOutput)
173 if (accumResultInOutput)
174 R += ( (H.adjoint() * C.template selfadjointView<Eigen::Lower>()).eval() * H).eval().template selfadjointView<Eigen::Lower>();
176 R = ( (H.adjoint() * C.template selfadjointView<Eigen::Lower>()).eval() * H).eval().template selfadjointView<Eigen::Lower>();
186 template<
class MAT_IN,
class VECTOR,
class MAT_OUT>
193 const size_t N = v.rows();
194 ASSERTMSG_(N>0,
"The input matrix contains no elements");
195 const double N_inv = 1.0/N;
197 const size_t M = v.cols();
198 ASSERTMSG_(M>0,
"The input matrix contains rows of length 0");
201 out_mean.assign(M,0);
202 for (
size_t i=0;i<N;i++)
203 for (
size_t j=0;j<M;j++)
204 out_mean[j]+=v.coeff(i,j);
211 for (
size_t i=0;i<N;i++)
213 for (
size_t j=0;j<M;j++)
214 out_cov.get_unsafe(j,j)+=
square(v.get_unsafe(i,j)-out_mean[j]);
216 for (
size_t j=0;j<M;j++)
217 for (
size_t k=j+1;k<M;k++)
218 out_cov.get_unsafe(j,k)+=(v.get_unsafe(i,j)-out_mean[j])*(v.get_unsafe(i,k)-out_mean[k]);
220 for (
size_t j=0;j<M;j++)
221 for (
size_t k=j+1;k<M;k++)
222 out_cov.get_unsafe(k,j) = out_cov.get_unsafe(j,k);
231 template<
class MATRIX>
232 inline Eigen::Matrix<typename MATRIX::Scalar,MATRIX::ColsAtCompileTime,MATRIX::ColsAtCompileTime>
235 Eigen::Matrix<double,MATRIX::ColsAtCompileTime,1> m;
236 Eigen::Matrix<typename MATRIX::Scalar,MATRIX::ColsAtCompileTime,MATRIX::ColsAtCompileTime> C;
242 #define SAVE_MATRIX(M) M.saveToTextFile(#M ".txt");
247 template <
class MAT_A,
class SKEW_3VECTOR,
class MAT_OUT>
253 const size_t N =
size(A,1);
255 for (
size_t i=0;i<N;i++)
257 out.set_unsafe(i,0, A.get_unsafe(i,1)*v[2]-A.get_unsafe(i,2)*v[1] );
258 out.set_unsafe(i,1,-A.get_unsafe(i,0)*v[2]+A.get_unsafe(i,2)*v[0] );
259 out.set_unsafe(i,2, A.get_unsafe(i,0)*v[1]-A.get_unsafe(i,1)*v[0] );
266 template <
class SKEW_3VECTOR,
class MAT_A,
class MAT_OUT>
272 const size_t N =
size(A,2);
274 for (
size_t i=0;i<N;i++)
276 out.set_unsafe(0,i,-A.get_unsafe(1,i)*v[2]+A.get_unsafe(2,i)*v[1] );
277 out.set_unsafe(1,i, A.get_unsafe(0,i)*v[2]-A.get_unsafe(2,i)*v[0] );
278 out.set_unsafe(2,i,-A.get_unsafe(0,i)*v[1]+A.get_unsafe(1,i)*v[0] );
288 template <
class MATORG,
class MATDEST>
291 const size_t first_row,
292 const size_t first_col,
295 const size_t NR = outMat.getRowCount();
296 const size_t NC = outMat.getColCount();
299 for (
size_t r=0;r<NR;r++)
300 for (
size_t c=0;c<NC;c++)
301 outMat.get_unsafe(r,c) = M.get_unsafe(first_row+r,first_col+c);