00001
00002
00003 #include <cmath>
00004 #include <MC_double_vector.hpp>
00005 #include <MC_string_helper.hpp>
00006
00007 #include <MC_int_vector.hpp>
00008 #include <MC_v3d.hpp>
00009 #include <MC_v3d_vector.hpp>
00010
00011
00012 namespace mesh_conv
00013 {
00014
00015
00016 MC_double_vector::MC_double_vector(){}
00017
00018 MC_double_vector::MC_double_vector(const double& u0)
00019 {double_list.push_back(u0);}
00020 MC_double_vector::MC_double_vector(const double& u0,const double& u1){double_list.push_back(u0);double_list.push_back(u1);}
00021 MC_double_vector::MC_double_vector(const double& u0,const double& u1,const double& u2){double_list.push_back(u0);double_list.push_back(u1);double_list.push_back(u2);}
00022 MC_double_vector::MC_double_vector(const double& u0,const double& u1,const double& u2,const double& u3){double_list.push_back(u0);double_list.push_back(u1);double_list.push_back(u2);double_list.push_back(u3);}
00023 MC_double_vector::MC_double_vector(const double& u0,const double& u1,const double& u2,const double& u3,const double& u4){double_list.push_back(u0);double_list.push_back(u1);double_list.push_back(u2);double_list.push_back(u3);double_list.push_back(u4);}
00024 MC_double_vector::MC_double_vector(const double& u0,const double& u1,const double& u2,const double& u3,const double& u4,const double& u5){double_list.push_back(u0);double_list.push_back(u1);double_list.push_back(u2);double_list.push_back(u3);double_list.push_back(u4);double_list.push_back(u5);}
00025
00026 void MC_double_vector::assert_bounds(const int& u) const
00027 {
00028 if(u<0 || u>=int(double_list.size()))
00029 {std::cout<<"Assert MC_double_vector::assert_bounds("<<u<<") failed, because size="<<double_list.size()<<std::endl;exit(-1);}
00030 }
00031
00032 int MC_double_vector::size() const
00033 {return double_list.size();}
00034
00035 const double& MC_double_vector::operator()(const int& index) const
00036 {assert_bounds(index); return double_list[index];}
00037 double& MC_double_vector::operator()(const int& index)
00038 {assert_bounds(index); return double_list[index];}
00039 const double& MC_double_vector::operator[](const int& index) const
00040 {assert_bounds(index); return double_list[index];}
00041 double& MC_double_vector::operator[](const int& index)
00042 {assert_bounds(index); return double_list[index];}
00043
00044 void MC_double_vector::clear()
00045 {double_list.clear();}
00046
00047
00048
00049 std::ostream& operator<<(std::ostream& output,const MC_double_vector& in)
00050 {
00051 int N=in.size();
00052 for(int k=0;k<N;k++)
00053 output<<in[k]<<" ";
00054 return output;
00055 }
00056
00057 MC_double_vector::MC_double_vector(const std::string& in,const std::string& delimiter)
00058 {
00059 std::vector <std::string> v_string=MC_string_tokenizer::tokenize(in,delimiter);
00060 bool is_converted=false;
00061 for(unsigned int k=0;k<v_string.size();k++)
00062 {
00063 double value=MC_string_converter::value_of<double>(v_string[k],&is_converted);
00064 if(is_converted==true)
00065 add(value);
00066 }
00067 }
00068
00069
00070 MC_double_vector& MC_double_vector::add(const double& val)
00071 {double_list.push_back(val);return *this;}
00072
00073 MC_double_vector operator<<(const MC_double_vector& vec,const double& value)
00074 {return MC_double_vector(vec).add(value);}
00075
00076
00077
00078 MC_double_vector& MC_double_vector::add(const MC_double_vector& val)
00079 {
00080 int N=val.size();
00081 int end=double_list.size();
00082 double_list.resize(double_list.size()+N);
00083 for(int k=0;k<N;++k)
00084 double_list[end+k]=val[k];
00085 return *this;
00086 }
00087
00088 std::vector <double>& MC_double_vector::get_vector() {return double_list;}
00089 const std::vector <double>& MC_double_vector::to_vector() const {return double_list;}
00090
00091
00092 std::set <double> MC_double_vector::to_set() const
00093 {
00094 std::set <double> set_double;
00095 set_double.insert(double_list.begin(),double_list.end());
00096 return set_double;
00097 }
00098 std::map <double,int> MC_double_vector::to_map() const
00099 {
00100 std::map <double,int> map_double;
00101 int N=size();
00102 for(int k=0;k<N;k++)
00103 map_double.insert(std::pair<double,int>(this->operator()(k),k));
00104 return map_double;
00105 }
00106
00107 MC_double_vector operator<<(const MC_double_vector& vec,const MC_double_vector& to_add)
00108 {return MC_double_vector(vec).add(to_add);}
00109
00110 MC_double_vector& MC_double_vector::set(const int& k_index,const double& new_value)
00111 {
00112 if(k_index<0)
00113 {std::cout<<"Error in MC_double_vector::set("<<k_index<<","<<new_value<<"), index must be >0"<<std::endl;exit(-1);}
00114 if(k_index>=size())
00115 double_list.resize(k_index+1);
00116 double_list[k_index]=new_value;
00117 return *this;
00118 }
00119
00120 MC_double_vector& MC_double_vector::set(const MC_int_vector& k_index,const MC_double_vector& new_value)
00121 {
00122 MC_double_vector v_new_value=new_value;
00123 if(new_value.size()!=1 && new_value.size()!=k_index.size())
00124 {std::cout<<"Error in MC_double_vector::set(MC_int_vector,MC_double_vector), size are not correct: "<<k_index.size()<<","<<new_value.size()<<std::endl;exit(-1);}
00125 if(new_value.size()==1)
00126 v_new_value=MC_double_vector::zeros(k_index.size())+new_value;
00127
00128
00129 int N=v_new_value.size();
00130 for(int k=0;k<N;k++)
00131 set(k_index[k],v_new_value[k]);
00132 return *this;
00133 }
00134
00135
00136 MC_double_vector::MC_double_vector(const std::set <double>& vec)
00137 {
00138 for(std::set <double> :: const_iterator it=vec.begin();it!=vec.end();++it)
00139 double_list.push_back(*it);
00140 }
00141 MC_double_vector::MC_double_vector(const std::map <double,int> &vec)
00142 {
00143 for(std::map <double,int> :: const_iterator it=vec.begin();it!=vec.end();++it)
00144 set(it->second,it->first);
00145 }
00146 MC_double_vector::MC_double_vector(const std::vector <double> &vec)
00147 {double_list=vec;}
00148
00149 MC_double_vector::MC_double_vector(const MC_double_vector& vec)
00150 {double_list=vec.to_vector();}
00151
00152 MC_double_vector MC_double_vector::zeros(const int& new_size)
00153 {
00154 MC_double_vector vec;vec.resize(new_size);
00155 return vec;
00156 }
00157
00158 MC_double_vector& MC_double_vector::resize(const int& new_size)
00159 {
00160 int N=double_list.size();
00161 if(N==new_size)
00162 return *this;
00163
00164 if(new_size<0)
00165 {std::cout<<"Error in MC_double_vector::resize("<<new_size<<") new size must be >0"<<std::endl;exit(-1);}
00166
00167 double_list.resize(new_size);
00168 return *this;
00169
00170 }
00171 MC_double_vector operator-(const MC_double_vector& v)
00172 {
00173 MC_double_vector opposite;
00174 int N=v.size();
00175 opposite.resize(N);
00176 for(int k=0;k<N;++k)
00177 opposite[k]=-v[k];
00178 return opposite;
00179 }
00180
00181 MC_double_vector operator+(const MC_double_vector& vec,const double& to_add)
00182 {
00183 int N=vec.size();
00184 MC_double_vector new_vec=MC_double_vector::zeros(N);
00185 for(int k=0;k<N;k++)
00186 new_vec[k]=vec[k]+to_add;
00187 return new_vec;
00188 }
00189 MC_double_vector operator-(const MC_double_vector& vec,const double& to_sub)
00190 {
00191 int N=vec.size();
00192 MC_double_vector new_vec=MC_double_vector::zeros(N);
00193 for(int k=0;k<N;k++)
00194 new_vec[k]=vec[k]-to_sub;
00195 return new_vec;
00196 }
00197
00198
00199
00200 MC_double_vector operator*(const MC_double_vector& vec,const double& to_mult)
00201 {
00202 int N=vec.size();
00203 MC_double_vector new_vec=MC_double_vector::zeros(N);
00204 for(int k=0;k<N;k++)
00205 new_vec[k]=vec[k]*to_mult;
00206 return new_vec;
00207 }
00208 MC_double_vector operator/(const MC_double_vector& vec,const double& to_subdiv)
00209 {
00210 double epsilon=0.0000000001;
00211 if(fabs(to_subdiv)<epsilon)
00212 {std::cout<<"Error in MC_double_vector::operator/(MC_double_vector,double), double value is 0"<<std::endl;exit(-1);}
00213 int N=vec.size();
00214 MC_double_vector new_vec=MC_double_vector::zeros(N);
00215 for(int k=0;k<N;k++)
00216 new_vec[k]=vec[k]/to_subdiv;
00217 return new_vec;
00218 }
00219
00220 MC_double_vector& MC_double_vector::operator+=(const double& to_add)
00221 {
00222 int N=size();
00223 for(int k=0;k<N;++k)
00224 double_list[k]+=to_add;
00225 return *this;
00226 }
00227 MC_double_vector& MC_double_vector::operator-=(const double& to_sub)
00228 {
00229 int N=size();
00230 for(int k=0;k<N;++k)
00231 double_list[k]-=to_sub;
00232 return *this;
00233 }
00234 MC_double_vector& MC_double_vector::operator*=(const double& to_mult)
00235 {
00236 int N=size();
00237 for(int k=0;k<N;++k)
00238 double_list[k]*=to_mult;
00239 return *this;
00240 }
00241 MC_double_vector& MC_double_vector::operator/=(const double& to_subdiv)
00242 {
00243 double epsilon=0.000001;
00244 if(fabs(to_subdiv)<epsilon)
00245 {std::cout<<"Error in MC_double_vector::operator/=(double), double value is 0"<<std::endl;exit(-1);}
00246 int N=size();
00247 for(int k=0;k<N;++k)
00248 double_list[k]/=to_subdiv;
00249 return *this;
00250 }
00251
00252
00253 MC_double_vector operator+(const MC_double_vector& vec,const MC_double_vector& to_add)
00254 {
00255 if(to_add.size()==1)
00256 return vec+to_add.first();
00257 else
00258 {
00259 if(vec.size()!=to_add.size())
00260 {std::cout<<"Error in MC_double_vector::operator+(MC_double_vector,MC_double_vector), size are not compatible "<<vec.size()<<";"<<to_add.size()<<std::endl;exit(-1);}
00261
00262
00263 int N=vec.size();
00264 MC_double_vector new_vec=MC_double_vector::zeros(N);
00265 for(int k=0;k<N;++k)
00266 new_vec[k]=vec[k]+to_add[k];
00267 return new_vec;
00268 }
00269 }
00270 MC_double_vector operator-(const MC_double_vector& vec,const MC_double_vector& to_sub)
00271 {
00272 if(to_sub.size()==1)
00273 return vec-to_sub.first();
00274 else
00275 {
00276 if(vec.size()!=to_sub.size())
00277 {std::cout<<"Error in MC_double_vector::operator-(MC_double_vector,MC_double_vector), size are not compatible "<<vec.size()<<";"<<to_sub.size()<<std::endl;exit(-1);}
00278
00279
00280 int N=vec.size();
00281 MC_double_vector new_vec=MC_double_vector::zeros(N);
00282 for(int k=0;k<N;++k)
00283 new_vec[k]=vec[k]-to_sub[k];
00284 return new_vec;
00285 }
00286 }
00287 MC_double_vector operator*(const MC_double_vector& vec,const MC_double_vector& to_mult)
00288 {
00289 if(to_mult.size()==1)
00290 return vec*to_mult.first();
00291 else
00292 {
00293 if(vec.size()!=to_mult.size())
00294 {std::cout<<"Error in MC_double_vector::operator*(MC_double_vector,MC_double_vector), size are not compatible "<<vec.size()<<";"<<to_mult.size()<<std::endl;exit(-1);}
00295
00296
00297 int N=vec.size();
00298 MC_double_vector new_vec=MC_double_vector::zeros(N);
00299 for(int k=0;k<N;++k)
00300 new_vec[k]=vec[k]*to_mult[k];
00301 return new_vec;
00302 }
00303 }
00304 MC_double_vector operator/(const MC_double_vector& vec,const MC_double_vector& to_subdiv)
00305 {
00306 if(to_subdiv.size()==1)
00307 return vec/to_subdiv.first();
00308 else
00309 {
00310 if(vec.size()!=to_subdiv.size())
00311 {std::cout<<"Error in MC_double_vector::operator/(MC_double_vector,MC_double_vector), size are not compatible "<<vec.size()<<";"<<to_subdiv.size()<<std::endl;exit(-1);}
00312
00313
00314 int N=vec.size();
00315 MC_double_vector new_vec=MC_double_vector::zeros(N);
00316 for(int k=0;k<N;++k)
00317 {
00318 double current=to_subdiv[k];
00319 double epsilon=0.0000001;
00320 if(fabs(current)<epsilon)
00321 {std::cout<<"Error in MC_double_vector::operator/(MC_double_vector,MC_double_vector), int value at index"<<k<<" is 0"<<std::endl;exit(-1);}
00322 new_vec[k]=vec[k]/current;
00323 }
00324 return new_vec;
00325 }
00326
00327 }
00328
00329
00330 MC_double_vector& MC_double_vector::operator+=(const MC_double_vector& to_add)
00331 {
00332 if(to_add.size()==1)
00333 return *this+=to_add.first();
00334 else
00335 {
00336 if(size()!=to_add.size())
00337 {std::cout<<"Error in MC_double_vector::operator+=(MC_double_vector), size are not compatible "<<size()<<";"<<to_add.size()<<std::endl;exit(-1);}
00338
00339 int N=size();
00340 for(int k=0;k<N;++k)
00341 double_list[k]+=to_add[k];
00342 return *this;
00343 }
00344 }
00345 MC_double_vector& MC_double_vector::operator-=(const MC_double_vector& to_sub)
00346 {
00347 if(to_sub.size()==1)
00348 return *this-=to_sub.first();
00349 else
00350 {
00351 if(size()!=to_sub.size())
00352 {std::cout<<"Error in MC_double_vector::operator-=(MC_double_vector), size are not compatible "<<size()<<";"<<to_sub.size()<<std::endl;exit(-1);}
00353
00354 int N=size();
00355 for(int k=0;k<N;++k)
00356 double_list[k]-=to_sub[k];
00357 return *this;
00358 }
00359
00360 }
00361 MC_double_vector& MC_double_vector::operator*=(const MC_double_vector& to_mult)
00362 {
00363 if(to_mult.size()==1)
00364 return *this*=to_mult.first();
00365 else
00366 {
00367 if(size()!=to_mult.size())
00368 {std::cout<<"Error in MC_double_vector::operator*=(MC_double_vector), size are not compatible "<<size()<<";"<<to_mult.size()<<std::endl;exit(-1);}
00369
00370 int N=size();
00371 for(int k=0;k<N;++k)
00372 double_list[k]*=to_mult[k];
00373 return *this;
00374 }
00375 }
00376 MC_double_vector& MC_double_vector::operator/=(const MC_double_vector& to_subdiv)
00377 {
00378 if(to_subdiv.size()==1)
00379 return *this/=to_subdiv.first();
00380 else
00381 {
00382 if(size()!=to_subdiv.size())
00383 {std::cout<<"Error in MC_double_vector::operator/=(MC_double_vector), size are not compatible "<<size()<<";"<<to_subdiv.size()<<std::endl;exit(-1);}
00384
00385 int N=size();
00386 for(int k=0;k<N;++k)
00387 {
00388 double current=to_subdiv[k];
00389 double epsilon=0.0000001;
00390 if(fabs(current)<epsilon)
00391 {std::cout<<"Error in MC_double_vector::operator/=(MC_double_vector), try do divide by u["<<k<<"]=0"<<std::endl;exit(-1);}
00392 double_list[k]*=current;
00393 }
00394 return *this;
00395 }
00396 }
00397
00398 const double& MC_double_vector::first() const
00399 {
00400 if(size()>0)
00401 return double_list[0];
00402 else
00403 {
00404 std::cout<<"Error, call MC_double_vector::first() with size=0"<<std::endl;exit(-1);
00405 exit(-1);
00406 }
00407 }
00408 double& MC_double_vector::first()
00409 {
00410 if(size()>0)
00411 return double_list[0];
00412 else
00413 {
00414 std::cout<<"Error, call MC_double_vector::first() with size=0"<<std::endl;exit(-1);
00415 exit(-1);
00416 }
00417 }
00418 const double& MC_double_vector::last() const
00419 {
00420 if(size()>0)
00421 return double_list[size()-1];
00422 else
00423 {
00424 std::cout<<"Error, call MC_double_vector::last() with size=0"<<std::endl;exit(-1);
00425 }
00426 }
00427 double& MC_double_vector::last()
00428 {
00429 if(size()>0)
00430 return double_list[size()-1];
00431 else
00432 {
00433 std::cout<<"Error, call MC_double_vector::last() with size=0"<<std::endl;exit(-1);
00434 }
00435 }
00436
00437 std::pair <MC_double_vector,double> MC_double_vector::delete_index(const int& index_to_delete) const
00438 {
00439 if(index_to_delete<0 || index_to_delete>=size())
00440 {std::cout<<"Error in MC_double_vector::delete("<<index_to_delete<<", when size="<<size()<<std::endl;exit(-1);}
00441 MC_double_vector new_vec;
00442 int N=size();
00443 for(int k=0;k<N;++k)
00444 if(k!=index_to_delete)
00445 new_vec.add(double_list[k]);
00446 return std::pair <MC_double_vector,double>(new_vec,double_list[index_to_delete]);
00447 }
00448 std::pair <MC_double_vector,MC_double_vector> MC_double_vector::delete_index(const MC_int_vector& index_to_delete) const
00449 {
00450 std::set <int> set_index=index_to_delete.to_set();
00451 MC_double_vector new_vec;
00452 MC_double_vector deleted_vec;
00453 int N=size();
00454 for(int k=0;k<N;k++)
00455 {
00456 if(set_index.find(k)!=set_index.end())
00457 new_vec.add(double_list[k]);
00458 else
00459 deleted_vec.add(double_list[k]);
00460 }
00461 return std::pair <MC_double_vector,MC_double_vector> (new_vec,deleted_vec);
00462 }
00463
00464 MC_double_vector MC_double_vector::operator()(const MC_int_vector& index) const
00465 {
00466 int N=size();
00467 int N2=index.size();
00468 MC_double_vector new_vec=zeros(N2);
00469 for(int k=0;k<N2;++k)
00470 {
00471 if(index[k]<0 || index[k]>N)
00472 {std::cout<<"Error in MC_double_vector::operator()(MC_double_vector), value index["<<k<<"]="<<index[k]<<" not correct for size="<<N<<std::endl;exit(-1);}
00473 new_vec[k]=double_list[index[k]];
00474 }
00475 return new_vec;
00476 }
00477 MC_double_vector MC_double_vector::operator[](const MC_int_vector& index) const
00478 {return (*this)(index);}
00479
00480
00481 MC_double_vector& operator>>(std::istream& input,MC_double_vector& vec)
00482 {
00483 while(input.good())
00484 {
00485 double temp=0;
00486 input>>temp;
00487 if(input.good())
00488 vec.add(temp);
00489 }
00490 return vec;
00491 }
00492
00493
00494 MC_int_vector operator<(const MC_double_vector& vec,const double& val)
00495 {
00496 int N=vec.size();
00497 MC_int_vector res=MC_int_vector::zeros(N);
00498 for(int k=0;k<N;k++)
00499 if(vec[k]<val)
00500 res[k]=1;
00501 return res;
00502 }
00503 MC_int_vector operator<=(const MC_double_vector& vec,const double& val)
00504 {
00505 int N=vec.size();
00506 MC_int_vector res=MC_int_vector::zeros(N);
00507 for(int k=0;k<N;k++)
00508 if(vec[k]<=val)
00509 res[k]=1;
00510 return res;
00511 }
00512 MC_int_vector operator>(const MC_double_vector& vec,const double& val)
00513 {
00514 int N=vec.size();
00515 MC_int_vector res=MC_int_vector::zeros(N);
00516 for(int k=0;k<N;k++)
00517 if(vec[k]>val)
00518 res[k]=1;
00519 return res;
00520 }
00521 MC_int_vector operator>=(const MC_double_vector& vec,const double& val)
00522 {
00523 int N=vec.size();
00524 MC_int_vector res=MC_int_vector::zeros(N);
00525 for(int k=0;k<N;k++)
00526 if(vec[k]>=val)
00527 res[k]=1;
00528 return res;
00529 }
00530 MC_int_vector operator==(const MC_double_vector& vec,const double& val)
00531 {
00532 int N=vec.size();
00533 MC_int_vector res=MC_int_vector::zeros(N);
00534 double epsilon=0.0000001;
00535 for(int k=0;k<N;k++)
00536 if(fabs(vec[k]-val)<epsilon)
00537 res[k]=1;
00538 return res;
00539 }
00540
00541 MC_int_vector operator<(const double& val,const MC_double_vector& vec)
00542 {return vec>val;}
00543 MC_int_vector operator<=(const double& val,const MC_double_vector& vec)
00544 {return vec>=val;}
00545 MC_int_vector operator>(const double& val,const MC_double_vector& vec)
00546 {return vec<val;}
00547 MC_int_vector operator>=(const double& val,const MC_double_vector& vec)
00548 {return vec<=val;}
00549 MC_int_vector operator==(const double& val,const MC_double_vector& vec)
00550 {return vec==val;}
00551
00552 const double* MC_double_vector::pointer() const
00553 {return (&double_list[0]);}
00554
00555 MC_double_vector MC_double_vector::linspace(const double& begin,const double& end,const double& iteration)
00556 {
00557 if( (begin<end && iteration<0) || (begin>end && iteration>0) || fabs(iteration)<0.0000001)
00558 {std::cout<<"Error in MC_double_vector::linspace("<<begin<<","<<end<<","<<iteration<<"), loop will never end"<<std::endl;exit(-1);}
00559
00560 MC_double_vector temp;
00561 for(double u=begin;u<=(end+iteration/5.0);u+=iteration)
00562 temp.add(u);
00563 if(temp.size()>2)
00564 temp[temp.size()-1]=end;
00565 return temp;
00566 }
00567 MC_double_vector MC_double_vector::sample(const double& begin,const double& end,const int& N_sample)
00568 {
00569 if(N_sample<1){std::cout<<"Error in MC_double_vector::sample("<<begin<<","<<end<<","<<N_sample<<"), N_sample must be>=1"<<std::endl;exit(-1);}
00570 if(N_sample==1)
00571 return begin;
00572
00573 double iteration=(end-begin)/static_cast<double>(N_sample-1);
00574 MC_double_vector res=MC_double_vector::zeros(N_sample-1);
00575 res.add(begin);
00576 for(int k=1;k<N_sample;++k)
00577 res[k]=res[k-1]+iteration;
00578 res(N_sample-1)=end;
00579 return res;
00580 }
00581
00582 MC_v3d_vector operator*(const MC_double_vector& to_mult,const MC_v3d& vec)
00583 {
00584 int N=to_mult.size();
00585 MC_v3d_vector res(N);
00586 for(int k=0;k<N;++k)
00587 res[k]=vec*to_mult[k];
00588 return res;
00589 }
00590 MC_v3d_vector operator*(const MC_v3d& to_mult,const MC_double_vector& vec)
00591 {return vec*to_mult;}
00592 MC_v3d_vector operator/(const MC_v3d& vec,const MC_double_vector& to_subdiv)
00593 {
00594 double epsilon=0.000001;
00595
00596 int N=to_subdiv.size();
00597 MC_v3d_vector res(N);
00598 for(int k=0;k<N;++k)
00599 {
00600 if(fabs(to_subdiv[k])>epsilon)
00601 res[k]=vec/to_subdiv[k];
00602 else
00603 {std::cout<<"Error in MC_v3d_vector::operator/("<<vec<<" MC_double_vector), at position "<<k<<", value MC_double_vector["<<k<<"] is zero"<<std::endl;exit(-1);}
00604 }
00605 return res;
00606 }
00607
00608 std::pair <double,int> MC_double_vector::min() const
00609 {
00610
00611 if(size()<=0)
00612 {std::cout<<"Error in MC_double_vector::min(), size()="<<size()<<std::endl;exit(-1);}
00613
00614 double current_min=first();
00615 int current_index=0;
00616
00617 int N=size();
00618 for(int k=0;k<N;++k)
00619 if(current_min>double_list[k])
00620 {current_min=double_list[k];current_index=k;}
00621
00622 return std::pair <double,int> (current_min,current_index);
00623 }
00624 std::pair <double,int> MC_double_vector::max() const
00625 {
00626 if(size()<=0)
00627 {std::cout<<"Error in MC_double_vector::max(), size()="<<size()<<std::endl;exit(-1);}
00628
00629 double current_max=first();
00630 int current_index=0;
00631
00632 int N=size();
00633 for(int k=0;k<N;++k)
00634 if(current_max<double_list[k])
00635 {current_max=double_list[k];current_index=k;}
00636
00637 return std::pair <double,int> (current_max,current_index);
00638 }
00639
00640 double MC_double_vector::sum(const MC_double_vector& input)
00641 {
00642 double s=0.0;
00643 int N=input.size();
00644 for(int k=0;k<N;++k)
00645 s+=input[k];
00646 return s;
00647 }
00648
00649 std::pair <MC_double_vector,MC_int_vector> MC_double_vector::sort() const
00650 {
00651
00652 int N=size();
00653 std::vector <std::pair<double,int> > vec_to_sort(N);
00654 for(int k=0;k<N;++k)
00655 vec_to_sort[k]=std::pair <double,int>(double_list[k],k);
00656
00657
00658 std::sort(vec_to_sort.begin(),
00659 vec_to_sort.end(),
00660 comparator_less_double_int());
00661
00662
00663 std::pair <MC_double_vector,MC_int_vector> res;
00664 res.first.resize(N);res.second.resize(N);
00665 for(int k=0;k<N;++k)
00666 {
00667 res.first[k]=vec_to_sort[k].first;
00668 res.second[k]=vec_to_sort[k].second;
00669 }
00670 return res;
00671 }
00672
00673 MC_double_vector::MC_double_vector(const MC_v3d& vec)
00674 {
00675 double_list.push_back(vec[0]);
00676 double_list.push_back(vec[1]);
00677 double_list.push_back(vec[2]);
00678 }
00679 double* MC_double_vector::pointer_unprotected()
00680 {return &double_list[0];}
00681
00682 MC_double_vector MC_double_vector::abs(const MC_double_vector& input)
00683 {
00684 int N=input.size();
00685 MC_double_vector res=MC_double_vector::zeros(N);
00686 for(int k=0;k<N;++k)
00687 res[k]=std::abs(input[k]);
00688 return res;
00689 }
00690
00691 MC_double_vector operator*(const double& to_mult,const MC_double_vector& vec)
00692 {return vec*to_mult;}
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706 double MC_double_vector::norm_2() const
00707 {
00708 double n=0.0;
00709 for(int k=0,N=size();k<N;++k)
00710 {
00711 double a=double_list[k];
00712 n += a*a;
00713 }
00714 return std::sqrt(n);
00715 }
00716 double MC_double_vector::dot(const MC_double_vector& v) const
00717 {
00718 int N=size();
00719 if(N!=v.size())
00720 {std::cout<<"Error in MC_double_vector::dot(const MC_double_vector& v), size are not consistent: "<<N<<" "<<v.size()<<std::endl;exit(-1);}
00721
00722 const double* p_v=v.pointer();
00723
00724 double res=0.0;
00725 for(int k=0;k<N;++k)
00726 res += double_list[k]*p_v[k];
00727
00728 return res;
00729 }
00730
00731 MC_double_vector MC_double_vector::inverted() const
00732 {
00733 unsigned int N=size();
00734 MC_double_vector inv=MC_double_vector::zeros(N);
00735 for(int k=0;k<N;++k)
00736 inv[k]=double_list[N-k-1];
00737 return inv;
00738 }
00739
00740 }