22 #ifndef CRN2MEANS_HEADER
23 #define CRN2MEANS_HEADER
27 #include <type_traits>
48 typename std::enable_if<
50 std::is_copy_assignable<typename std::iterator_traits<ITER>::value_type>::value &&
52 std::is_assignable<typename std::add_lvalue_reference<typename std::decay<typename std::iterator_traits<ITER>::value_type>::type>::type,
int>::value &&
59 std::pair<typename std::iterator_traits<ITER>::value_type,
typename std::iterator_traits<ITER>::value_type>
60 TwoMeans(ITER beg, ITER en,
double stop_crit = 0.00001)
62 using datatype =
typename std::iterator_traits<ITER>::value_type;
69 for (ITER it = beg; it != en; ++it)
71 if (*it < p1) p1 = *it;
72 if (!(*it < p2)) p2 = *it;
78 dectype s1 = 0, s2 = 0;
79 size_t n1 = 0, n2 = 0;
80 for (ITER it = beg; it != en; ++it)
82 if (
Abs(*it - p1) <
Abs(*it - p2))
94 s1 = datatype(s1 * (1.0 /
double(n1)));
96 s2 = datatype(s2 * (1.0 /
double(n2)));
97 cont = double(
Abs(dectype(p1) - s1) +
Abs(dectype(p2) - s2)) > stop_crit;
101 return std::make_pair(p1, p2);
121 template<
typename ITER>
122 std::pair<typename std::iterator_traits<ITER>::value_type,
typename std::iterator_traits<ITER>::value_type>
123 TwoMeans(ITER beg, ITER en,
typename std::iterator_traits<ITER>::value_type p1,
typename std::iterator_traits<ITER>::value_type p2,
double stop_crit = 0.00001)
124 noexcept(std::is_nothrow_constructible<typename std::iterator_traits<ITER>::value_type>::value
125 && std::is_nothrow_copy_assignable<typename std::iterator_traits<ITER>::value_type>::value)
127 using datatype =
typename std::iterator_traits<ITER>::value_type;
135 dectype s1 = 0, s2 = 0;
136 size_t n1 = 0, n2 = 0;
137 for (ITER it = beg; it != en; ++it)
139 if (
Abs(*it - p1) <
Abs(*it - p2))
151 s1 = datatype(s1 /
double(n1));
153 s2 = datatype(s2 /
double(n2));
154 cont = double(
Abs(dectype(p1) - s1) +
Abs(dectype(p2) - s2)) > stop_crit;
158 return std::make_pair(p1, p2);
std::pair< typename std::iterator_traits< ITER >::value_type, typename std::iterator_traits< ITER >::value_type > TwoMeans(ITER beg, ITER en, double stop_crit=0.00001)
2-means clustering algorithm for scalar data
typename TypeInfo< T >::DecimalType DecimalType
void Abs(Image< T > &img, typename std::enable_if< std::is_arithmetic< T >::value >::type *dummy=nullptr) noexcept
Replaces each pixel by its absolute value.