39 typedef std::vector<value_type>
Map;
53 Map::const_iterator
begin()
const {
60 Map::const_iterator
end()
const {
67 bool save(
const std::string& filename)
const;
70 DVector get_fuzzy(
double x)
const;
101 struct CMeansImpl *impl;
133 template <
typename T,
template <
class >
class Field>
135 const std::vector<double>& class_centers,
136 std::vector<Field<float>>& pv)
138 assert(image.size() == gain.size());
139 assert(class_centers.size() == pv.size());
142 assert(image.size() == i.size());
145 auto ii = image.begin();
146 auto ie = image.end();
147 auto ig = gain.begin();
148 typedef typename Field<float>::iterator prob_iterator;
150 std::vector<prob_iterator> ipv(pv.size());
151 transform(pv.begin(), pv.end(), ipv.begin(), [](Field<float>& p){return p.begin();});
153 std::vector<double> gain_class_centers(class_centers.size());
160 const double vgain = *ig;
161 transform(class_centers.begin(), class_centers.end(), gain_class_centers.begin(),
162 [vgain](
double x){return vgain * x;});
164 if ( x < gain_class_centers[0]) {
168 bool value_set =
false;
169 while (!value_set && (j < class_centers.size()) ) {
171 if (x < gain_class_centers[j]) {
173 double p0 = x - gain_class_centers[j-1];
174 double p1 = x - gain_class_centers[j];
175 double p02 = p0 * p0;
176 double p12 = p1 * p1;
177 double normalizer = 1.0/(p02 + p12);
178 *ipv[j] = p02 * normalizer;
179 *ipv[j - 1] = p12 * normalizer;
185 *ipv[class_centers.size() - 1] = 1.0;
188 for (
unsigned i = 0; i < class_centers.size(); ++i)
214 template <
typename T,
template <
class>
class Field>
216 const std::vector<Field<float>>& pv,
217 std::vector<double>& class_centers)
219 double residuum = 0.0;
221 for (
size_t i = 0; i < class_centers.size(); ++i) {
222 double cc = class_centers[i];
223 double sum_prob = 0.0;
224 double sum_weight = 0.0;
226 auto ie = image.end();
227 auto ii = image.begin();
228 auto ig = gain.begin();
229 auto ip = pv[i].begin();
233 auto v = *ip * *ip * *ig;
235 sum_weight += v * *ii;
244 cc = sum_weight / sum_prob;
246 cvwarn() <<
"class[" << i <<
"] has no probable members, keeping old value:" <<
247 sum_prob <<
":" <<sum_weight <<
"\n";
250 double delta = (cc - class_centers[i]) * 0.5;
251 residuum += delta * delta;
252 class_centers[i] += delta;
255 return sqrt(residuum);
266 size_t get_size_param()
const;
274 #pragma GCC diagnostic push
275 #pragma GCC diagnostic ignored "-Wattributes"
280 #pragma GCC diagnostic pop