41 typedef std::vector<value_type>
Map;
57 Map::const_iterator
begin()
const
66 Map::const_iterator
end()
const
75 bool save(
const std::string& filename)
const;
78 DVector get_fuzzy(
double x)
const;
111 struct CMeansImpl *impl;
143 template <
typename T,
template <
class >
class Field>
145 const std::vector<double>& class_centers,
146 std::vector<Field<float>>& pv)
148 assert(image.size() == gain.size());
149 assert(class_centers.size() == pv.size());
153 assert(image.size() == i.size());
156 auto ii = image.begin();
157 auto ie = image.end();
158 auto ig = gain.begin();
159 typedef typename Field<float>::iterator prob_iterator;
160 std::vector<prob_iterator> ipv(pv.size());
161 transform(pv.begin(), pv.end(), ipv.begin(), [](Field<float>& p) {
164 std::vector<double> gain_class_centers(class_centers.size());
169 for (
auto iipv : ipv)
172 const double vgain = *ig;
173 transform(class_centers.begin(), class_centers.end(), gain_class_centers.begin(),
178 if ( x < gain_class_centers[0]) {
182 bool value_set =
false;
184 while (!value_set && (j < class_centers.size()) ) {
186 if (x < gain_class_centers[j]) {
187 double p0 = x - gain_class_centers[j - 1];
188 double p1 = x - gain_class_centers[j];
189 double p02 = p0 * p0;
190 double p12 = p1 * p1;
191 double normalizer = 1.0 / (p02 + p12);
192 *ipv[j] = p02 * normalizer;
193 *ipv[j - 1] = p12 * normalizer;
201 *ipv[class_centers.size() - 1] = 1.0;
207 for (
unsigned i = 0; i < class_centers.size(); ++i)
233 template <
typename T,
template <
class>
class Field>
235 const std::vector<Field<float>>& pv,
236 std::vector<double>& class_centers)
238 double residuum = 0.0;
240 for (
size_t i = 0; i < class_centers.size(); ++i) {
241 double cc = class_centers[i];
242 double sum_prob = 0.0;
243 double sum_weight = 0.0;
244 auto ie = image.end();
245 auto ii = image.begin();
246 auto ig = gain.begin();
247 auto ip = pv[i].begin();
251 auto v = *ip * *ip * *ig;
253 sum_weight += v * *ii;
262 cc = sum_weight / sum_prob;
264 cvwarn() <<
"class[" << i <<
"] has no probable members, keeping old value:" <<
265 sum_prob <<
":" << sum_weight <<
"\n";
268 double delta = (cc - class_centers[i]) * 0.5;
269 residuum += delta * delta;
270 class_centers[i] += delta;
273 return sqrt(residuum);
285 size_t get_size_param()
const;
293 #pragma GCC diagnostic push
294 #pragma GCC diagnostic ignored "-Wattributes"
299 #pragma GCC diagnostic pop