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