This is an automated email from the git hooks/post-receive script. sebastic-guest pushed a commit to branch upstream-master in repository pktools.
commit 46d99cef2eee782b9154eeed76dcd361b917c4f4 Author: Pieter Kempeneers <kempe...@gmail.com> Date: Tue Feb 19 10:11:04 2013 +0100 renamed Histogram to StatFactory --- src/algorithms/Filter.h | 72 +++---- src/algorithms/Filter2d.cc | 42 ++-- src/algorithms/Filter2d.h | 2 +- src/algorithms/Histogram.cc | 63 ------ src/algorithms/Makefile.am | 4 +- src/algorithms/{Histogram.h => StatFactory.h} | 267 ++++++++++++++++++++------ src/apps/pkclassify_nn.cc | 1 - src/apps/pkclassify_svm.cc | 1 - src/apps/pkdumpogr.cc | 1 - src/apps/pkextract.cc | 20 +- src/apps/pkfs_nn.cc | 1 - src/apps/pklas2img.cc | 20 +- src/apps/pkmosaic.cc | 12 +- src/apps/pkopt_svm.cc | 1 - src/apps/pksensormodel.cc | 6 +- src/apps/pkstat.cc | 38 ++-- src/apps/pkstatogr.cc | 10 +- 17 files changed, 324 insertions(+), 237 deletions(-) diff --git a/src/algorithms/Filter.h b/src/algorithms/Filter.h index ed7ae58..7973171 100644 --- a/src/algorithms/Filter.h +++ b/src/algorithms/Filter.h @@ -22,7 +22,7 @@ along with pktools. If not, see <http://www.gnu.org/licenses/>. #include <vector> #include <iostream> -#include "Histogram.h" +#include "StatFactory.h" #include "imageclasses/ImgReaderGdal.h" #include "imageclasses/ImgWriterGdal.h" @@ -89,8 +89,8 @@ template<class T> void Filter::morphology(const vector<T>& input, vector<T>& out assert(dim); output.resize((input.size()-offset+down-1)/down); int i=0; - Histogram hist; - vector<T> histBuffer; + statfactory::StatFactory stat; + vector<T> statBuffer; short binValue=0; //start: extend input with mirrored version of itself for(i=offset;i<dim/2;++i){ @@ -102,9 +102,9 @@ template<class T> void Filter::morphology(const vector<T>& input, vector<T>& out } } if(m_class.size()) - histBuffer.push_back(binValue); + statBuffer.push_back(binValue); else - histBuffer.push_back(input[i]); + statBuffer.push_back(input[i]); for(int t=1;t<=dim/2;++t){ binValue=0; for(int iclass=0;iclass<m_class.size();++iclass){ @@ -114,25 +114,25 @@ template<class T> void Filter::morphology(const vector<T>& input, vector<T>& out } } if(m_class.size()){ - histBuffer.push_back(binValue); - histBuffer.push_back(binValue); + statBuffer.push_back(binValue); + statBuffer.push_back(binValue); } else{ - histBuffer.push_back(input[i+t]); - histBuffer.push_back(input[i+t]); + statBuffer.push_back(input[i+t]); + statBuffer.push_back(input[i+t]); } } - assert(histBuffer.size()==dim); + assert(statBuffer.size()==dim); if((i-offset)%down){ - histBuffer.clear(); + statBuffer.clear(); continue; } switch(method){ case(DILATE): - output[(i-offset+down-1)/down]=hist.max(histBuffer); + output[(i-offset+down-1)/down]=stat.max(statBuffer); break; case(ERODE): - output[(i-offset+down-1)/down]=hist.min(histBuffer); + output[(i-offset+down-1)/down]=stat.min(statBuffer); break; default: string errorString="method not supported"; @@ -141,13 +141,13 @@ template<class T> void Filter::morphology(const vector<T>& input, vector<T>& out } if(verbose){ cout << "buffer: "; - for(int ibuf=0;ibuf<histBuffer.size();++ibuf) - cout << histBuffer[ibuf] << " "; + for(int ibuf=0;ibuf<statBuffer.size();++ibuf) + cout << statBuffer[ibuf] << " "; cout << "->" << output[(i-offset+down-1)/down] << endl; } } //main - histBuffer.clear(); + statBuffer.clear(); for(i=offset+dim/2;i<input.size()-dim/2;++i){ binValue=0; for(int t=0;t<dim;++t){ @@ -158,21 +158,21 @@ template<class T> void Filter::morphology(const vector<T>& input, vector<T>& out } } if(m_class.size()) - histBuffer.push_back(binValue); + statBuffer.push_back(binValue); else - histBuffer.push_back(input[i-dim/2+t]); + statBuffer.push_back(input[i-dim/2+t]); } - assert(histBuffer.size()==dim); + assert(statBuffer.size()==dim); if((i-offset)%down){ - histBuffer.clear(); + statBuffer.clear(); continue; } switch(method){ case(DILATE): - output[(i-offset+down-1)/down]=hist.max(histBuffer); + output[(i-offset+down-1)/down]=stat.max(statBuffer); break; case(ERODE): - output[(i-offset+down-1)/down]=hist.min(histBuffer); + output[(i-offset+down-1)/down]=stat.min(statBuffer); break; default: string errorString="method not supported"; @@ -181,11 +181,11 @@ template<class T> void Filter::morphology(const vector<T>& input, vector<T>& out } if(verbose){ cout << "buffer: "; - for(int ibuf=0;ibuf<histBuffer.size();++ibuf) - cout << histBuffer[ibuf] << " "; + for(int ibuf=0;ibuf<statBuffer.size();++ibuf) + cout << statBuffer[ibuf] << " "; cout << "->" << output[(i-offset+down-1)/down] << endl; } - histBuffer.clear(); + statBuffer.clear(); } //end: extend input with mirrored version of itself for(i=input.size()-dim/2;i<input.size();++i){ @@ -197,9 +197,9 @@ template<class T> void Filter::morphology(const vector<T>& input, vector<T>& out } } if(m_class.size()) - histBuffer.push_back(binValue); + statBuffer.push_back(binValue); else - histBuffer.push_back(input[i]); + statBuffer.push_back(input[i]); for(int t=1;t<=dim/2;++t){ binValue=0; for(int iclass=0;iclass<m_class.size();++iclass){ @@ -209,24 +209,24 @@ template<class T> void Filter::morphology(const vector<T>& input, vector<T>& out } } if(m_class.size()){ - histBuffer.push_back(binValue); - histBuffer.push_back(binValue); + statBuffer.push_back(binValue); + statBuffer.push_back(binValue); } else{ - histBuffer.push_back(input[i-t]); - histBuffer.push_back(input[i-t]); + statBuffer.push_back(input[i-t]); + statBuffer.push_back(input[i-t]); } } if((i-offset)%down){ - histBuffer.clear(); + statBuffer.clear(); continue; } switch(method){ case(DILATE): - output[(i-offset+down-1)/down]=hist.max(histBuffer); + output[(i-offset+down-1)/down]=stat.max(statBuffer); break; case(ERODE): - output[(i-offset+down-1)/down]=hist.min(histBuffer); + output[(i-offset+down-1)/down]=stat.min(statBuffer); break; default: string errorString="method not supported"; @@ -235,8 +235,8 @@ template<class T> void Filter::morphology(const vector<T>& input, vector<T>& out } if(verbose){ cout << "buffer: "; - for(int ibuf=0;ibuf<histBuffer.size();++ibuf) - cout << histBuffer[ibuf] << " "; + for(int ibuf=0;ibuf<statBuffer.size();++ibuf) + cout << statBuffer[ibuf] << " "; cout << "->" << output[(i-offset+down-1)/down] << endl; } } diff --git a/src/algorithms/Filter2d.cc b/src/algorithms/Filter2d.cc index e46af52..f20ed11 100644 --- a/src/algorithms/Filter2d.cc +++ b/src/algorithms/Filter2d.cc @@ -22,7 +22,7 @@ along with pktools. If not, see <http://www.gnu.org/licenses/>. #include <iostream> #include <cmath> #include "Filter2d.h" -#include "Histogram.h" +#include "StatFactory.h" // #include "imageclasses/ImgUtils.h" Filter2d::Filter2d::Filter2d(void) @@ -410,7 +410,7 @@ void Filter2d::Filter2d::doit(const ImgReaderGdal& input, ImgWriterGdal& output, { assert(dimX); assert(dimY); - Histogram hist; + statfactory::StatFactory stat; const char* pszMessage; void* pProgressArg=NULL; GDALProgressFunc pfnProgress=GDALTermProgress; @@ -506,41 +506,41 @@ void Filter2d::Filter2d::doit(const ImgReaderGdal& input, ImgWriterGdal& output, if(windowBuffer.empty()) outBuffer[x/down]=m_noValue; else - outBuffer[x/down]=hist.median(windowBuffer); + outBuffer[x/down]=stat.median(windowBuffer); break; case(VAR):{ if(windowBuffer.empty()) outBuffer[x/down]=m_noValue; else - outBuffer[x/down]=hist.var(windowBuffer); + outBuffer[x/down]=stat.var(windowBuffer); break; } case(STDEV):{ if(windowBuffer.empty()) outBuffer[x/down]=m_noValue; else - outBuffer[x/down]=sqrt(hist.var(windowBuffer)); + outBuffer[x/down]=sqrt(stat.var(windowBuffer)); break; } case(MEAN):{ if(windowBuffer.empty()) outBuffer[x/down]=m_noValue; else - outBuffer[x/down]=hist.mean(windowBuffer); + outBuffer[x/down]=stat.mean(windowBuffer); break; } case(MIN):{ if(windowBuffer.empty()) outBuffer[x/down]=m_noValue; else - outBuffer[x/down]=hist.min(windowBuffer); + outBuffer[x/down]=stat.min(windowBuffer); break; } case(ISMIN):{ if(windowBuffer.empty()) outBuffer[x/down]=m_noValue; else - outBuffer[x/down]=(hist.min(windowBuffer)==windowBuffer[dimX*dimY/2])? 1:0; + outBuffer[x/down]=(stat.min(windowBuffer)==windowBuffer[dimX*dimY/2])? 1:0; break; } case(MINMAX):{ @@ -549,7 +549,7 @@ void Filter2d::Filter2d::doit(const ImgReaderGdal& input, ImgWriterGdal& output, if(windowBuffer.empty()) outBuffer[x/down]=m_noValue; else{ - hist.minmax(windowBuffer,windowBuffer.begin(),windowBuffer.end(),min,max); + stat.minmax(windowBuffer,windowBuffer.begin(),windowBuffer.end(),min,max); if(min!=max) outBuffer[x/down]=0; else @@ -561,14 +561,14 @@ void Filter2d::Filter2d::doit(const ImgReaderGdal& input, ImgWriterGdal& output, if(windowBuffer.empty()) outBuffer[x/down]=m_noValue; else - outBuffer[x/down]=hist.max(windowBuffer); + outBuffer[x/down]=stat.max(windowBuffer); break; } case(ISMAX):{ if(windowBuffer.empty()) outBuffer[x/down]=m_noValue; else - outBuffer[x/down]=(hist.max(windowBuffer)==windowBuffer[dimX*dimY/2])? 1:0; + outBuffer[x/down]=(stat.max(windowBuffer)==windowBuffer[dimX*dimY/2])? 1:0; break; } case(ORDER):{ @@ -577,15 +577,15 @@ void Filter2d::Filter2d::doit(const ImgReaderGdal& input, ImgWriterGdal& output, else{ double lbound=0; double ubound=dimX*dimY; - double theMin=hist.min(windowBuffer); - double theMax=hist.max(windowBuffer); + double theMin=stat.min(windowBuffer); + double theMax=stat.max(windowBuffer); double scale=(ubound-lbound)/(theMax-theMin); outBuffer[x/down]=static_cast<short>(scale*(windowBuffer[dimX*dimY/2]-theMin)+lbound); } break; } case(SUM):{ - outBuffer[x/down]=hist.sum(windowBuffer); + outBuffer[x/down]=stat.sum(windowBuffer); break; } case(HOMOG): @@ -803,7 +803,7 @@ void Filter2d::Filter2d::morphology(const ImgReaderGdal& input, ImgWriterGdal& o { assert(dimX); assert(dimY); - Histogram hist; + statfactory::StatFactory stat; for(int iband=0;iband<input.nrOfBand();++iband){ Vector2d<double> inBuffer(dimY,input.nrOfCol()); vector<double> outBuffer(input.nrOfCol()); @@ -843,7 +843,7 @@ void Filter2d::Filter2d::morphology(const ImgReaderGdal& input, ImgWriterGdal& o for(int x=0;x<input.nrOfCol();++x){ double currentValue=inBuffer[dimY/2][x]; outBuffer[x]=currentValue; - vector<double> histBuffer; + vector<double> statBuffer; bool currentMasked=false; double rse=0; for(int imask=0;imask<m_mask.size();++imask){ @@ -925,19 +925,19 @@ void Filter2d::Filter2d::morphology(const ImgReaderGdal& input, ImgWriterGdal& o } } if(m_class.size()) - histBuffer.push_back(binValue); + statBuffer.push_back(binValue); else - histBuffer.push_back(inBuffer[indexJ][indexI]); + statBuffer.push_back(inBuffer[indexJ][indexI]); } } } - if(histBuffer.size()){ + if(statBuffer.size()){ switch(method){ case(DILATE): - outBuffer[x]=hist.max(histBuffer); + outBuffer[x]=stat.max(statBuffer); break; case(ERODE): - outBuffer[x]=hist.min(histBuffer); + outBuffer[x]=stat.min(statBuffer); break; default: ostringstream ess; diff --git a/src/algorithms/Filter2d.h b/src/algorithms/Filter2d.h index 954f1fc..785d1cf 100644 --- a/src/algorithms/Filter2d.h +++ b/src/algorithms/Filter2d.h @@ -372,7 +372,7 @@ template<class T1, class T2> void Filter2d::doit(const Vector2d<T1>& inputVector break; } case(MIXED):{ - enum Type { BF=11, CF=12, MF=13, NF=20, W=30 }; + enum MixType { BF=11, CF=12, MF=13, NF=20, W=30 }; double nBF=occurrence[BF]; double nCF=occurrence[CF]; double nMF=occurrence[MF]; diff --git a/src/algorithms/Histogram.cc b/src/algorithms/Histogram.cc deleted file mode 100644 index cd51498..0000000 --- a/src/algorithms/Histogram.cc +++ /dev/null @@ -1,63 +0,0 @@ -/********************************************************************** -Histogram.cc: class for statistical operations on vectors -Copyright (C) 2008-2012 Pieter Kempeneers - -This file is part of pktools - -pktools 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 3 of the License, or -(at your option) any later version. - -pktools 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 pktools. If not, see <http://www.gnu.org/licenses/>. -***********************************************************************/ -#include "Histogram.h" - - -Histogram::Histogram(){ -} - -void Histogram::signature(double m1, double m2, double& k, double& alpha, double& beta, double e) -{ - double y=m1*m1/m2; - beta=F_1(y,0.1,10.0,e); - double fb=F(beta); - double g=exp(lgamma(1.0/beta)); - alpha=m1*g/exp(lgamma(2.0/beta)); - k=beta/(2*alpha*g); -// cout << "y, alpha, beta: " << y << ", " << alpha << ", " << beta << endl; -} - -double Histogram::F(double x) -{ - double g2=exp(lgamma(2.0/x)); - return(g2*g2/exp(lgamma(3.0/x))/exp(lgamma(1.0/x))); -} - -//x1 is under estimate, x2 is over estimate, e is error -double Histogram::F_1(double y, double x1, double x2, double e) -{ - double f1=F(x1); - double f2=F(x2); - assert(f1!=f2); - double x=x1+(x2-x1)*(y-f1)/(f2-f1); - double f=F(x); - while(f-y>=e||y-f>=e){ - if(f<y) - x1=x; - else - x2=x; - if(x1==x2) - return x1; - assert(f1!=f2); - x=x1+(x2-x1)*(y-f1)/(f2-f1); - f=F(x); - } - return x; -} diff --git a/src/algorithms/Makefile.am b/src/algorithms/Makefile.am index b00098e..3ef425a 100644 --- a/src/algorithms/Makefile.am +++ b/src/algorithms/Makefile.am @@ -12,7 +12,7 @@ noinst_LIBRARIES = libalgorithms.a libalgorithms_adir = $(includedir)/algorithms # the list of header files that belong to the library (to be installed later) -libalgorithms_a_HEADERS = Egcs.h Filter2d.h Filter.h Histogram.h ConfusionMatrix.h svm.h FeatureSelector.h +libalgorithms_a_HEADERS = Egcs.h Filter2d.h Filter.h StatFactory.h ConfusionMatrix.h svm.h FeatureSelector.h if USE_FANN libalgorithms_a_HEADERS += myfann_cpp.h @@ -23,5 +23,5 @@ libalgorithms_a_HEADERS += SensorModel.h OptFactory.h endif # the sources to add to the library and to add to the source distribution -libalgorithms_a_SOURCES = $(libalgorithms_a_HEADERS) Egcs.cc Filter2d.cc Filter.cc Histogram.cc ConfusionMatrix.cc svm.cpp +libalgorithms_a_SOURCES = $(libalgorithms_a_HEADERS) Egcs.cc Filter2d.cc Filter.cc ConfusionMatrix.cc svm.cpp ############################################################################### diff --git a/src/algorithms/Histogram.h b/src/algorithms/StatFactory.h similarity index 59% rename from src/algorithms/Histogram.h rename to src/algorithms/StatFactory.h index 8d41dff..98e44f3 100644 --- a/src/algorithms/Histogram.h +++ b/src/algorithms/StatFactory.h @@ -1,6 +1,6 @@ /********************************************************************** -Histogram.h: class for statistical operations on vectors -Copyright (C) 2008-2012 Pieter Kempeneers +StatFactory.h: class for statistical operations on vectors +Copyright (C) 2008-2013 Pieter Kempeneers This file is part of pktools @@ -17,8 +17,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with pktools. If not, see <http://www.gnu.org/licenses/>. ***********************************************************************/ -#ifndef _HISTOGRAM_H_ -#define _HISTOGRAM_H_ +#ifndef _STATFACTORY_H_ +#define _STATFACTORY_H_ #include <iostream> #include <vector> @@ -29,22 +29,21 @@ along with pktools. If not, see <http://www.gnu.org/licenses/>. #include <fstream> #include <algorithm> #include <gsl/gsl_fit.h> -//#include <gsl/gsl_errno.h> - -/* #include "newmat/newmat.h" */ -/* #include "newmat/newmatap.h" */ -/* #include "newmat/newmatio.h" */ +#include <gsl/gsl_errno.h> +#include <gsl/gsl_spline.h> using namespace std; // using namespace NEWMAT; -namespace histogram +namespace statfactory { + + enum INTERPOLATION_TYPE {UNDEFINED=0,POLYNOMIAL=1,CSPLINE=2,PERIODIC=3,AKIMA=4,AKIMA_PERIODIC=5,LINEAR=6}; -class Histogram{ +class StatFactory{ public: - Histogram(void); - virtual ~Histogram(void){}; + StatFactory(void){}; + virtual ~StatFactory(void){}; template<class T> T max(const vector<T>& v) const; template<class T> T min(const vector<T>& v) const; // template<class T> typename vector<T>::const_iterator max(const vector<T>& v, typename vector<T>::const_iterator begin, typename vector<T>::const_iterator end) const; @@ -76,22 +75,16 @@ public: template<class T> double correlation(const vector<T>& x, const vector<T>& y, int delay=0) const; template<class T> double cross_correlation(const vector<T>& x, const vector<T>& y, int maxdelay, vector<T>& z) const; template<class T> double linear_regression(const vector<T>& x, const vector<T>& y, double &c0, double &c1) const; + template<class T> void interpolateUp(const vector< vector<T> >& input, vector< vector<T> >& output, double start, double end, double step, int type=0); + template<class T> void interpolateUp(const vector<T>& input, vector<T>& output, int nbin); + template<class T> void interpolateUp(double* input, int dim, vector<T>& output, int nbin); + template<class T> void interpolateDown(const vector<T>& input, vector<T>& output, int nbin); + template<class T> void interpolateDown(double* input, int dim, vector<T>& output, int nbin); + private: - double F(double x); - double F_1(double y, double x1, double x2, double e); }; -// template<class T> typename vector<T>::const_iterator Histogram::max(const vector<T>& v, typename vector<T>::const_iterator begin, typename vector<T>::const_iterator end) const -// { -// typename vector<T>::const_iterator tmpIt=begin; -// for (typename vector<T>::const_iterator it = begin; it!=end; ++it){ -// if(*tmpIt<*it) -// tmpIt=it; -// } -// return tmpIt; -// } - -template<class T> typename vector<T>::iterator Histogram::max(const vector<T>& v, typename vector<T>::iterator begin, typename vector<T>::iterator end) const +template<class T> typename vector<T>::iterator StatFactory::max(const vector<T>& v, typename vector<T>::iterator begin, typename vector<T>::iterator end) const { typename vector<T>::iterator tmpIt=begin; for (typename vector<T>::iterator it = begin; it!=end; ++it){ @@ -101,7 +94,7 @@ template<class T> typename vector<T>::iterator Histogram::max(const vector<T>& v return tmpIt; } -template<class T> T Histogram::max(const vector<T>& v) const +template<class T> T StatFactory::max(const vector<T>& v) const { T maxValue=*(v.begin()); for (typename vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){ @@ -111,7 +104,7 @@ template<class T> T Histogram::max(const vector<T>& v) const return maxValue; } -template<class T> T Histogram::min(const vector<T>& v) const +template<class T> T StatFactory::min(const vector<T>& v) const { T minValue=*(v.begin()); for (typename vector<T>::const_iterator it = v.begin(); it!=v.end(); ++it){ @@ -121,7 +114,7 @@ template<class T> T Histogram::min(const vector<T>& v) const return minValue; } -template<class T> typename vector<T>::const_iterator Histogram::absmax(const vector<T>& v, typename vector<T>::const_iterator begin, typename vector<T>::const_iterator end) const +template<class T> typename vector<T>::const_iterator StatFactory::absmax(const vector<T>& v, typename vector<T>::const_iterator begin, typename vector<T>::const_iterator end) const { typename vector<T>::const_iterator tmpIt=begin; for (typename vector<T>::const_iterator it = begin; it!=end; ++it){ @@ -131,7 +124,7 @@ template<class T> typename vector<T>::const_iterator Histogram::absmax(const vec return tmpIt; } -template<class T> typename vector<T>::const_iterator Histogram::min(const vector<T>& v, typename vector<T>::const_iterator begin, typename vector<T>::const_iterator end) const +template<class T> typename vector<T>::const_iterator StatFactory::min(const vector<T>& v, typename vector<T>::const_iterator begin, typename vector<T>::const_iterator end) const { typename vector<T>::const_iterator tmpIt=begin; for (typename vector<T>::const_iterator it = begin; it!=end; ++it){ @@ -141,7 +134,7 @@ template<class T> typename vector<T>::const_iterator Histogram::min(const vector return tmpIt; } -template<class T> typename vector<T>::const_iterator Histogram::absmin(const vector<T>& v, typename vector<T>::const_iterator begin, typename vector<T>::const_iterator end) const +template<class T> typename vector<T>::const_iterator StatFactory::absmin(const vector<T>& v, typename vector<T>::const_iterator begin, typename vector<T>::const_iterator end) const { typename vector<T>::const_iterator tmpIt=begin; for (typename vector<T>::const_iterator it = begin; it!=end; ++it){ @@ -150,7 +143,7 @@ template<class T> typename vector<T>::const_iterator Histogram::absmin(const vec } } -template<class T> void Histogram::minmax(const vector<T>& v, typename vector<T>::const_iterator begin, typename vector<T>::const_iterator end, T& theMin, T& theMax) const +template<class T> void StatFactory::minmax(const vector<T>& v, typename vector<T>::const_iterator begin, typename vector<T>::const_iterator end, T& theMin, T& theMax) const { theMin=*begin; theMax=*begin; @@ -162,7 +155,7 @@ template<class T> void Histogram::minmax(const vector<T>& v, typename vector<T>: } } -template<class T> T Histogram::sum(const vector<T>& v) const +template<class T> T StatFactory::sum(const vector<T>& v) const { typename vector<T>::const_iterator it; T tmpSum=0; @@ -171,13 +164,13 @@ template<class T> T Histogram::sum(const vector<T>& v) const return tmpSum; } -template<class T> double Histogram::mean(const vector<T>& v) const +template<class T> double StatFactory::mean(const vector<T>& v) const { assert(v.size()); return static_cast<double>(sum(v))/v.size(); } -template<class T> T Histogram::median(const vector<T>& v) const +template<class T> T StatFactory::median(const vector<T>& v) const { vector<T> tmpV=v; sort(tmpV.begin(),tmpV.end()); @@ -187,7 +180,7 @@ template<class T> T Histogram::median(const vector<T>& v) const return 0.5*(tmpV[tmpV.size()/2-1]+tmpV[tmpV.size()/2]); } -template<class T> double Histogram::var(const vector<T>& v) const +template<class T> double StatFactory::var(const vector<T>& v) const { typename vector<T>::const_iterator it; double v1=0; @@ -206,7 +199,7 @@ template<class T> double Histogram::var(const vector<T>& v) const return v1; } -template<class T> double Histogram::moment(const vector<T>& v, int n) const +template<class T> double StatFactory::moment(const vector<T>& v, int n) const { assert(v.size()); typename vector<T>::const_iterator it; @@ -219,7 +212,7 @@ template<class T> double Histogram::moment(const vector<T>& v, int n) const } //central moment -template<class T> double Histogram::cmoment(const vector<T>& v, int n) const +template<class T> double StatFactory::cmoment(const vector<T>& v, int n) const { assert(v.size()); typename vector<T>::const_iterator it; @@ -231,19 +224,19 @@ template<class T> double Histogram::cmoment(const vector<T>& v, int n) const return m/v.size(); } -template<class T> double Histogram::skewness(const vector<T>& v) const +template<class T> double StatFactory::skewness(const vector<T>& v) const { return cmoment(v,3)/pow(var(v),1.5); } -template<class T> double Histogram::kurtosis(const vector<T>& v) const +template<class T> double StatFactory::kurtosis(const vector<T>& v) const { double m2=cmoment(v,2); double m4=cmoment(v,4); return m4/m2/m2-3.0; } -template<class T> void Histogram::meanVar(const vector<T>& v, double& m1, double& v1) const +template<class T> void StatFactory::meanVar(const vector<T>& v, double& m1, double& v1) const { typename vector<T>::const_iterator it; v1=0; @@ -256,7 +249,7 @@ template<class T> void Histogram::meanVar(const vector<T>& v, double& m1, double assert(v1>=0); } -template<class T1, class T2> void Histogram::scale2byte(const vector<T1>& input, vector<T2>& output, unsigned char lbound, unsigned char ubound) const +template<class T1, class T2> void StatFactory::scale2byte(const vector<T1>& input, vector<T2>& output, unsigned char lbound, unsigned char ubound) const { output.resize(input.size()); T1 minimum=min(input); @@ -267,7 +260,7 @@ template<class T1, class T2> void Histogram::scale2byte(const vector<T1>& input, output[i]=scale*(input[i]-(minimum))+lbound; } -template<class T> void Histogram::distribution (const vector<T>& input, typename vector<T>::const_iterator begin, typename vector<T>::const_iterator end, vector<int>& output, int nbin, T &minimum, T &maximum, const string &filename) +template<class T> void StatFactory::distribution (const vector<T>& input, typename vector<T>::const_iterator begin, typename vector<T>::const_iterator end, vector<int>& output, int nbin, T &minimum, T &maximum, const string &filename) { if(maximum<=minimum) minmax(input,begin,end,minimum,maximum); @@ -307,7 +300,7 @@ template<class T> void Histogram::distribution (const vector<T>& input, typenam } } -template<class T> void Histogram::percentiles (const vector<T>& input, typename vector<T>::const_iterator begin, typename vector<T>::const_iterator end, vector<T>& output, int nbin, T &minimum, T &maximum, const string &filename) +template<class T> void StatFactory::percentiles (const vector<T>& input, typename vector<T>::const_iterator begin, typename vector<T>::const_iterator end, vector<T>& output, int nbin, T &minimum, T &maximum, const string &filename) { if(maximum<=minimum) minmax(input,begin,end,minimum,maximum); @@ -354,7 +347,7 @@ template<class T> void Histogram::percentiles (const vector<T>& input, typename } } -// template<class T> void Histogram::cumulative (const vector<T>& input, typename vector<T>::const_iterator begin, typename vector<T>::const_iterator end, vector<int>& output, int nbin, T &minimum, T &maximum) +// template<class T> void StatFactory::cumulative (const vector<T>& input, typename vector<T>::const_iterator begin, typename vector<T>::const_iterator end, vector<int>& output, int nbin, T &minimum, T &maximum) // { // assert(nbin>1); // assert(input.size()); @@ -375,14 +368,14 @@ template<class T> void Histogram::percentiles (const vector<T>& input, typename // } // } -template<class T> void Histogram::signature(const vector<T>& input, double&k, double& alpha, double& beta, double e) +template<class T> void StatFactory::signature(const vector<T>& input, double&k, double& alpha, double& beta, double e) { double m1=moment(input,1); double m2=moment(input,2); signature(m1,m2,k,alpha,beta,e); } -template<class T> void Histogram::normalize(const vector<T>& input, vector<double>& output){ +template<class T> void StatFactory::normalize(const vector<T>& input, vector<double>& output){ double total=sum(input); if(total){ output.resize(input.size()); @@ -393,7 +386,7 @@ template<class T> void Histogram::normalize(const vector<T>& input, vector<doubl output=input; } -template<class T> void Histogram::normalize_pct(vector<T>& input){ +template<class T> void StatFactory::normalize_pct(vector<T>& input){ double total=sum(input); if(total){ typename vector<T>::iterator it; @@ -402,7 +395,7 @@ template<class T> void Histogram::normalize_pct(vector<T>& input){ } } -template<class T> double Histogram::rmse(const vector<T>& x, const vector<T>& y) const{ +template<class T> double StatFactory::rmse(const vector<T>& x, const vector<T>& y) const{ assert(x.size()==y.size()); assert(x.size()); double mse=0; @@ -413,7 +406,7 @@ template<class T> double Histogram::rmse(const vector<T>& x, const vector<T>& y) return sqrt(mse); } -template<class T> double Histogram::correlation(const vector<T>& x, const vector<T>& y, int delay) const{ +template<class T> double StatFactory::correlation(const vector<T>& x, const vector<T>& y, int delay) const{ double meanX=0; double meanY=0; double varX=0; @@ -442,7 +435,7 @@ template<class T> double Histogram::correlation(const vector<T>& x, const vector return 0; } -template<class T> double Histogram::cross_correlation(const vector<T>& x, const vector<T>& y, int maxdelay, vector<T>& z) const{ +template<class T> double StatFactory::cross_correlation(const vector<T>& x, const vector<T>& y, int maxdelay, vector<T>& z) const{ z.clear(); double sumCorrelation=0; for (int delay=-maxdelay;delay<maxdelay;delay++) { @@ -452,7 +445,7 @@ template<class T> double Histogram::cross_correlation(const vector<T>& x, const return sumCorrelation; } - template<class T> double Histogram::linear_regression(const vector<T>& x, const vector<T>& y, double &c0, double &c1) const{ + template<class T> double StatFactory::linear_regression(const vector<T>& x, const vector<T>& y, double &c0, double &c1) const{ assert(x.size()==y.size()); assert(x.size()); double cov00; @@ -463,13 +456,175 @@ template<class T> double Histogram::cross_correlation(const vector<T>& x, const return (1-sumsq/var(y)/(y.size()-1)); } +//alternatively: use GNU scientific library: +// gsl_stats_correlation (const double data1[], const size_t stride1, const double data2[], const size_t stride2, const size_t n) + +template<class T> void StatFactory::interpolateUp(const vector< vector<T> >& input, vector< vector<T> >& output, double start, double end, double step, int type) +{ + int nsample=input.size()-1;//first sample contains wavelength + int nband=input[0].size(); + output.clear(); + output.resize(nsample+1);//first sample contains wavelength + start=(start)?start:floor(input[0][0]); + end=(end)?end:ceil(input[0].back()); + for(double xi=start;xi<=end;xi+=step) + output[0].push_back(xi); + for(int isample=1;isample<nsample+1;++isample){ + gsl_interp_accel *acc=gsl_interp_accel_alloc(); + gsl_spline *spline; + switch(type){ + case(POLYNOMIAL): + spline=gsl_spline_alloc(gsl_interp_polynomial,nband); + break; + case(CSPLINE): + spline=gsl_spline_alloc(gsl_interp_cspline,nband); + break; + case(PERIODIC): + spline=gsl_spline_alloc(gsl_interp_cspline_periodic,nband); + break; + case(AKIMA): + spline=gsl_spline_alloc(gsl_interp_akima,nband); + break; + case(PERIODIC): + spline=gsl_spline_alloc(gsl_interp_akima_periodic,nband); + break; + case(LINEAR): + default: + spline=gsl_spline_alloc(gsl_interp_linear,nband); + break; + case(UNDEFINED): + default:{ + string errorString="Error: interpolation type not defined: "; + errorString+=type; + throw(errorString); + break; + } + } + gsl_spline_init(spline,&(input[0][0]),&(input[isample][0]),nband); + for(double xi=start;xi<=end;xi+=step){ + if(!type&&xi>input[0].back()) + output[isample].push_back(output[isample].back()); + else + output[isample].push_back(gsl_spline_eval(spline,xi,acc)); + } + gsl_spline_free(spline); + gsl_interp_accel_free(acc); + + } +} + +template<class T> void StatFactory::interpolateUp(const vector<T>& input, vector<T>& output, int nbin) +{ + assert(input.size()); + assert(nbin); + output.clear(); + int dim=input.size(); + for(int i=0;i<dim;++i){ + double deltaX=0; + double left=input[i]; + if(i<dim-1){ + double right=(i<dim-1)? input[i+1]:input[i]; + deltaX=(right-left)/static_cast<double>(nbin); + for(int x=0;x<nbin;++x){ + output.push_back(left+x*deltaX); + } + } + else + output.push_back(input.back()); + } } +template<class T> void StatFactory::interpolateUp(double* input, int dim, vector<T>& output, int nbin) +{ + assert(nbin); + output.clear(); + for(int i=0;i<dim;++i){ + double deltaX=0; + double left=input[i]; + if(i<dim-1){ + double right=(i<dim-1)? input[i+1]:input[i]; + deltaX=(right-left)/static_cast<double>(nbin); + for(int x=0;x<nbin;++x){ + output.push_back(left+x*deltaX); + } + } + else + output.push_back(input[dim-1]); + } +} -//alternatively: use GNU scientific library: -// gsl_stats_correlation (const double data1[], const size_t stride1, const double data2[], const size_t stride2, const size_t n) +template<class T> void StatFactory::interpolateDown(const vector<T>& input, vector<T>& output, int nbin) +{ + assert(input.size()); + assert(nbin); + output.clear(); + int dim=input.size(); + int x=0; + output.push_back(input[0]); + for(int i=1;i<dim;++i){ + if(i%nbin) + continue; + else{ + x=(i-1)/nbin+1; + output.push_back(input[i]); + } + } +} + +template<class T> void StatFactory::interpolateDown(double* input, int dim, vector<T>& output, int nbin) +{ + assert(nbin); + output.clear(); + int x=0; + output.push_back(input[0]); + for(int i=1;i<dim;++i){ + if(i%nbin) + continue; + else{ + x=(i-1)/nbin+1; + output.push_back(input[i]); + } + } +} +} + +#endif /* _STATFACTORY_H_ */ +// void Histogram::signature(double m1, double m2, double& k, double& alpha, double& beta, double e) +// { +// double y=m1*m1/m2; +// beta=F_1(y,0.1,10.0,e); +// double fb=F(beta); +// double g=exp(lgamma(1.0/beta)); +// alpha=m1*g/exp(lgamma(2.0/beta)); +// k=beta/(2*alpha*g); +// // cout << "y, alpha, beta: " << y << ", " << alpha << ", " << beta << endl; +// } -using namespace histogram; +// double Histogram::F(double x) +// { +// double g2=exp(lgamma(2.0/x)); +// return(g2*g2/exp(lgamma(3.0/x))/exp(lgamma(1.0/x))); +// } -#endif /* _HISTOGRAM_H_ */ +// //x1 is under estimate, x2 is over estimate, e is error +// double Histogram::F_1(double y, double x1, double x2, double e) +// { +// double f1=F(x1); +// double f2=F(x2); +// assert(f1!=f2); +// double x=x1+(x2-x1)*(y-f1)/(f2-f1); +// double f=F(x); +// while(f-y>=e||y-f>=e){ +// if(f<y) +// x1=x; +// else +// x2=x; +// if(x1==x2) +// return x1; +// assert(f1!=f2); +// x=x1+(x2-x1)*(y-f1)/(f2-f1); +// f=F(x); +// } +// return x; +// } diff --git a/src/apps/pkclassify_nn.cc b/src/apps/pkclassify_nn.cc index 8b2465c..70433f5 100644 --- a/src/apps/pkclassify_nn.cc +++ b/src/apps/pkclassify_nn.cc @@ -317,7 +317,6 @@ int main(int argc, char *argv[]) assert(offset_opt.size()==nband); if(scale_opt.size()>1) assert(scale_opt.size()==nband); - Histogram hist; for(int iband=0;iband<nband;++iband){ if(verbose_opt[0]>=1) cout << "scaling for band" << iband << endl; diff --git a/src/apps/pkclassify_svm.cc b/src/apps/pkclassify_svm.cc index 56fdfa9..ca7200d 100644 --- a/src/apps/pkclassify_svm.cc +++ b/src/apps/pkclassify_svm.cc @@ -349,7 +349,6 @@ int main(int argc, char *argv[]) assert(offset_opt.size()==nband); if(scale_opt.size()>1) assert(scale_opt.size()==nband); - Histogram hist; for(int iband=0;iband<nband;++iband){ if(verbose_opt[0]>=1) std::cout << "scaling for band" << iband << std::endl; diff --git a/src/apps/pkdumpogr.cc b/src/apps/pkdumpogr.cc index 53a498b..1d2536e 100644 --- a/src/apps/pkdumpogr.cc +++ b/src/apps/pkdumpogr.cc @@ -23,7 +23,6 @@ along with pktools. If not, see <http://www.gnu.org/licenses/>. #include <assert.h> #include "base/Optionpk.h" #include "imageclasses/ImgReaderOgr.h" -#include "algorithms/Histogram.h" #include "pkdumpogr.h" int main(int argc, char *argv[]) diff --git a/src/apps/pkextract.cc b/src/apps/pkextract.cc index b950de8..8a7dde0 100644 --- a/src/apps/pkextract.cc +++ b/src/apps/pkextract.cc @@ -27,7 +27,7 @@ along with pktools. If not, see <http://www.gnu.org/licenses/>. #include "imageclasses/ImgReaderGdal.h" #include "imageclasses/ImgWriterOgr.h" #include "base/Optionpk.h" -#include "algorithms/Histogram.h" +#include "algorithms/StatFactory.h" #ifndef PI #define PI 3.1415926535897932384626433832795 @@ -101,7 +101,7 @@ int main(int argc, char *argv[]) if(verbose_opt[0]) std::cout << class_opt << std::endl; - Histogram hist; + statfactory::StatFactory stat; Vector2d<unsigned int> posdata; unsigned long int nsample=0; unsigned long int ntotalvalid=0; @@ -1590,8 +1590,8 @@ int main(int argc, char *argv[]) case(2):{//proportion classes if(verbose_opt[0]) std::cout << "number of points in polygon: " << nPointPolygon << std::endl; - hist.normalize_pct(polyValues); - // hist.sum(polyValues); + stat.normalize_pct(polyValues); + // stat.sum(polyValues); for(int index=0;index<polyValues.size();++index){ double theValue=polyValues[index]; ostringstream fs; @@ -1607,7 +1607,7 @@ int main(int argc, char *argv[]) assert(polygon_opt[0]);//not implemented for points if(verbose_opt[0]) std::cout << "number of points in polygon: " << nPointPolygon << std::endl; - hist.normalize_pct(polyValues); + stat.normalize_pct(polyValues); assert(polyValues.size()==2);//11:broadleaved, 12:coniferous if(polyValues[0]>=75)//broadleaved writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(11)); @@ -1633,7 +1633,7 @@ int main(int argc, char *argv[]) if(verbose_opt[0]) std::cout << "number of points in polygon: " << nPointPolygon << std::endl; //search for min class - //todo: change to minClass=hist.max(class_opt) once Optionpk is implemented... + //todo: change to minClass=stat.max(class_opt) once Optionpk is implemented... int minClass=class_opt[class_opt.size()-1];//!hard coded for now, maximum class is last entry in class_opt for(int iclass=0;iclass<class_opt.size();++iclass){ if(polyValues[iclass]>0){ @@ -2151,8 +2151,8 @@ int main(int argc, char *argv[]) case(2):{//proportion classes if(verbose_opt[0]) std::cout << "number of points in polygon: " << nPointPolygon << std::endl; - hist.normalize_pct(polyValues); - // hist.sum(polyValues); + stat.normalize_pct(polyValues); + // stat.sum(polyValues); for(int index=0;index<polyValues.size();++index){ double theValue=polyValues[index]; ostringstream fs; @@ -2168,7 +2168,7 @@ int main(int argc, char *argv[]) assert(polygon_opt[0]);//not implemented for points if(verbose_opt[0]) std::cout << "number of points in polygon: " << nPointPolygon << std::endl; - hist.normalize_pct(polyValues); + stat.normalize_pct(polyValues); assert(polyValues.size()==2);//11:broadleaved, 12:coniferous if(polyValues[0]>=75)//broadleaved writePolygonFeature->SetField(label_opt[0].c_str(),static_cast<int>(11)); @@ -2194,7 +2194,7 @@ int main(int argc, char *argv[]) if(verbose_opt[0]) std::cout << "number of points in polygon: " << nPointPolygon << std::endl; //search for min class - //todo: change to minClass=hist.max(class_opt) once Optionpk is implemented... + //todo: change to minClass=stat.max(class_opt) once Optionpk is implemented... int minClass=class_opt[class_opt.size()-1];//!hard coded for now, maximum class is last entry in class_opt for(int iclass=0;iclass<class_opt.size();++iclass){ if(polyValues[iclass]>0){ diff --git a/src/apps/pkfs_nn.cc b/src/apps/pkfs_nn.cc index c97f41e..82fbf53 100644 --- a/src/apps/pkfs_nn.cc +++ b/src/apps/pkfs_nn.cc @@ -314,7 +314,6 @@ int main(int argc, char *argv[]) assert(offset_opt.size()==nband); if(scale_opt.size()>1) assert(scale_opt.size()==nband); - Histogram hist; for(int iband=0;iband<nband;++iband){ if(verbose_opt[0]>1) std::cout << "scaling for band" << iband << std::endl; diff --git a/src/apps/pklas2img.cc b/src/apps/pklas2img.cc index 78f32da..8496c8a 100644 --- a/src/apps/pklas2img.cc +++ b/src/apps/pklas2img.cc @@ -23,7 +23,7 @@ along with pktools. If not, see <http://www.gnu.org/licenses/>. #include "imageclasses/ImgWriterGdal.h" #include "imageclasses/ImgReaderOgr.h" #include "fileclasses/FileReaderLas.h" -#include "algorithms/Histogram.h" +#include "algorithms/StatFactory.h" #include "algorithms/Filter2d.h" int main(int argc,char **argv) { @@ -316,7 +316,7 @@ int main(int argc,char **argv) { std::cout << "processing LiDAR points" << std::endl; progress=0; pfnProgress(progress,pszMessage,pProgressArg); - Histogram hist; + statfactory::StatFactory stat; //fill inputData in outputData if(composite_opt[0]=="profile"){ assert(postFilter_opt[0]=="none"); @@ -332,17 +332,17 @@ int main(int argc,char **argv) { if(!inputData[irow][icol].size()) outputData[irow][icol]=(static_cast<float>((flag_opt[0]))); else{ - Histogram hist; + statfactory::StatFactory stat; if(composite_opt[0]=="min") - outputData[irow][icol]=hist.min(inputData[irow][icol]); + outputData[irow][icol]=stat.min(inputData[irow][icol]); else if(composite_opt[0]=="max") - outputData[irow][icol]=hist.max(inputData[irow][icol]); + outputData[irow][icol]=stat.max(inputData[irow][icol]); else if(composite_opt[0]=="median") - outputData[irow][icol]=hist.median(inputData[irow][icol]); + outputData[irow][icol]=stat.median(inputData[irow][icol]); else if(composite_opt[0]=="mean") - outputData[irow][icol]=hist.mean(inputData[irow][icol]); + outputData[irow][icol]=stat.mean(inputData[irow][icol]); else if(composite_opt[0]=="sum") - outputData[irow][icol]=hist.sum(inputData[irow][icol]); + outputData[irow][icol]=stat.sum(inputData[irow][icol]); else if(composite_opt[0]=="first") outputData[irow][icol]=inputData[irow][icol][0]; else if(composite_opt[0]=="last") @@ -355,11 +355,11 @@ int main(int argc,char **argv) { } float min=0; float max=0; - hist.minmax(inputData[irow][icol],inputData[irow][icol].begin(),inputData[irow][icol].end(),min,max); + stat.minmax(inputData[irow][icol],inputData[irow][icol].begin(),inputData[irow][icol].end(),min,max); if(verbose_opt[0]) std::cout << "min,max: " << min << "," << max << std::endl; if(max>min){ - hist.percentiles(inputData[irow][icol],inputData[irow][icol].begin(),inputData[irow][icol].end(),profile,nband,min,max); + stat.percentiles(inputData[irow][icol],inputData[irow][icol].begin(),inputData[irow][icol].end(),profile,nband,min,max); assert(profile.size()==nband); for(int iband=0;iband<nband;++iband) outputProfile[iband][icol]=profile[iband]; diff --git a/src/apps/pkmosaic.cc b/src/apps/pkmosaic.cc index 62ae98c..75b907b 100644 --- a/src/apps/pkmosaic.cc +++ b/src/apps/pkmosaic.cc @@ -26,7 +26,7 @@ along with pktools. If not, see <http://www.gnu.org/licenses/>. #include "imageclasses/ImgReaderOgr.h" #include "base/Vector2d.h" #include "base/Optionpk.h" -#include "algorithms/Histogram.h" +#include "algorithms/StatFactory.h" using namespace std; @@ -383,7 +383,7 @@ int main(int argc, char *argv[]) vector<short> fileBuffer(ncol);//holds the number of used files Vector2d<short> maxBuffer;//buffer used for maximum voting Vector2d<double> readBuffer(nband); - Histogram hist; + statfactory::StatFactory stat; if(mrule_opt[0]==1)//ndvi assert(ruleBand_opt.size()==2); if(mrule_opt[0]==6){//max voting @@ -814,7 +814,7 @@ int main(int argc, char *argv[]) else{ for(int icol=0;icol<imgWriter.nrOfCol();++icol){ vector<short>::iterator maxit=maxBuffer[icol].begin(); - maxit=hist.max(maxBuffer[icol],maxBuffer[icol].begin(),maxBuffer[icol].end()); + maxit=stat.max(maxBuffer[icol],maxBuffer[icol].begin(),maxBuffer[icol].end()); writeBuffer[0][icol]=distance(maxBuffer[icol].begin(),maxit); fileBuffer[icol]=*(maxit); } @@ -838,17 +838,17 @@ int main(int argc, char *argv[]) case(5): assert(storeBuffer[bands[iband]][icol].size()==fileBuffer[icol]); if(storeBuffer[bands[iband]][icol].size()) - writeBuffer[iband][icol]=hist.mean(storeBuffer[bands[iband]][icol]); + writeBuffer[iband][icol]=stat.mean(storeBuffer[bands[iband]][icol]); break; case(7): assert(storeBuffer[bands[iband]][icol].size()==fileBuffer[icol]); if(storeBuffer[bands[iband]][icol].size()) - writeBuffer[iband][icol]=hist.median(storeBuffer[bands[iband]][icol]); + writeBuffer[iband][icol]=stat.median(storeBuffer[bands[iband]][icol]); break; case(8)://sum assert(storeBuffer[bands[iband]][icol].size()==fileBuffer[icol]); if(storeBuffer[bands[iband]][icol].size()) - writeBuffer[iband][icol]=hist.sum(storeBuffer[bands[iband]][icol]); + writeBuffer[iband][icol]=stat.sum(storeBuffer[bands[iband]][icol]); break; default: break; diff --git a/src/apps/pkopt_svm.cc b/src/apps/pkopt_svm.cc index 903f046..5b30995 100644 --- a/src/apps/pkopt_svm.cc +++ b/src/apps/pkopt_svm.cc @@ -337,7 +337,6 @@ int main(int argc, char *argv[]) assert(offset_opt.size()==nband); if(scale_opt.size()>1) assert(scale_opt.size()==nband); - Histogram hist; for(int iband=0;iband<nband;++iband){ if(verbose_opt[0]>1) std::cout << "scaling for band" << iband << std::endl; diff --git a/src/apps/pksensormodel.cc b/src/apps/pksensormodel.cc index 9faf0e1..a63a589 100644 --- a/src/apps/pksensormodel.cc +++ b/src/apps/pksensormodel.cc @@ -25,7 +25,7 @@ along with pktools. If not, see <http://www.gnu.org/licenses/>. #include <nlopt.hpp> #include "base/Optionpk.h" #include "algorithms/OptFactory.h" -#include "algorithms/Histogram.h" +#include "algorithms/StatFactory.h" #include "pksensormodel.h" double objFunction(const std::vector<double> &x, std::vector<double> &grad, void *my_func_data){ @@ -599,7 +599,6 @@ int main(int argc, char *argv[]) std::cout << "opening output file: " << output_opt[0] << std::endl; outputStream.open(output_opt[0].c_str()); } - Histogram hist; vector<double> errorv; oSourceSRS.importFromEPSG(4326); @@ -657,7 +656,8 @@ int main(int argc, char *argv[]) if(mean_opt[0]){ double theMean=0; double theVar=0; - hist.meanVar(errorv,theMean,theVar); + statfactory::StatFactory stat; + stat.meanVar(errorv,theMean,theVar); if(output_opt.size()) outputStream << setprecision(12) << "mean stddev: " << theMean << " " << sqrt(theVar) << std::endl; else diff --git a/src/apps/pkstat.cc b/src/apps/pkstat.cc index 1467dac..bec8c1a 100644 --- a/src/apps/pkstat.cc +++ b/src/apps/pkstat.cc @@ -23,7 +23,7 @@ along with pktools. If not, see <http://www.gnu.org/licenses/>. #include <math.h> #include "base/Optionpk.h" #include "fileclasses/FileReaderAscii.h" -#include "algorithms/Histogram.h" +#include "algorithms/StatFactory.h" using namespace std; @@ -91,7 +91,7 @@ int main(int argc, char *argv[]) } vector< vector<double> > dataVector(col_opt.size()); - vector< vector<int> > histVector(col_opt.size()); + vector< vector<int> > statVector(col_opt.size()); FileReaderAscii asciiReader(input_opt[0]); asciiReader.setFieldSeparator(fs_opt[0]); @@ -103,7 +103,7 @@ int main(int argc, char *argv[]) assert(dataVector.size()); double minValue=min_opt[0]; double maxValue=max_opt[0]; - Histogram hist; + statfactory::StatFactory stat; for(int icol=0;icol<col_opt.size();++icol){ if(!dataVector[icol].size()){ std::cerr << "Warning: dataVector[" << icol << "] is empty" << std::endl; @@ -112,56 +112,56 @@ int main(int argc, char *argv[]) if(size_opt[0]) cout << "sample size column " << col_opt[icol] << ": " << dataVector[icol].size() << endl; if(mean_opt[0]) - cout << "mean value column " << col_opt[icol] << ": " << hist.mean(dataVector[icol]) << endl; + cout << "mean value column " << col_opt[icol] << ": " << stat.mean(dataVector[icol]) << endl; if(var_opt[0]) - cout << "variance value column " << col_opt[icol] << ": " << hist.var(dataVector[icol]) << endl; + cout << "variance value column " << col_opt[icol] << ": " << stat.var(dataVector[icol]) << endl; if(stdev_opt[0]) - cout << "standard deviation column " << col_opt[icol] << ": " << sqrt(hist.var(dataVector[icol])) << endl; + cout << "standard deviation column " << col_opt[icol] << ": " << sqrt(stat.var(dataVector[icol])) << endl; if(skewness_opt[0]) - cout << "skewness value column " << col_opt[icol] << ": " << hist.skewness(dataVector[icol]) << endl; + cout << "skewness value column " << col_opt[icol] << ": " << stat.skewness(dataVector[icol]) << endl; if(kurtosis_opt[0]) - cout << "kurtosis value column " << col_opt[icol] << ": " << hist.kurtosis(dataVector[icol]) << endl; + cout << "kurtosis value column " << col_opt[icol] << ": " << stat.kurtosis(dataVector[icol]) << endl; if(sum_opt[0]){ cout << setprecision(2); - cout << fixed << "sum column " << col_opt[icol] << ": " << (hist.sum(dataVector[icol])) << endl; + cout << fixed << "sum column " << col_opt[icol] << ": " << (stat.sum(dataVector[icol])) << endl; } if(median_opt[0]) - cout << "median value column " << col_opt[icol] << ": " << hist.median(dataVector[icol]) << endl; + cout << "median value column " << col_opt[icol] << ": " << stat.median(dataVector[icol]) << endl; if(minmax_opt[0]){ - cout << "min value column " << col_opt[icol] << ": " << hist.min(dataVector[icol]) << endl; - cout << "max value column " << col_opt[icol] << ": " << hist.max(dataVector[icol]) << endl; + cout << "min value column " << col_opt[icol] << ": " << stat.min(dataVector[icol]) << endl; + cout << "max value column " << col_opt[icol] << ": " << stat.max(dataVector[icol]) << endl; } if(histogram_opt[0]){ if(verbose_opt[0]) std::cout << "calculating histogram for col " << icol << std::endl; - hist.distribution(dataVector[icol],dataVector[icol].begin(),dataVector[icol].end(),histVector[icol],nbin_opt[0],minValue,maxValue); + stat.distribution(dataVector[icol],dataVector[icol].begin(),dataVector[icol].end(),statVector[icol],nbin_opt[0],minValue,maxValue); if(verbose_opt[0]) std::cout << "min and max values: " << minValue << ", " << maxValue << std::endl; } } if(correlation_opt[0]){ assert(dataVector.size()==2); - cout << "correlation between columns " << col_opt[0] << " and " << col_opt[1] << ": " << hist.correlation(dataVector[0],dataVector[1]) << endl; + cout << "correlation between columns " << col_opt[0] << " and " << col_opt[1] << ": " << stat.correlation(dataVector[0],dataVector[1]) << endl; } if(rmse_opt[0]){ assert(dataVector.size()==2); - cout << "root mean square error between columns " << col_opt[0] << " and " << col_opt[1] << ": " << hist.rmse(dataVector[0],dataVector[1]) << endl; + cout << "root mean square error between columns " << col_opt[0] << " and " << col_opt[1] << ": " << stat.rmse(dataVector[0],dataVector[1]) << endl; } if(reg_opt[0]){ assert(dataVector.size()==2); double c0=0; double c1=0; - double r2=hist.linear_regression(dataVector[0],dataVector[1],c0,c1); + double r2=stat.linear_regression(dataVector[0],dataVector[1],c0,c1); cout << "linear regression between columns: " << col_opt[0] << " and " << col_opt[1] << ": " << c0 << "+" << c1 << " * x " << " with R^2 (square correlation coefficient): " << r2 << endl; } if(histogram_opt[0]){ - for(int irow=0;irow<histVector.begin()->size();++irow){ + for(int irow=0;irow<statVector.begin()->size();++irow){ std::cout << (maxValue-minValue)*irow/(nbin_opt[0]-1)+minValue << " "; for(int icol=0;icol<col_opt.size();++icol){ if(relative_opt[0]) - std::cout << 100.0*static_cast<double>(histVector[icol][irow])/static_cast<double>(dataVector[icol].size()); + std::cout << 100.0*static_cast<double>(statVector[icol][irow])/static_cast<double>(dataVector[icol].size()); else - std::cout << histVector[icol][irow]; + std::cout << statVector[icol][irow]; if(icol<col_opt.size()-1) cout << " "; } diff --git a/src/apps/pkstatogr.cc b/src/apps/pkstatogr.cc index a1d497b..076259f 100644 --- a/src/apps/pkstatogr.cc +++ b/src/apps/pkstatogr.cc @@ -23,7 +23,7 @@ along with pktools. If not, see <http://www.gnu.org/licenses/>. #include <assert.h> #include "base/Optionpk.h" #include "imageclasses/ImgReaderOgr.h" -#include "algorithms/Histogram.h" +#include "algorithms/StatFactory.h" int main(int argc, char *argv[]) { @@ -70,7 +70,7 @@ int main(int argc, char *argv[]) ImgReaderOgr inputReader(input_opt[0]); vector<double> theData; - Histogram hist; + statfactory::StatFactory stat; //todo: implement ALL for(int ifield=0;ifield<fieldname_opt.size();++ifield){ @@ -84,10 +84,10 @@ int main(int argc, char *argv[]) int nbin=(nbin_opt[0]>1)? nbin_opt[0] : 2; std::cout << " --fname " << fieldname_opt[ifield]; try{ - hist.distribution(theData,theData.begin(),theData.end(),binData,nbin,minimum,maximum); + stat.distribution(theData,theData.begin(),theData.end(),binData,nbin,minimum,maximum); double theMean=0; double theVar=0; - hist.meanVar(theData,theMean,theVar); + stat.meanVar(theData,theMean,theVar); if(mean_opt[0]) std::cout << " --mean " << theMean; if(stdev_opt[0]) @@ -97,7 +97,7 @@ int main(int argc, char *argv[]) if(max_opt[0]) cout << " -M " << maximum; if(median_opt[0]) - std::cout << " -median " << hist.median(theData); + std::cout << " -median " << stat.median(theData); if(size_opt[0]) std::cout << " -size " << theData.size(); std::cout << std::endl; -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/pktools.git _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel