00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef _MATRIXN_H_
00018 #define _MATRIXN_H_
00019 #include <assert.h>
00020 #include <iostream>
00021 #include <limits>
00022 #include "vector_n.h"
00023
00024 using namespace std;
00027
00038 template <int Rows, int Cols, typename Base=double>
00039 struct _Matrix{
00040 typedef Base BaseType;
00041
00042 _Matrix(int r=Rows, int c=Cols):_allocator(r,c){}
00043 inline const Base* operator[](int row) const {return _allocator[row];}
00044 inline Base* operator[](int row) {return _allocator[row];}
00045 inline int cols() const {return _allocator.cols();}
00046 inline int rows() const {return _allocator.rows();}
00047 _Matrix<Rows, Cols, Base>& operator += (const _Matrix<Rows, Cols, Base>& v);
00048 _Matrix<Rows, Cols, Base>& operator -= (const _Matrix<Rows, Cols, Base>& v);
00049 _Matrix<Rows, Cols, Base> operator - (const _Matrix<Rows, Cols, Base>& v) const;
00050 _Matrix<Rows, Cols, Base> operator + (const _Matrix<Rows, Cols, Base>& v) const;
00051 _Matrix<Cols, Rows, Base> transpose() const;
00052 _Matrix<Cols, Rows, Base>& transposeInPlace();
00053 _Matrix<Rows, Cols, Base>& operator*=(const _Matrix<Rows, Cols, Base>& m);
00054 _Matrix<Rows, Cols, Base>& operator*=(Base c);
00055 _Matrix<Rows, Cols, Base> operator*(Base c) const;
00056
00057 template <int Rows1, int Cols1>
00058 _Matrix<Rows, Cols1, Base> operator*(const _Matrix<Rows1, Cols1, Base>& m) const;
00059 _Vector<Rows, Base> operator* (const _Vector<Cols, Base>& v) const;
00060 int nullSpace(_Matrix<Rows, Cols, Base>& nullS, Base epsilon=std::numeric_limits<Base>::epsilon() ) const;
00061 static _Matrix<Rows, Rows, Base> eye(Base factor, int dim=Rows);
00062 static _Matrix<Rows, Rows, Base> diag(const _Vector<Rows, Base>& v);
00063 static _Matrix<Rows, Rows, Base> outerProduct(const _Vector<Rows, Base>& v1, const _Vector<Rows, Base>& v2);
00064 static _Matrix<Rows, Rows, Base> permutation(const _Vector<Rows, int>& p);
00065 _Matrix<Rows, Rows, Base> inverse() const;
00066 _Matrix<Rows, Rows, Base> cholesky() const;
00067
00068 Base det() const;
00069
00070 void swapRows(int r1, int r2);
00071 void sumRow(int dest, Base destFactor, int src, Base srcFactor);
00072 void multRow(int dest, Base destFactor);
00073 void fill(Base scalar);
00074
00075 _Array2DAllocator<Rows, Cols, Base> _allocator;
00076
00077 };
00078
00079 template <int R, int C, typename Base>
00080 std::ostream& operator << (std::ostream& os, const _Matrix<R, C, Base>& m);
00081
00083 template <int R, int C, typename Base>
00084 _Matrix<R, C, Base> operator* (Base x, const _Matrix<R, C, Base>& m);
00085
00086 template <int M, int N, typename Base>
00087 void st2dyn(_Matrix<0,0,Base>& dest, const _Matrix<M,N,Base> src){
00088 st2dyn(dest._allocator, src._allocator);
00089 }
00090
00091
00092 template <int M, int N, typename Base>
00093 void dyn2st(_Matrix<M,N,Base>& dest, const _Matrix<0,0,Base> src){
00094 dyn2st(dest._allocator, src._allocator);
00095 }
00096
00097 typedef _Matrix<3, 3, float> Matrix3f;
00098 typedef _Matrix<2, 2, float> Matrix2f;
00099 typedef _Matrix<6, 6, float> Matrix6f;
00100 typedef _Matrix<3, 3, double> Matrix3;
00101 typedef _Matrix<2, 2, double> Matrix2;
00102 typedef _Matrix<6, 6, double> Matrix6;
00103
00104 typedef _Matrix<0, 0, double> MatrixX;
00105 typedef _Matrix<0, 0, float> MatrixXf;
00106
00108
00109 #include "matrix_n.hpp"
00110
00111
00112 #endif