www.pudn.com > firev0.01.rar > fuzzy3histo.hpp
/* This file is part of the FIRE -- Flexible Image Retrieval System FIRE is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. FIRE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with FIRE; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef __fuzzy3histo_hpp #define __fuzzy3histo_hpp #include#include #include class Fuzzy3Histo { public: Fuzzy3Histo() { data_=::std::vector (3,0.0); counter_=0; stepsize_=1.0/3.0; } Fuzzy3Histo(unsigned int i) { data_=::std::vector (3,0.0); counter_=0; stepsize_=1.0/3.0; } void feed(const double v) { ++counter_; int i; for(i=0;(i+1)*stepsize_ =int(data_.size())) i=data_.size()-1; double dist1=v-(i)*stepsize_; double dist2=(i+1)*stepsize_-v; double c=stepsize_/2; double h=1/c; double m=h/c; if (dist1 =0) { // ::std::cout << "adding " << value << " to bin " << i-1 << " and " << 1-value << " to bin " << i << "." << ::std::endl; data_[i-1]+=value; data_[i]+=(1-value); } else { data_[i]+=1; // ::std::cout << " adding 1 to bin " << i << "." << ::std::endl; } } else { //double w=stepsize_/2-dist2; double value=(c-dist2)*(c-dist2)*m/2; if(i+1<3) { // ::std::cout << "adding " << value << " to bin " << i+1 << " and " << 1-value << " to bin " << i << "." << ::std::endl; data_[i+1]+=value; data_[i]+=(1-value); } else { // ::std::cout << " adding 1 to bin " << i << "." << ::std::endl; data_[i]+=1; } } } double operator[](const int i) const { return data_[i]/double(counter_); } double& operator[](const int i) { return data_[i]; } void setMin() { counter_=1; data_=::std::vector (3,0.0); } void setMax() { counter_=1; data_=::std::vector (3,1.0); } private: double stepsize_; ::std::vector data_; int counter_; }; inline ::std::ostream& operator<<(::std::ostream& os, const Fuzzy3Histo & src) { os << "Fuzzy3Histo: " ; for(unsigned int i=0;i<3;++i) { os << src[i] << " "; } return os; } #endif