22 #ifndef CPPR_MANIPULATION_H //make sure this only gets included once
23 #define CPPR_MANIPULATION_H
52 template <
typename T >
53 ublas::matrix_slice<ublas::matrix<T> >
54 submatrix(ublas::matrix<T> &m,
int r1,
int r2,
int c1,
int c2)
65 "in submatrix: row start must be less than or equal to row end"
68 "in submatrix: col start must be less than or equal to col end"
71 "in submatrix: row start must be greater than or equal to 0");
73 "in submatrix: col start must be greater than or equal to 0"
76 "in submatrix: rows range larger than rows of matrix"
79 "in submatrix: col range larger than columns of matrix"
81 return subslice(m,r1,1,r2-r1,c1,1,c2-c1);
97 template <
typename T >
98 const ublas::matrix_slice<ublas::matrix<T> >
99 submatrix(
const ublas::matrix<T> &m,
int r1,
int r2,
int c1,
int c2)
111 "in submatrix: row start must be less than or equal to row end"
114 "in submatrix: col start must be less than or equal to col end"
117 "in submatrix: row start must be greater than or equal to 0"
120 "in submatrix: col start must be greater than or equal to 0"
123 "in submatrix: rows range larger than rows of matrix"
126 "in submatrix: col range larger than columns of matrix"
128 ublas::matrix<T> m1 = m;
130 return subslice(m1,r1,1,r2-r1,c1,1,c2-c1);
152 template <
typename T >
154 int m1start1,
int m1end1,
int m1start2,
int m1end2,
155 const ublas::matrix<T> &m2,
156 int m2start1,
int m2end1,
int m2start2,
int m2end2)
159 if(m1end1-m1start1!=m2end1-m2start1)
161 std::cerr <<
"ERROR: number of rows to copy differs\n";
164 if(m1end2-m1start2!=m2end2-m2start2)
166 std::cerr <<
"ERROR: number of cols to copy differs\n";
169 ublas::matrix_slice<ublas::matrix<T> >
171 ublas::slice(m1start1,1,m1end1-m1start1),
172 ublas::slice(m1start2,1,m1end2-m1start2)
176 ublas::matrix<T> m3 = m2;
178 ublas::matrix_slice<ublas::matrix<T> >
180 ublas::slice(m2start1,1,m2end1-m2start1),
181 ublas::slice(m2start2,1,m2end2-m2start2)
195 template <
typename T >
198 std::vector<bool> ret(v.size());
199 for(
unsigned int i=0; i<v.size(); i++)
200 ret[i] = v[i]==value;
214 template <
typename T >
215 ublas::matrix<T>
rowMask(
const ublas::matrix<T> &m,
216 std::vector<bool> mask)
218 ublas::matrix<T> ret(
count(mask.begin(), mask.end(),
true),m.size2());
220 for(
unsigned int i=0; i<mask.size(); i++)
223 row(ret,count++) = row(m, i);
236 template <
typename T >
237 ublas::matrix<T>
cbind(
const ublas::matrix<T> &m1,
238 const ublas::matrix<T> &m2)
241 ublas::matrix<T> ret = m1;
245 "in cbind: rows of matrices must match");
247 int original_size2 = m1.size2();
248 ret.resize(m1.size1(), m1.size2() + m2.size2());
252 original_size2, original_size2 + m2.size2()-1) = m2;
266 template <
typename T >
267 ublas::matrix<T>
rbind(
const ublas::matrix<T> &m1,
268 const ublas::matrix<T> &m2)
271 ublas::matrix<T> ret = m1;
275 "in rbind: columns of matrices must match");
278 int original_size1 = m1.size1();
279 ret.resize(m1.size1()+m2.size1(), m1.size2());
282 original_size1, original_size1 + m2.size1()-1,
283 0, m1.size2()-1) = m2;
296 template <
typename T >
297 ublas::matrix<T>
rev(
const ublas::matrix<T> & m1)
299 ublas::matrix<T> ret;
300 int size = m1.size1() * m1.size2();
304 for(
unsigned int i=0;i<m1.size1();i++)
306 for(
unsigned int j=0;j<m1.size2();j++)
308 ret(count++,0) = m1(i,j);
320 template <
typename T >
321 ublas::vector<T>
rev(
const ublas::vector<T> & v)
323 ublas::vector<T> ret;
325 for(
unsigned int i=0;i<v.size();i++)