00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef CVectorTemplate_H
00029 #define CVectorTemplate_H
00030
00031 #include <mrpt/utils/utils_defs.h>
00032 #include <mrpt/math/CMatrixTemplateNumeric.h>
00033 #include <mrpt/math/CArray.h>
00034
00035 namespace mrpt
00036 {
00037 namespace math
00038 {
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 template <class T>
00051 class CVectorTemplate : public std::vector<T>
00052 {
00053 protected:
00054 typedef std::vector<T> base_class;
00055
00056 public:
00057 typedef CVectorTemplate<T> mrpt_autotype;
00058 DECLARE_MRPT_CONTAINER_TYPES
00059 DECLARE_MRPT_CONTAINER_IS_VECTOR
00060
00061
00062
00063 CVectorTemplate(size_t creationSize=0) : std::vector<T>(creationSize)
00064 {
00065 }
00066
00067
00068
00069 CVectorTemplate(size_t creationSize, const T& initVal) : std::vector<T>(creationSize,initVal)
00070 {
00071 }
00072
00073
00074
00075
00076 void extract_vector(const size_t &index, CVectorTemplate<T> &out)
00077 {
00078 size_t i;
00079
00080 if (index + out.size() > base_class::size())
00081 THROW_EXCEPTION("extract_vector: Index out of bounds");
00082
00083 for (i=index;i<index+out.size();i++)
00084 out[i-index] = (*this)[i];
00085 }
00086
00087
00088
00089
00090 CVectorTemplate<T> extract_vector(const size_t index, const unsigned int length)
00091 {
00092 if (index + length > base_class::size())
00093 THROW_EXCEPTION("extract_vector: Index out of bounds");
00094
00095 size_t i;
00096 CVectorTemplate<T> out;
00097 out.resize(length);
00098
00099 for (i=index;i<index+length;i++)
00100 out[i-index] = (*this)[i];
00101
00102 return out;
00103 }
00104
00105
00106
00107
00108 void insert_vector(const size_t &index, const CVectorTemplate<T> &in)
00109 {
00110 size_t i;
00111
00112 if (index + in.size()>base_class::size())
00113 THROW_EXCEPTION("insert_vector: Index out of bounds");
00114
00115 for (i=index;i<index+in.size();i++)
00116 (*this)[i] = in[i-index];
00117 }
00118
00119
00120
00121
00122 void operator +=(const CMatrixTemplateNumeric<T> &M)
00123 {
00124 MRPT_START
00125 if (M.getColCount()!=1 && M.getRowCount()!=1)
00126 THROW_EXCEPTION("Matrix must be a column or row matrix!");
00127
00128 if (M.getColCount()==1)
00129 {
00130
00131 ASSERT_(M.getRowCount()== base_class::size())
00132 size_t i,N = base_class::size();
00133
00134 for (i=0;i<N;i++)
00135 (*this)[i] += M(i,0);
00136 }
00137 else
00138 {
00139
00140 ASSERT_(M.getColCount()==base_class::size())
00141 size_t i,N = base_class::size();
00142
00143 for (i=0;i<N;i++)
00144 (*this)[i] += M(0,i);
00145 }
00146
00147 MRPT_END
00148 }
00149
00150
00151
00152
00153 void concatenate(const CVectorTemplate &first, const CVectorTemplate &second)
00154 {
00155 size_t i;
00156 (*this).resize(first.size()+second.size());
00157 for (i=0;i<first.size();i++)
00158 (*this)[i] = first[i];
00159 for (i=0;i<second.size();i++)
00160 std::vector<T>::at(i+first.size()) = second[i];
00161 }
00162
00163
00164
00165
00166
00167 void deconcatenate(CVectorTemplate &first, CVectorTemplate &second, const size_t &index)
00168 {
00169 if (index>base_class::size())
00170 THROW_EXCEPTION("Error in CVectorTemplate::deconcatenate. Index out of bounds");
00171
00172 size_t i;
00173
00174 first.resize(index);
00175 second.resize(base_class::size()-index);
00176 for (i=0;i<index;i++)
00177 first[i] = (*this)[i];
00178 for (i=0;i<second.size();i++)
00179 second[i] = std::vector<T>::at(i+index);
00180 }
00181
00182
00183
00184
00185
00186 void find_max(size_t &index, T &val)
00187 {
00188 if (base_class::size()<1)
00189 THROW_EXCEPTION("vector without dimensions in CVectorTemplate::find_max");
00190
00191 val=std::vector<T>::at(0);
00192 index=0;
00193 for (size_t i=1; i<base_class::size();i++)
00194 {
00195 if (val<(*this)[i])
00196 {
00197 val=(*this)[i];
00198 index = i;
00199 }
00200 }
00201 }
00202
00203
00204
00205
00206 void find_min(size_t &index, T &val)
00207 {
00208 if (base_class::size()<1)
00209 THROW_EXCEPTION("vector without dimensions in CVectorTemplate::find_max");
00210
00211 val=(*this)[0];
00212 index=0;
00213 for (size_t i=1; i<base_class::size();i++)
00214 {
00215 if (val>(*this)[i])
00216 {
00217 val=(*this)[i];
00218 index = i;
00219 }
00220 }
00221 }
00222
00223
00224
00225
00226
00227 void find_min_max(size_t &index_min, size_t &index_max, T &min, T &max)
00228 {
00229 if (base_class::size()<1)
00230 THROW_EXCEPTION("vector without dimensions in CVectorTemplate::find_max");
00231
00232 min=(*this)[0];
00233 max=(*this)[0];
00234 index_min=0;
00235 index_max=0;
00236 for (size_t i=1; i<base_class::size();i++)
00237 {
00238 if (min>(*this)[i])
00239 {
00240 min=(*this)[i];
00241 index_min = i;
00242 }
00243 else if (max<(*this)[i])
00244 {
00245 max=(*this)[i];
00246 index_max = i;
00247 }
00248 }
00249 }
00250
00251
00252
00253
00254 void abs()
00255 {
00256 for (size_t i=0; i<base_class::size();i++)
00257 if ((*this)[i] < 0)
00258 (*this)[i] *= -1;
00259
00260 }
00261
00262
00263
00264
00265 void loadFromTextFile(const std::string &file)
00266 {
00267 CMatrixTemplateNumeric<T> aux;
00268 aux.loadFromTextFile(file);
00269 unsigned int row = aux.getRowCount();
00270 unsigned int col = aux.getColCount();
00271 if ((row!=1)&&(col!=1))
00272 THROW_EXCEPTION("Error loading vector from text file, isn't a vector");
00273
00274 if (row==1)
00275 {
00276 (*this).resize(col);
00277 for (size_t i=0;i<col;i++)
00278 (*this)[i] = aux(0,i);
00279 }
00280 else
00281 {
00282 (*this).resize(row);
00283 for (size_t j=0;j<row;j++)
00284 (*this)[j] = aux(j,0);
00285 }
00286 }
00287
00288
00289
00290
00291
00292 void saveToTextFile(const std::string &file)
00293 {
00294 CMatrixTemplateNumeric<T> aux(1,base_class::size());
00295 for (size_t i=0;i<base_class::size();i++)
00296 aux(0,i) = (*this)[i];
00297 aux.saveToTextFile(file);
00298 }
00299
00300
00301
00302
00303 T mean()
00304 {
00305 T sum=0.0;
00306 for (size_t i=0;i<base_class::size();i++)
00307 sum += (*this)[i];
00308 return sum/base_class::size();
00309 }
00310
00311
00312
00313
00314 CMatrixTemplateNumeric<T> likeMatrix()
00315 {
00316 CMatrixTemplateNumeric<T> out;
00317 out.setSize(1,base_class::size());
00318 for( size_t i = 0; i < base_class::size() ; i++)
00319 out(0,i) = (*this)[i];
00320 return out;
00321 }
00322
00323
00324
00325 CVectorTemplate<T> operator + (CVectorTemplate &b)
00326 {
00327 ASSERT_(this->size()==b.size());
00328
00329 CVectorTemplate<T> res; res.assign(this->size(),0);
00330 typename std::vector<T>::iterator it_a,it_b,it_res;
00331
00332 for (it_a=this->begin(), it_b=b.begin(), it_res=res.begin(); it_a!=this->end(); it_a++, it_b++, it_res++)
00333 *it_res = *it_a + *it_b;
00334 return res;
00335 }
00336
00337
00338
00339
00340 CVectorTemplate<T> operator - (CVectorTemplate &b)
00341 {
00342 ASSERT_(this->size()==b.size());
00343
00344 CVectorTemplate<T> res; res.assign(this->size(),0);
00345 typename std::vector<T>::iterator it_a,it_b,it_res;
00346
00347 for (it_a=this->begin(), it_b=b.begin(), it_res=res.begin(); it_a!=this->end(); it_a++, it_b++, it_res++)
00348 *it_res = *it_a - *it_b;
00349 return res;
00350 }
00351
00352
00353
00354
00355 CVectorTemplate<T> operator * (CVectorTemplate &b)
00356 {
00357 ASSERT_(this->size()==b.size());
00358
00359 CVectorTemplate<T> res; res.assign(this->size(),0);
00360 typename std::vector<T>::iterator it_a,it_b,it_res;
00361
00362 for (it_a=this->begin(), it_b=b.begin(), it_res=res.begin(); it_a!=this->end(); it_a++, it_b++, it_res++)
00363 *it_res = (*it_a) * (*it_b);
00364 return res;
00365 }
00366
00367
00368
00369
00370 CVectorTemplate<T> operator / (CVectorTemplate &b)
00371 {
00372 ASSERT_(this->size()==b.size());
00373
00374 CVectorTemplate<T> res; res.assign(this->size(),0);
00375 typename std::vector<T>::iterator it_a,it_b,it_res;
00376
00377 for (it_a=this->begin(), it_b=b.begin(), it_res=res.begin(); it_a!=this->end(); it_a++, it_b++, it_res++)
00378 *it_res = (*it_a) / (*it_b);
00379 return res;
00380 }
00381
00382
00383
00384
00385 CVectorTemplate<T> operator + (T b)
00386 {
00387
00388 CVectorTemplate<T> res; res.assign(this->size(),0);
00389 typename std::vector<T>::iterator it_a,it_res;
00390
00391 for (it_a=this->begin(), it_res=res.begin(); it_a!=this->end(); it_a++, it_res++)
00392 *it_res = (*it_a) + b;
00393 return res;
00394 }
00395
00396
00397
00398 CVectorTemplate<T> operator - (T b)
00399 {
00400
00401 CVectorTemplate<T> res; res.assign(this->size(),0);
00402 typename std::vector<T>::iterator it_a,it_res;
00403
00404 for (it_a=this->begin(), it_res=res.begin(); it_a!=this->end(); it_a++, it_res++)
00405 *it_res = (*it_a) - b;
00406 return res;
00407 }
00408
00409
00410
00411 CVectorTemplate<T> operator * (T b)
00412 {
00413
00414 CVectorTemplate<T> res; res.assign(this->size(),0);
00415 typename std::vector<T>::iterator it_a,it_res;
00416
00417 for (it_a=this->begin(), it_res=res.begin(); it_a!=this->end(); it_a++, it_res++)
00418 *it_res = (*it_a) * b;
00419 return res;
00420 }
00421
00422
00423
00424 CVectorTemplate<T> operator / (T b)
00425 {
00426
00427 CVectorTemplate<T> res; res.assign(this->size(),0);
00428 typename std::vector<T>::iterator it_a,it_res;
00429
00430 for (it_a=this->begin(), it_res=res.begin(); it_a!=this->end(); it_a++, it_res++)
00431 *it_res = (*it_a) / b;
00432 return res;
00433 }
00434
00435
00436
00437 CMatrixTemplateNumeric<T> operator ~ ()
00438 {
00439 CMatrixTemplateNumeric<T> temp(base_class::size(),1);
00440 for (size_t i=0; i < base_class::size(); i++)
00441 temp(i,0) = (*this)[i];
00442 return temp;
00443 }
00444
00445
00446
00447 template <size_t N>
00448 void extract_array(size_t first_idx, CArrayPOD<T,N> &out_array) const
00449 {
00450 ASSERT_( first_idx+N <= this->size() );
00451 ::memcpy( out_array.data(), &(*this)[first_idx], sizeof(T)*N );
00452 }
00453
00454
00455 template <size_t N>
00456 void insert_array(size_t first_idx, CArrayPOD<T,N> &in_array)
00457 {
00458 ASSERT_( first_idx+N <= this->size() );
00459 ::memcpy( &(*this)[first_idx], in_array.data(), sizeof(T)*N );
00460 }
00461
00462 };
00463
00464
00465
00466
00467
00468 typedef CVectorTemplate<float> CVectorFloat;
00469
00470
00471
00472
00473 typedef CVectorTemplate<double> CVectorDouble;
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492 }
00493 }
00494
00495 #endif