14 class invalid_product_exception : std::exception
20 size_x == 3 , size_y == 2 とすると
21 [ (0,0) , (1,0) , (2,0) ]
22 [ (0,1) , (1,1) , (2,1) ]
33 matrix(size_t num_x, size_t num_y);
34 matrix(size_t num_x, size_t num_y, const T& initial_value);
35 matrix(const matrix<T>& m);
38 const T* v(void) const;
41 const T& at(size_t idx_v) const;
42 T& operator()(size_t idx_x, size_t idx_y);
43 const T& operator()(size_t idx_x, size_t idx_y) const;
44 T& operator[](size_t idx_v);
45 const T& operator[](size_t idx_v) const;
47 T& at(size_t idx_x, size_t idx_y);
48 const T& at(size_t idx_x, size_t idx_y) const;
49 T& operator()(size_t idx_v);
50 const T& operator()(size_t idx_v) const;
52 void resize(size_t num_x, size_t num_y);
53 void resize(size_t num_x, size_t num_y, const T& initial_value);
57 size_t size(void) const;
58 size_t size_x(void) const;
59 size_t size_y(void) const;
61 bool empty(void) const;
63 void set(const matrix<T>& m);
64 matrix<T>& operator=(const matrix<T>& m);
66 bool equals(const matrix<T>& m);
67 bool operator==(const matrix<T>& m);
68 bool operator!=(const matrix<T>& m);
70 typedef typename std::vector<T>::iterator iterator;
71 typedef typename std::vector<T>::const_iterator const_iterator;
72 typedef typename std::vector<T>::reverse_iterator reverse_iterator;
73 typedef typename std::vector<T>::const_reverse_iterator const_reverse_iterator;
74 iterator begin (void);
76 reverse_iterator rbegin (void);
77 reverse_iterator rend (void);
78 const_iterator begin (void) const;
79 const_iterator end (void) const;
80 const_reverse_iterator rbegin (void) const;
81 const_reverse_iterator rend (void) const;
83 void swap(matrix<T>& m);
94 template<typename T> inline
95 std::vector<T> dot(const matrix<T>& _m, const std::vector<T>& _v);
96 template<typename T> inline
97 std::vector<T> dot(const std::vector<T>& _v, const matrix<T>& _m);
99 template<typename T> inline
100 std::vector<T> operator*(const matrix<T>& _m, const std::vector<T>& _v);
101 template<typename T> inline
102 std::vector<T> operator*(const std::vector<T>& _v, const matrix<T>& _m);
104 template<typename T> inline
105 matrix<T> dot(const matrix<T>& _m0, const matrix<T>& _m1);
106 template<typename T> inline
107 matrix<T> operator*(const matrix<T>& _m0, const matrix<T>& _m1);
112 template<typename T> inline
113 matrix<T>::matrix(void)
118 template<typename T> inline
119 matrix<T>::matrix(size_t num_x, size_t num_y)
123 buf.resize( m_size_x * m_size_y );
126 template<typename T> inline
127 matrix<T>::matrix(size_t num_x, size_t num_y, const T& initial_value)
131 buf.resize( m_size_x * m_size_y );
132 std::fill( buf.begin() , buf.end() , initial_value );
135 template<typename T> inline
136 matrix<T>::matrix(const matrix<T>& m)
139 m_size_x = m.size_x();
140 m_size_y = m.size_y();
144 template<typename T> inline
147 if( buf.empty() ) return NULL ;
148 else return &buf[0] ;
150 template<typename T> inline
151 const T* matrix<T>::v() const
153 if( buf.empty() ) return NULL ;
154 else return &buf[0] ;
158 template<typename T> inline
159 T& matrix<T>::at(size_t idx_v)
163 template<typename T> inline
164 const T& matrix<T>::at(size_t idx_v) const
168 template<typename T> inline
169 T& matrix<T>::operator()(size_t idx_v)
173 template<typename T> inline
174 const T& matrix<T>::operator()(size_t idx_v) const
178 template<typename T> inline
179 T& matrix<T>::operator[](size_t idx_v)
183 template<typename T> inline
184 const T& matrix<T>::operator[](size_t idx_v) const
190 template<typename T> inline
191 T& matrix<T>::at(size_t idx_x, size_t idx_y)
193 // Matrix subscript out of range
194 assert( idx_x < m_size_x && idx_y < m_size_y );
196 return buf[ idx_x + m_size_x * idx_y ];
198 template<typename T> inline
199 const T& matrix<T>::at(size_t idx_x, size_t idx_y) const
201 // Matrix subscript out of range
202 assert( idx_x < m_size_x && idx_y < m_size_y );
204 return buf[ idx_x + m_size_x * idx_y ];
206 template<typename T> inline
207 T& matrix<T>::operator()(size_t idx_x,size_t idx_y)
209 return at( idx_x , idx_y );
211 template<typename T> inline
212 const T& matrix<T>::operator()(size_t idx_x, size_t idx_y) const
214 return at( idx_x , idx_y );
218 template<typename T> inline
219 void matrix<T>::resize(size_t num_x, size_t num_y)
223 buf.resize( m_size_x * m_size_y );
225 template<typename T> inline
226 void matrix<T>::resize(size_t num_x, size_t num_y, const T& initial_value)
230 buf.resize( m_size_x * m_size_y );
231 std::fill( buf.begin() , buf.end() , initial_value );
235 template<typename T> inline
236 void matrix<T>::clear(void)
244 template<typename T> inline
245 size_t matrix<T>::size(void) const
249 template<typename T> inline
250 size_t matrix<T>::size_x(void) const
254 template<typename T> inline
255 size_t matrix<T>::size_y(void) const
260 template<typename T> inline
261 bool matrix<T>::empty(void) const
267 template<typename T> inline
268 void matrix<T>::set(const matrix<T>& m)
271 m_size_x = m.size_x() ; m_size_y = m.size_y() ;
273 template<typename T> inline
274 matrix<T>& matrix<T>::operator=(const matrix<T>& m)
281 template<typename T> inline
282 bool matrix<T>::equals(const matrix<T>& m)
284 if( m_size_x != m.m_size_x || m_size_y != m.m_size_y ) return false;
285 for(size_t i=0;i<m.size();i++) if( (*this)(i) != m(i) ) return false;
288 template<typename T> inline
289 bool matrix<T>::operator==(const matrix<T>& m)
293 template<typename T> inline
294 bool matrix<T>::operator!=(const matrix<T>& m)
300 template<typename T> inline
301 typename matrix<T>::iterator matrix<T>::begin(void)
305 template<typename T> inline
306 typename matrix<T>::iterator matrix<T>::end(void)
310 template<typename T> inline
311 typename matrix<T>::reverse_iterator matrix<T>::rbegin(void)
315 template<typename T> inline
316 typename matrix<T>::reverse_iterator matrix<T>::rend(void)
320 template<typename T> inline
321 typename matrix<T>::const_iterator matrix<T>::begin(void) const
325 template<typename T> inline
326 typename matrix<T>::const_iterator matrix<T>::end(void) const
330 template<typename T> inline
331 typename matrix<T>::const_reverse_iterator matrix<T>::rbegin(void) const
335 template<typename T> inline
336 typename matrix<T>::const_reverse_iterator matrix<T>::rend(void) const
341 template<typename T> inline
342 void matrix<T>::swap(matrix<T>& m)
344 std::swap(m_size_x, m.m_size_x);
345 std::swap(m_size_y, m.m_size_y);
350 template<typename T> inline
351 std::vector<T> dot(const matrix<T>& _m, const std::vector<T>& _v)
356 template<typename T> inline
357 std::vector<T> dot(const std::vector<T>& _v, const matrix<T>& _m)
363 //! m.size_x() == 3 , m.size_y() == 5 の場合
364 //! [r0] [m00 m10 m20]
365 //! [r1] [m01 m11 m21] [v0]
366 //! [r2] = [m02 m12 m22] * [v1]
367 //! [r3] [m03 m13 m23] [v2]
368 //! [r4] [m04 m14 m24]
370 //! ※ mij = m( i , j ) = m.at( i , j )
371 template<typename T> inline
372 std::vector<T> operator*(const matrix<T>& _m, const std::vector<T>& _v)
374 assert( _m.size_x() == _v.size() );
375 if( _m.size_x() != _v.size() )
376 throw invalid_product_exception();
378 std::vector<T> ret( _m.size_y() );
379 for( size_t i = 0 ; i < _m.size_y() ; ++i )
383 for( size_t j = 0 ; j < _m.size_x() ; ++j )
385 val += _m( j , i ) * _v[j];
393 //! m.size_x() == 5 , m.size_y() == 3 の場合
394 //! [m00 m10 m20 m30 m40]
395 //! [r0 r1 r2 r3 r4] = [v0 v1 v2] * [m01 m11 m21 m31 m41]
396 //! [m02 m12 m22 m32 m42]
398 //! ※ mij = m( i , j ) = m.at( i , j )
399 template<typename T> inline
400 std::vector<T> operator*(const std::vector<T>& _v, const matrix<T>& _m)
402 assert( _m.size_y() == _v.size() );
403 if( _m.size_y() != _v.size() )
404 throw invalid_product_exception();
406 std::vector<T> ret( _m.size_x() );
407 for( size_t i = 0 ; i < _m.size_x() ; ++i )
411 for( size_t j = 0 ; j < _m.size_y() ; ++j )
413 val += _v[j] * _m( i , j );
420 template<typename T> inline
421 matrix<T> dot(const matrix<T>& _m0, const matrix<T>& _m1)
428 //! [a00 a10] [m00 m10 m 20]
429 //! [a01 a11] [m01 m11 m 21] [n00 n10]
430 //! [a02 a12] = [m02 m12 m 22] * [n01 n11]
431 //! [a03 a13] [m03 m13 m 23] [n02 n12]
432 //! [a04 a14] [m04 m14 m 24]
433 template<typename T> inline
434 matrix<T> operator*(const matrix<T>& _m0, const matrix<T>& _m1)
436 assert( _m0.size_x() == _m1.size_y() );
437 if( _m0.size_x() != _m1.size_y() )
438 throw invalid_product_exception();
440 matrix<T> m( _m1.size_x() , _m0.size_y() );
441 for( size_t i = 0 ; i < _m1.size_x() ; ++i )
443 for( size_t j = 0 ; j < _m0.size_y() ; ++j )
447 for( size_t k = 1 ; k < _m0.size_x() ; ++k )
449 val += _m0( k , j ) * _m1( i , k );