void operator ()(Left &left, Right &right) const
 {
     BOOST_ASSERT(left.size() == right.size());
     for(std::size_t i = 0, size = left.size(); i != size; ++i)
     {
         if(numeric::greater(right[i], left[i]))
         {
             left[i] = right[i];
         }
     }
 }
 result_type
 operator ()(Left & left, Right & right) const
 {
     std::size_t left_size = left.size();
     std::size_t right_size = right.size();
     result_type result(left_size, right_size);
     for (std::size_t i = 0; i < left_size; ++i)
         for (std::size_t j = 0; j < right_size; ++j)
             result(i,j) = numeric::multiplies(left[i], right[j]);
     return result;
 }