00001 #ifndef SPLINE_MATRIX_HH 00002 #define SPLINE_MATRIX_HH 00003 00004 #include "Spline/Exceptions.hh" 00005 #include <ostream> 00006 #include <iostream> 00007 00008 namespace Spline{ 00009 00013 template <class T> 00014 class Matrix{ 00015 00016 public: 00017 00024 Matrix(size_t rows, size_t columns): m_elements(rows, vector<T>(columns)), 00025 m_nRows(rows), m_nColumns(columns){} 00026 00032 T element(size_t row, size_t column)const{ 00033 if(row >= m_nRows || column >= m_nColumns) throw MatrixException(); 00034 return m_elements[row][column]; 00035 }; 00036 00042 void setElement(size_t row, size_t column, T value){ 00043 if(row >= m_nRows || column >= m_nColumns) throw MatrixException(); 00044 m_elements[row][column] = value; 00045 return; 00046 }; 00047 00051 size_t nRows()const{ 00052 return m_nRows; 00053 } 00054 00058 size_t nColumns()const{ 00059 return m_nColumns; 00060 } 00061 00062 private: 00063 00064 vector<vector<T> > m_elements; 00065 size_t m_nRows; 00066 size_t m_nColumns; 00067 00068 }; 00069 00073 template<class T> inline std::ostream &writeVector(std::ostream &out, const std::vector<T> &row){ 00074 00075 for(typename std::vector<T>::const_iterator it = row.begin(); 00076 it != row.end(); ++it){ 00077 out.width(12); 00078 out<<std::fixed<<*it; 00079 out.fill(' '); 00080 } 00081 out<<std::endl; 00082 return out; 00083 }; 00084 00085 00089 template<class T> inline std::ostream &operator << (std::ostream &out, const Matrix<T> &matrix){ 00090 00091 for(size_t r=0 ; r != matrix.nRows(); ++r){ 00092 for(size_t c=0; c != matrix.nColumns(); ++c){ 00093 out.width(12); 00094 out<<std::fixed<<matrix.element(r, c); 00095 out.fill(' '); 00096 } 00097 out<<std::endl; 00098 } 00099 00100 return out; 00101 }; 00102 00103 } 00104 #endif