[pktools] 128/375: corrected errors in FileReaderAscii

Bas Couwenberg sebastic at xs4all.nl
Wed Dec 3 21:54:06 UTC 2014


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 5af0025e4c3a1d635390df24894c3b6997446c89
Author: Pieter Kempeneers <kempenep at gmail.com>
Date:   Mon Sep 9 17:47:22 2013 +0200

    corrected errors in FileReaderAscii
---
 ChangeLog                          |  4 +++
 src/apps/pkstat.cc                 | 13 +++++++--
 src/apps/pkstatogr.cc              | 56 +++++++++++++++++++++++++++-----------
 src/fileclasses/FileReaderAscii.cc |  2 +-
 src/fileclasses/FileReaderAscii.h  | 12 ++++----
 5 files changed, 62 insertions(+), 25 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 19ccbe1..1745593 100755
--- a/ChangeLog
+++ b/ChangeLog
@@ -118,7 +118,11 @@ version 2.4.1
 	ordering of labels before training
 version 2.4.2
  - clean up of using namespace std in header files
+ - FileReaderAscii
+	corrected error for constructor with fieldseparator argument
  - pkinfo
 	bug fixed with -min and -max
  - pkfilter
 	new methods for scrambling and shifting images
+ - pkstatogr
+	make histogram more similar to pkstat with support of relative option
diff --git a/src/apps/pkstat.cc b/src/apps/pkstat.cc
index bec8c1a..10caf0d 100644
--- a/src/apps/pkstat.cc
+++ b/src/apps/pkstat.cc
@@ -47,7 +47,7 @@ int main(int argc, char *argv[])
   Optionpk<double> min_opt("min","min","set minimum value",0);
   Optionpk<double> max_opt("max","max","set maximum value",0);
   Optionpk<bool> histogram_opt("hist","hist","calculate histogram",false);
-  Optionpk<short> nbin_opt("bin","bin","number of bins to calculate histogram",10);
+  Optionpk<short> nbin_opt("bin","bin","number of bins to calculate histogram",0);
   Optionpk<bool> relative_opt("rel","relative","use percentiles for histogram to calculate histogram",false);
   Optionpk<bool> correlation_opt("cor","correlation","calculate Pearson produc-moment correlation coefficient between two columns (defined by -c <col1> -c <col2>",false);
   Optionpk<bool> rmse_opt("e","rmse","calculate root mean square error between two columns (defined by -c <col1> -c <col2>",false);
@@ -101,9 +101,17 @@ int main(int argc, char *argv[])
     asciiReader.setMaxRow(range_opt[1]);
   asciiReader.readData(dataVector,col_opt);
   assert(dataVector.size());
+  statfactory::StatFactory stat;
   double minValue=min_opt[0];
   double maxValue=max_opt[0];
-  statfactory::StatFactory stat;
+  if(histogram_opt[0]){
+    if(nbin_opt[0]<1){
+      std::cerr << "Warning: number of bins not defined, calculating bins from min and max value" << std::endl;
+      if(maxValue<=minValue)
+        stat.minmax(dataVector[0],dataVector[0].begin(),dataVector[0].end(),minValue,maxValue);
+      nbin_opt[0]=maxValue-minValue+1;
+    }
+  }
   for(int icol=0;icol<col_opt.size();++icol){
     if(!dataVector[icol].size()){
       std::cerr << "Warning: dataVector[" << icol << "] is empty" << std::endl;
@@ -132,6 +140,7 @@ int main(int argc, char *argv[])
       cout << "max value column " << col_opt[icol] << ": " << stat.max(dataVector[icol]) << endl;
     }
     if(histogram_opt[0]){
+      assert(nbin_opt[0]);
       if(verbose_opt[0])
         std::cout << "calculating histogram for col " << icol << std::endl;
       stat.distribution(dataVector[icol],dataVector[icol].begin(),dataVector[icol].end(),statVector[icol],nbin_opt[0],minValue,maxValue);
diff --git a/src/apps/pkstatogr.cc b/src/apps/pkstatogr.cc
index 076259f..871b2c5 100644
--- a/src/apps/pkstatogr.cc
+++ b/src/apps/pkstatogr.cc
@@ -29,9 +29,12 @@ int main(int argc, char *argv[])
 {
   Optionpk<string> input_opt("i", "input", "Input shape file", "");
   Optionpk<string> fieldname_opt("n", "fname", "fields on which to calculate statistics", "");
+  Optionpk<bool> minmax_opt("mm","minmax","calculate minimum and maximum value",false);
+  Optionpk<double> min_opt("min","min","set minimum value",0);
+  Optionpk<double> max_opt("max","max","set maximum value",0);
+  Optionpk<bool> histogram_opt("hist","hist","calculate histogram",false);
   Optionpk<short> nbin_opt("nbin", "nbin", "number of bins", 0);
-  Optionpk<bool> min_opt("min","min","calculate minimum value",false);
-  Optionpk<bool> max_opt("max","max","calculate maximum value",false);
+  Optionpk<bool> relative_opt("rel","relative","use percentiles for histogram to calculate histogram",false);
   Optionpk<bool> mean_opt("mean","mean","calculate mean value",false);
   Optionpk<bool> median_opt("median","median","calculate median value",false);
   Optionpk<bool> stdev_opt("stdev","stdev","calculate standard deviation",false);
@@ -42,9 +45,12 @@ int main(int argc, char *argv[])
   try{
     doProcess=input_opt.retrieveOption(argc,argv);
     fieldname_opt.retrieveOption(argc,argv);
-    nbin_opt.retrieveOption(argc,argv);
+    minmax_opt.retrieveOption(argc,argv);
     min_opt.retrieveOption(argc,argv);
     max_opt.retrieveOption(argc,argv);
+    histogram_opt.retrieveOption(argc,argv);
+    nbin_opt.retrieveOption(argc,argv);
+    relative_opt.retrieveOption(argc,argv);
     mean_opt.retrieveOption(argc,argv);
     median_opt.retrieveOption(argc,argv);
     stdev_opt.retrieveOption(argc,argv);
@@ -79,12 +85,26 @@ int main(int argc, char *argv[])
     theData.clear();
     inputReader.readData(theData,OFTReal,fieldname_opt[ifield],0,verbose_opt[0]);
     vector<int> binData;
-    double minimum=0;
-    double maximum=0;
-    int nbin=(nbin_opt[0]>1)? nbin_opt[0] : 2;
+    double minValue=min_opt[0];
+    double maxValue=max_opt[0];
+    if(histogram_opt[0]){
+      if(nbin_opt[0]<1){
+        if(maxValue<=minValue)
+          stat.minmax(theData,theData.begin(),theData.end(),minValue,maxValue);
+        nbin_opt[0]=maxValue-minValue+1;
+      }
+      assert(nbin_opt[0]);
+      try{
+        stat.distribution(theData,theData.begin(),theData.end(),binData,nbin_opt[0],minValue,maxValue);
+      }
+      catch(string theError){
+        std::cerr << "Warning: all identical values in data" << std::endl;
+        exit(1);
+      }
+    }
+    // int nbin=(nbin_opt[0]>1)? nbin_opt[0] : 2;
     std::cout << " --fname " << fieldname_opt[ifield];
     try{
-      stat.distribution(theData,theData.begin(),theData.end(),binData,nbin,minimum,maximum);
       double theMean=0;
       double theVar=0;
       stat.meanVar(theData,theMean,theVar);
@@ -92,18 +112,22 @@ int main(int argc, char *argv[])
         std::cout << " --mean " << theMean;
       if(stdev_opt[0])
         std::cout << " --stdev " << sqrt(theVar);
-      if(min_opt[0])
-        cout << " -m " << minimum;
-      if(max_opt[0])
-        cout << " -M " << maximum;
+      if(minmax_opt[0]){
+        cout << " -min " << stat.min(theData);
+        cout << " -max " << stat.max(theData);
+      }
       if(median_opt[0])
         std::cout << " -median " << stat.median(theData);
       if(size_opt[0])
         std::cout << " -size " << theData.size();
       std::cout << std::endl;
-      if(nbin_opt[0]>1){
-        for(int bin=0;bin<nbin;++bin)
-          std::cout << (maximum-minimum)*bin/(nbin-1)+minimum << " " << static_cast<double>(binData[bin])/theData.size() << std::endl;
+      if(histogram_opt[0]){
+        for(int bin=0;bin<nbin_opt[0];++bin){
+          if(relative_opt[0])
+            std::cout << (maxValue-minValue)*bin/(nbin_opt[0]-1)+minValue << " " << 100.0*static_cast<double>(binData[bin])/theData.size() << std::endl;
+          else
+            std::cout << (maxValue-minValue)*bin/(nbin_opt[0]-1)+minValue << " " << binData[bin] << std::endl;
+        }
       }
     }
     catch(string theError){
@@ -112,9 +136,9 @@ int main(int argc, char *argv[])
       if(stdev_opt[0])
         std::cout << " --stdev " << "0";
       if(min_opt[0])
-        cout << " -m " << theData.back();
+        cout << " -min " << theData.back();
       if(max_opt[0])
-        cout << " -M " << theData.back();
+        cout << " -max " << theData.back();
       if(median_opt[0])
         std::cout << " -median " << theData.back();
       if(size_opt[0])
diff --git a/src/fileclasses/FileReaderAscii.cc b/src/fileclasses/FileReaderAscii.cc
index 9a43672..dd110e8 100644
--- a/src/fileclasses/FileReaderAscii.cc
+++ b/src/fileclasses/FileReaderAscii.cc
@@ -31,7 +31,7 @@ FileReaderAscii::FileReaderAscii(const std::string& filename)
 }
 
 FileReaderAscii::FileReaderAscii(const std::string& filename, const char& fieldseparator)
-  : m_min(0),m_max(0),m_minRow(0),m_maxRow(0),m_fs(' '),m_comment(fieldseparator){
+  : m_min(0),m_max(0),m_minRow(0),m_maxRow(0),m_fs(fieldseparator),m_comment('#'){
   open(filename);
 }
 
diff --git a/src/fileclasses/FileReaderAscii.h b/src/fileclasses/FileReaderAscii.h
index e1e9e83..e407d1e 100644
--- a/src/fileclasses/FileReaderAscii.h
+++ b/src/fileclasses/FileReaderAscii.h
@@ -83,13 +83,13 @@ template<class T> unsigned int FileReaderAscii::readData(std::vector<T> &dataVec
             std::cout << item << " ";
           unsigned pos=item.find(m_comment);
           if(pos!=std::string::npos){
+            isComment=true;
             if(pos>0)
               item=item.substr(0,pos-1);
             else
               break;
             if(verbose)
               std::cout << "comment found, string is " << item << std::endl;
-            isComment=true;
           }
           if(ncol==col){
             T value=scale*string2type<T>(item)+offset;
@@ -136,13 +136,13 @@ template<class T> unsigned int FileReaderAscii::readData(std::vector<T> &dataVec
           // std::istringstream itemStream(item);
           unsigned pos=item.find(m_comment);
           if(pos!=std::string::npos){
+            isComment=true;
             if(pos>0)
               item=item.substr(0,pos-1);
             else
               break;
             if(verbose)
               std::cout << "comment found, string is " << item << std::endl;
-            isComment=true;
           }
           T value=scale*string2type<T>(item)+offset;
           // T value=string2type<T>(item);
@@ -199,13 +199,13 @@ template<class T> unsigned int FileReaderAscii::readData(std::vector<std::vector
             std::cout << item << " ";
           unsigned pos=item.find(m_comment);
           if(pos!=std::string::npos){
+            isComment=true;
             if(pos>0)
               item=item.substr(0,pos-1);
             else
               break;
             if(verbose)
               std::cout << "comment found, string is " << item << std::endl;
-            isComment=true;
           }
           for(int icol=0;icol<cols.size();++icol){
             if(ncol==cols[icol]){
@@ -228,7 +228,7 @@ template<class T> unsigned int FileReaderAscii::readData(std::vector<std::vector
         // if(dataVector.back().size())
         //   assert(ncol>=cols[0]);
       }
-      if(transpose)
+      if(sampleVector.size()&&transpose)
         dataVector.push_back(sampleVector);
       ++nrow;
     }
@@ -259,13 +259,13 @@ template<class T> unsigned int FileReaderAscii::readData(std::vector<std::vector
           // std::istringstream itemStream(item);
           unsigned pos=item.find(m_comment);
           if(pos!=std::string::npos){
+            isComment=true;
             if(pos>0)
               item=item.substr(0,pos-1);
             else
               break;
             if(verbose)
               std::cout << "comment found, string is " << item << std::endl;
-            isComment=true;
           }
           T value=scale*string2type<T>(item)+offset;
           // T value=string2type<T>(item);
@@ -290,7 +290,7 @@ template<class T> unsigned int FileReaderAscii::readData(std::vector<std::vector
         // if(dataVector.back().size())
         //   assert(ncol>=cols[0]);
       }
-      if(transpose)
+      if(sampleVector.size()&&transpose)
         dataVector.push_back(sampleVector);
       ++nrow;
     }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/pktools.git



More information about the Pkg-grass-devel mailing list