19 template <
typename RandomAccessIterator>
23 typedef RandomAccessIterator base_type;
24 typedef typename base_type::pointer pointer;
25 typedef typename base_type::reference reference;
26 typedef typename base_type::value_type value_type;
27 typedef typename base_type::difference_type difference_type;
28 typedef typename base_type::iterator_category iterator_category;
30 RandomAccessIterator internal_iter;
34 friend class mat<value_type>;
36 step_iterator( RandomAccessIterator begin,
int step=1):internal_iter(begin),step(step)
43 step_iterator():internal_iter(NULL)
48 step_iterator(
const step_iterator& other)
50 internal_iter=other.internal_iter;
54 step_iterator& operator=(
const step_iterator& other)
58 internal_iter = other.internal_iter;
64 bool operator==(
const step_iterator& other)
const
66 return internal_iter == other.internal_iter;
69 bool operator!=(
const step_iterator& other)
const
71 return !(*
this==other);
76 return *internal_iter;
79 reference operator*()
const
81 return *internal_iter;
88 pointer operator->()
const
93 step_iterator& operator ++()
100 step_iterator operator ++(
int)
102 step_iterator tmp=*
this;
107 step_iterator& operator --()
112 step_iterator operator --(
int)
114 step_iterator tmp=*
this;
121 step_iterator& operator +=(difference_type n)
123 internal_iter+=n*step;
128 step_iterator& operator -=(difference_type n)
130 internal_iter-=n*step;
134 step_iterator operator -(difference_type n)
const
136 step_iterator tmp=*
this;
140 difference_type operator-(
const step_iterator& right)
const
142 return (internal_iter - right.internal_iter)/step;
146 step_iterator operator +(difference_type n)
const
148 step_iterator tmp=*
this;
153 reference operator[](difference_type offset)
const
155 return (*(*
this + offset));
158 bool operator <(
const step_iterator& other)
const
161 return internal_iter < other.internal_iter;
163 return internal_iter > other.internal_iter;
166 bool operator >(
const step_iterator& other)
const
169 return internal_iter > other.internal_iter;
171 return internal_iter < other.internal_iter;
174 bool operator <=(
const step_iterator& other)
const
177 return internal_iter <= other.internal_iter;
179 return internal_iter >= other.internal_iter;
182 bool operator >=(
const step_iterator& other)
const
185 return internal_iter >= other.internal_iter;
187 return internal_iter <= other.internal_iter;
207 template <
typename T>
220 typedef typename vec<T>::value_type value_type;
221 typedef typename vec<T>::reference reference;
222 typedef typename vec<T>::const_reference const_reference;
223 typedef typename vec<T>::pointer pointer;
224 typedef typename vec<T>::const_pointer const_pointer;
225 typedef typename vec<T>::iterator iterator;
226 typedef typename vec<T>::const_iterator const_iterator;
227 typedef typename vec<T>::reverse_iterator reverse_iterator;
228 typedef typename vec<T>::const_reverse_iterator const_reverse_iterator;
230 typedef iterator col_iterator;
231 typedef const col_iterator const_col_iterator;
232 typedef std::reverse_iterator<col_iterator> reverse_col_iterator;
233 typedef std::reverse_iterator<const_col_iterator> const_reverse_col_iterator;
235 typedef step_iterator<iterator> row_iterator;
236 typedef const row_iterator const_row_iterator;
237 typedef std::reverse_iterator<row_iterator> reverse_row_iterator;
238 typedef std::reverse_iterator<const_row_iterator> const_reverse_row_iterator;
240 typedef step_iterator<iterator > diag_iterator;
241 typedef const diag_iterator const_diag_iterator;
242 typedef std::reverse_iterator<diag_iterator> reverse_diag_iterator;
243 typedef std::reverse_iterator<const_diag_iterator> const_reverse_diag_iterator;
245 typedef step_iterator<iterator > anti_diag_iterator;
246 typedef const anti_diag_iterator const_anti_diag_iterator;
247 typedef std::reverse_iterator<anti_diag_iterator> reverse_anti_diag_iterator;
248 typedef std::reverse_iterator<const_anti_diag_iterator> const_reverse_anti_diag_iterator;
254 iterator begin(){
return _data.begin();}
255 iterator end(){
return _data.end();}
256 const_iterator begin()
const{
return _data.begin();}
257 const_iterator end()
const{
return _data.end();}
258 reverse_iterator rbegin(){
return _data.rbegin();}
259 reverse_iterator rend(){
return _data.rend();}
260 const_reverse_iterator rbegin()
const{
return _data.rbegin();}
261 const_reverse_iterator rend()
const {
return _data.rend();}
265 col_iterator col_begin(
int c)
269 col_iterator col_end(
int c)
273 const_col_iterator col_begin(
int c)
const
275 return const_col_iterator(
_data.begin()+(c*
_nrows));
277 const_col_iterator col_end(
int c)
const
279 return const_col_iterator(
_data.begin()+(c+1)*
_nrows );
281 reverse_col_iterator col_rbegin(
int c)
283 return (reverse_col_iterator(col_end(c)));
285 reverse_col_iterator col_rend(
int c)
287 return (reverse_col_iterator(col_begin(c)));
289 const_reverse_col_iterator col_rbegin(
int c)
const
291 return (const_reverse_col_iterator(col_end(c)));
293 const_reverse_col_iterator col_rend(
int c)
const
295 return (const_reverse_col_iterator(col_begin(c)));
298 row_iterator row_begin(
int r)
302 row_iterator row_end(
int r)
306 const_row_iterator row_begin(
int r)
const
310 const_row_iterator row_end(
int r)
const
315 reverse_row_iterator row_rbegin(
int r)
317 return (reverse_row_iterator(row_end(r)));
320 reverse_row_iterator row_rend(
int r)
322 return (reverse_row_iterator(row_begin(r)));
325 const_reverse_row_iterator row_rbegin(
int r)
const
327 return (const_reverse_row_iterator(row_end(r)));
330 const_reverse_row_iterator row_rend(
int r)
const
332 return (const_reverse_row_iterator(row_begin(r)));
338 diag_iterator diag_begin(
int d=0)
346 diag_iterator diag_end(
int d=0)
359 const_diag_iterator diag_begin(
int d=0)
const
362 return const_diag_iterator(begin()-d ,
_nrows+1);
367 const_diag_iterator diag_end(
int d=0)
const
380 reverse_diag_iterator diag_rbegin(
int d=0)
382 return (reverse_diag_iterator(diag_end(d)));
384 reverse_diag_iterator diag_rend(
int d=0)
386 return (reverse_diag_iterator(diag_begin(d)));
388 const_reverse_diag_iterator diag_rbegin(
int d=0)
const
390 return (const_reverse_diag_iterator(diag_end(d)));
392 const_reverse_diag_iterator diag_rend(
int d=0)
const
394 return (const_reverse_diag_iterator(diag_begin(d)));
397 anti_diag_iterator anti_diag_begin(
int d=0)
405 anti_diag_iterator anti_diag_end(
int d=0)
419 const_anti_diag_iterator anti_diag_begin(
int d=0)
const
427 const_anti_diag_iterator anti_diag_end(
int d=0)
const
441 reverse_anti_diag_iterator anti_diag_rbegin(
int d=0)
443 return (reverse_anti_diag_iterator(anti_diag_end(d)));
446 reverse_anti_diag_iterator anti_diag_rend(
int d=0)
448 return (reverse_anti_diag_iterator(anti_diag_begin(d)));
451 const_reverse_anti_diag_iterator anti_diag_rbegin(
int d=0)
const
453 return (const_reverse_anti_diag_iterator(anti_diag_end(d)));
456 const_reverse_anti_diag_iterator anti_diag_rend(
int d=0)
const
458 return (const_reverse_anti_diag_iterator(anti_diag_begin(d)));
497 for(
unsigned i = 0; i <
_nrows; i++)
498 for(
unsigned j = 0; j <
_ncols;j++)
510 template <
typename S>
515 for(
unsigned i = 0; i <
_nrows; i++)
516 for(
unsigned j = 0; j <
_ncols;j++)
555 template <
typename S>
558 resize(m.nrows(),m.ncols());
559 for(
unsigned i = 0; i <
_nrows; i++)
560 for(
unsigned j = 0; j <
_ncols;j++)
575 void resize(
unsigned rows,
unsigned cols)
578 unsigned newsize = rows*cols;
581 _data.resize(newsize);
591 operator const T*()
const
593 return (
const T*)
_data;
603 template <
typename S>
625 template <
typename S>
631 return _data == m._data;
635 template <
typename S>
640 return _data != m._data;
646 mat<T>& operator *= (
const T& s)
714 template <
typename S>
723 template <
typename S>
735 template <
typename S>
744 template <
typename S>
754 template <
typename S>
760 for(
unsigned i = 0; i <
_nrows; i++)
761 for(
unsigned j = 0; j <
_ncols;j++)
762 for(
unsigned k = 0; k <
_ncols; k++)
772 template <
typename S>
775 assert(m2.nrows() ==
_ncols);
776 unsigned M = m2.ncols();
778 for(
unsigned i = 0; i <
_nrows; i++)
779 for(
unsigned j = 0; j < M;j++)
780 for(
unsigned k = 0; k <
_ncols; k++)
788 template <
typename S>
795 for(
unsigned j = 0; j <
_ncols; j++)
796 for(
unsigned i = 0; i <
_nrows; i++)
803 mat<T> sub_mat(
unsigned top,
unsigned left,
unsigned rows,
unsigned cols)
const
808 for(
unsigned i = 0; i < rows;i++)
809 for(
unsigned j = 0; j < cols;j++)
822 for(
unsigned j = 0; j <
_ncols;j++)
832 for(
unsigned j = 0; j <
_ncols;j++)
833 operator()(i,j)=v(j);
845 for(
unsigned i = 0; i <
_nrows;i++)
855 for(
unsigned i = 0; i <
_nrows;i++)
856 operator()(i,j)=v(i);
863 void copy(
unsigned top,
unsigned left,
unsigned rows,
unsigned cols,
mat<T>& submat)
const
865 assert(submat.nrows() == rows && submat.ncols() == cols);
867 for(
unsigned i = 0; i < rows;i++)
868 for(
unsigned j = 0; j < cols;j++)
877 for(
unsigned i = 0; i < m.nrows(); i++)
878 for(
unsigned j = 0; j < m.ncols(); j++)
879 operator()(i+top,j+left)=m(i,j);
888 for(
unsigned k = 0; k <
_ncols;k++)
889 std::swap(
operator()(i,k),
operator()(j,k));
896 for(
unsigned k = 0; k <
_nrows;k++)
897 std::swap(
operator()(k,i),
operator()(k,j));
905 std::swap(
operator()(i,i),
operator()(j,j));
916 for(
unsigned i = 0; i <
_nrows;i++)
926 for(
unsigned i = 0; i <
_nrows;i++)
927 for(
unsigned j = 0; j <
_ncols;j++)
938 for(
unsigned i = 0; i <
_nrows;i++)
939 for(
unsigned j = 0; j <
_ncols;j++)
951 for(
unsigned i = 0; i <
_nrows;i++)
952 for(
unsigned j = 0; j <
_ncols;j++)
962 for(
unsigned i = 0; i <
_nrows;i++)
963 for(
unsigned j = 0; j <
_ncols;j++)
964 operator()(i,j) =::
ceil(
operator()(i,j));
970 for(
unsigned i = 0; i <
_nrows;i++)
971 for(
unsigned j = 0; j <
_ncols;j++)
972 operator()(i,j) =::
floor(
operator()(i,j));
978 for(
unsigned i = 0; i <
_nrows;i++)
979 for(
unsigned j = 0; j <
_ncols;j++)
980 operator()(i,j) =::
floor(
operator()(i,j)+(T)0.5);
990 for(
unsigned i =0; i <
_nrows;i++)
991 for(
unsigned j=0;j <
_ncols;j++)
992 n+=
operator()(i,j)*
operator()(i,j);
994 return (T)sqrt((
double)n);
1003 for(
unsigned i = 0; i <
_ncols;++i)
1011 for(
unsigned i = 0; i <
_ncols;++i)
1022 void zeros(
unsigned rows,
unsigned cols)
1029 void ones(
unsigned rows,
unsigned cols)
1040 template <
typename T>
1041 mat<T> zeros(
unsigned rows,
unsigned cols)
1048 template <
typename T>
1049 mat<T> ones(
unsigned rows,
unsigned cols)
1051 mat<T> m(rows,cols);
1056 template<
typename T>
1057 mat<T> identity(
unsigned dim)
1065 template<
typename T>
1066 T frobenius_norm(
const mat<T>& m)
1068 return m.frobenius_norm();
1072 template<
typename T>
1073 T trace(
const mat<T>& m)
1080 template<
typename T,
typename S>
1081 const mat<T> horzcat(
const mat<T>& m1,
const mat<S>& m2)
1084 assert(m1.nrows() == m2.nrows());
1085 mat<T> r(m1.nrows(),m1.ncols()+m2.ncols());
1086 for(
unsigned i = 0; i < m1.nrows();i++)
1088 for(
unsigned j = 0; j < m1.ncols(); j++)
1090 for(
unsigned j = 0; j < m2.ncols(); j++)
1091 r(i,j+m1.ncols())=(T)m2(i,j);
1097 template<
typename T,
typename S>
1098 const mat<T> horzcat(
const mat<T>& m1,
const vec<S>& v)
1101 assert(m1.nrows() == v.size());
1102 mat<T> r(m1.nrows(),m1.ncols()+1);
1103 for(
unsigned i = 0; i < m1.nrows();i++)
1105 for(
unsigned j = 0; j < m1.ncols(); j++)
1108 r(i,m1.ncols())=(T)v(i);
1114 template<
typename T,
typename S>
1115 const mat<T> horzcat(
const vec<T>& v1,
const vec<S>& v2)
1118 assert(v1.size() == v2.size());
1119 mat<T> r(v1.size(),2);
1120 for(
unsigned i = 0; i < v1.size();i++)
1129 template<
typename T,
typename S>
1130 const vec<T> vertcat(
const vec<T>& v1,
const vec<S>& v2)
1133 vec<T> r(v1.size()+v2.size());
1134 unsigned off = v1.size();
1135 for(
unsigned i = 0; i < v1.size();i++)
1137 for(
unsigned i = 0; i < v2.size();i++)
1145 template<
typename T,
typename S>
1146 const mat<T> vertcat(
const mat<T>& m1,
const mat<S>& m2)
1149 assert(m1.ncols() == m2.ncols());
1150 mat<T> r(m1.nrows()+m2.nrows(),m1.ncols());
1151 for(
unsigned i = 0; i < m1.nrows();i++)
1153 for(
unsigned j = 0; j < m1.ncols(); j++)
1157 for(
unsigned i = 0; i < m2.nrows();i++)
1159 for(
unsigned j = 0; j < m1.ncols(); j++)
1160 r(i+m1.nrows(),j) = m2(i,j);
1170 template <
typename T>
1178 template <
typename T>
1181 mat<T> r(1, v.size());
1182 for(
unsigned i = 0; i < v.size(); i++)
1189 template <
typename T>
1198 template <
typename T>
1207 template <
typename T>
1219 template <
typename T>
1228 template <
typename T>
1232 for (
unsigned i=0;i<m.nrows();++i)
1234 for(
unsigned j =0;j < m.ncols()-1;++j)
1236 out << m(i,m.ncols()-1);
1237 if(i != m.nrows()-1)
1247 template <
typename T>
1250 assert(m.size() > 0);
1251 for (
unsigned i=0;i<m.nrows();++i)
1252 for(
unsigned j =0;j < m.ncols();++j)
1266 template <
typename T>
1267 void AtA(
const mat<T>& a, mat<T>& ata)
1269 ata.resize(a.ncols(),a.ncols());
1271 for(
unsigned r = 0; r < a.nrows();r++)
1273 for(
unsigned i = 0; i < a.ncols();i++)
1275 for(
unsigned j = 0; j < a.ncols();j++)
1277 ata(i,j)+=a(r,i)*a(r,j);
1283 template <
typename T>
1284 void AAt(
const mat<T>& a, mat<T>& aat)
1286 aat.resize(a.nrows(),a.nrows());
1288 for(
unsigned c = 0; c < a.ncols();c++)
1290 for(
unsigned i = 0; i < a.nrows();i++)
1292 for(
unsigned j = 0; j < a.nrows();j++)
1294 aat(i,j)+=a(i,c)*a(j,c);
1301 template <
typename T>
1302 mat<T> reshape(
const vec<T>& v,
unsigned r,
unsigned c)
1304 assert(v.size() == r*c);
1305 return mat<T>(r,c,(
const T*)v);
1308 template <
typename T>
1309 mat<T> reshape(
const mat<T>& m,
unsigned r,
unsigned c)
1311 assert(m.size() == r*c);
1312 return mat<T>(r,c,(
const T*)m);
1316 template <
typename T>
1317 void AtB(
const mat<T>& a,
const mat<T>& b, mat<T>& atb)
1319 atb.resize(a.ncols(),b.ncols());
1322 for(
unsigned i = 0; i < a.ncols(); i++)
1323 for(
unsigned j = 0; j < b.ncols();j++)
1324 for(
unsigned k = 0; k < a.nrows(); k++)
1325 atb(i,j) += a(k,i)*b(k,j);
1331 template <
typename T>
1337 for(
unsigned i = 0; i < a.ncols(); i++)
1338 for(
unsigned j = 0; j < a.nrows(); j++)
1339 atx(i) += a(j,i) * (T)(x(j));
1346 template <
typename T,
typename S>
1351 for(
unsigned i = 0; i < v.size();i++)
1352 for(
unsigned j = 0; j < w.
size();j++)
1353 m(i,j) =v(i)*(T)w(j);