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