MC_double_vector.cpp

Go to the documentation of this file.
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 //using namespace mc;
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) //same 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; //avoid floating point problem
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         //prepare the sorting structure
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         //sort
00658         std::sort(vec_to_sort.begin(),
00659                   vec_to_sort.end(),
00660                   comparator_less_double_int());
00661 
00662         //redistribute
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 //    MC_double_vector MC_double_vector::pointwise_mult(const MC_double_vector& p) const
00695 //    {
00696 //        if(p.size()!=size())
00697 //        {std::cout<<"Error in MC_double_vector::pointwise_mult(), size is not correct:"<<p.size()<<","<<size()<<std::endl;exit(-1);}
00698 //
00699 //        MC_double_vector v=MC_double_vector::zeros(p.size());
00700 //        for(int k=0,N=p.size();k<N;++k)
00701 //            v[k]=(*this)[k]*p[k];
00702 //
00703 //        return v;
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 }

Generated on Sun Apr 18 20:24:47 2010 by  doxygen 1.6.1