00001 #include <vector>
00002 #include <algorithm>
00003 #include <numeric>
00004 #include <boost/bind.hpp>
00005 #include <cmath>
00006 #include <functional>
00007 #include <boost/numeric/ublas/vector.hpp>
00008 #include <boost/numeric/ublas/vector_expression.hpp>
00009
00010 namespace ublas=boost::numeric::ublas;
00011 using namespace std;
00012
00013 const int size = 1000000;
00014 const int iterations = 1;
00015
00016
00017 void f(vector<double> &v1,vector<double> &v2,vector<double> &v3,vector<double> &v4)
00018 {
00019 transform(v1.begin(),v1.end(),v2.begin(),v3.begin(),boost::bind(std::multiplies<double>(),
00020 boost::bind<double>(std::minus<double>(),_1,_2),boost::bind<double>(std::minus<double>(),_1,_2)));
00021 copy(v2.begin(),v2.end(),v4.begin());
00022 double value = accumulate(v3.begin(),v3.end(),0.0);
00023 }
00024
00025 void g(vector<double> &v1,vector<double> &v2,vector<double> &v3,vector<double> &v4)
00026 {
00027 double value = 0;
00028 for (size_t i = 0; i < v1.size(); ++i)
00029 {
00030 v3.at(i) = pow(v1.at(i) - v2.at(i),2);
00031 v4.at(i) = v2.at(i);
00032 value += v3.at(i);
00033
00034 }
00035 }
00036
00037 void h(vector<double> &v1,vector<double> &v2,vector<double> &v3,vector<double> &v4)
00038 {
00039 typedef vector<double>::iterator tit;
00040 double value = 0;
00041 for (tit it1= v1.begin(),it2=v2.begin(),it3=v3.begin(),it4=v4.begin(); it1 != v1.end(); ++it1,++it2,++it3,++it4)
00042 {
00043 *it3 = (*it1 - *it2)*(*it1 - *it2);
00044 *it4 = *it2;
00045 value += *it3;
00046 }
00047 }
00048
00049 void ublasf(ublas::vector<double> &v1,ublas::vector<double> &v2,ublas::vector<double> &v3,ublas::vector<double> &v4)
00050 {
00051 transform(v1.begin(),v1.end(),v2.begin(),v3.begin(),boost::bind(std::multiplies<double>(),
00052 boost::bind<double>(std::minus<double>(),_1,_2),boost::bind<double>(std::minus<double>(),_1,_2)));
00053 v2 = v4;
00054 double value = ublas::sum(v3);
00055 }
00056
00057 void ublasg(ublas::vector<double> &v1,ublas::vector<double> &v2,ublas::vector<double> &v3,ublas::vector<double> &v4)
00058 {
00059 double value = 0;
00060 for (size_t i = 0; i < v1.size(); ++i)
00061 {
00062 v3(i) = pow(v1(i) - v2(i),2);
00063 v4(i) = v2(i);
00064 value += v3(i);
00065
00066 }
00067 }
00068
00069 void ublash(ublas::vector<double> &v1,ublas::vector<double> &v2,ublas::vector<double> &v3,ublas::vector<double> &v4)
00070 {
00071 typedef ublas::vector<double>::iterator tit;
00072 double value = 0;
00073 for (tit it1= v1.begin(),it2=v2.begin(),it3=v3.begin(),it4=v4.begin(); it1 != v1.end(); ++it1,++it2,++it3,++it4)
00074 {
00075 *it3 = (*it1 - *it2)*(*it1 - *it2);
00076 *it4 = *it2;
00077 value += *it3;
00078 }
00079 }
00080 int main()
00081 {
00082 vector<double> V1(size,2.),V2(size,1.5),V3(size,1.1),V4(size,1.3);
00083 f(V1,V2,V3,V4);
00084 g(V1,V2,V3,V4);
00085 h(V1,V2,V3,V4);
00086
00087 ublas::vector<double> U1(size),U2(size),U3(size),U4(size);
00088
00089 ublasf(U1,U2,U3,U4);
00090 ublasg(U1,U2,U3,U4);
00091 ublash(U1,U2,U3,U4);
00092 }