#include <HxHistogram.h>
Public Methods | |
Constructors | |
HxHistogram () | |
Construct an empty histogram. More... | |
HxHistogram (const HxHistogram &) | |
Copy constructor. More... | |
HxHistogram (int dimSize) | |
Construct a 1D histogram with a range from 0 to dimSize - 1 and a binWidth of 1. More... | |
HxHistogram (int dimSize1, int dimSize2) | |
Construct a 2D histogram with a range from 0 to dimSize - 1 and a binWidth of 1 in each dimension. More... | |
HxHistogram (int dimSize1, int dimSize2, int dimSize3) | |
Construct a 3D histogram with a range from 0 to dimSize - 1 and a binWidth of 1 in each dimension. More... | |
HxHistogram (HxValueType dataType, int dimensions, int dimSize1, int dimSize2=0, int dimSize3=0) | |
Construct Histogram with given data type and number of dimensions. More... | |
HxHistogram (HxValueType dataType, int dimensions, double lowBin1, double highBin1, int nBins1, double lowBin2, double highBin2, int nBins2, double lowBin3, double highBin3, int nBins3) | |
Construct a Histogram with given parameters. More... | |
HxHistogram (HxString filename) | |
Read a Histogram from disk. More... | |
Destructor | |
~HxHistogram () | |
Destructor. More... | |
Operators | |
HxHistogram & | operator= (const HxHistogram &) |
Assignment operator. More... | |
int | isNull () const |
Indicates wether this is a valid histogram. More... | |
operator int () const | |
Indicates wether this is a valid histogram. More... | |
Inquiry | |
int | ident () const |
The unique identifier of the histogram. More... | |
HxValueType | dataType () const |
The data value type. More... | |
int | dimensionality () const |
The number of dimensions of the histogram. More... | |
int | dimensionSize (int dim) const |
The size of the histogram in the i-th dimension. More... | |
int | nrOfBins () const |
The total size of the histogram. More... | |
double | lowBin (int dim) const |
The lowest bin in the i-th dimension. More... | |
double | highBin (int dim) const |
The highest bin in the i-th dimension. More... | |
double | binWidth (int dim) const |
The bin width in the i-th dimension. More... | |
double | binToValue (int bin, int dimension) const |
Translate bin to value. More... | |
int | valueToBin (double value, int dimension) const |
Translate value to bin. More... | |
double | get (int bin1) const |
Get the number of elements in the given bin. More... | |
double | get (int bin1, int bin2) const |
Get the number of elements in the given bin. More... | |
double | get (int bin1, int bin2, int bin3) const |
Get the number of elements in the given bin. More... | |
Checked modification | |
void | insertValChecked (int val) |
Insert value in 1D histogram. More... | |
void | insertValChecked (double val) |
Insert value in 1D histogram. More... | |
void | insertValChecked (HxScalarInt val) |
Insert value in 1D histogram. More... | |
void | insertValChecked (HxScalarDouble val) |
Insert value in 1D histogram. More... | |
void | insertValChecked (HxVec2Int val) |
Insert value in 2D histogram. More... | |
void | insertValChecked (HxVec2Double val) |
Insert value in 2D histogram. More... | |
void | insertValChecked (HxVec3Int val) |
Insert value in 3D histogram. More... | |
void | insertValChecked (HxVec3Double val) |
Insert value in 3D histogram. More... | |
void | incBinChecked (int bin) |
Increment the given bin. More... | |
void | incBinChecked (int bin1, int bin2) |
Increment the given bin. More... | |
void | incBinChecked (int bin1, int bin2, int bin3) |
Increment the given bin. More... | |
Unchecked modification | |
void | insertVal (int val) |
Insert value in 1D histogram. More... | |
void | insertVal (double val) |
Insert value in 1D histogram. More... | |
void | insertVal (double val, double sigma) |
Kernel Density Estimator. More... | |
void | insertVal (HxScalarInt val) |
Insert value in 1D histogram. More... | |
void | insertVal (HxScalarDouble val) |
Insert value in 1D histogram. More... | |
void | insertVal (HxVec2Int val) |
Insert value in 2D histogram. More... | |
void | insertVal (HxVec2Double val) |
Insert value in 2D histogram. More... | |
void | insertVal (HxVec3Int val) |
Insert value in 3D histogram. More... | |
void | insertVal (HxVec3Double val) |
Insert value in 3D histogram. More... | |
void | incBin (int bin) |
Increment the given bin (assumes 1D histogram). More... | |
void | incBin (int bin1, int bin2) |
Increment the given bin (assumes 2D histogram). More... | |
void | incBin (int bin1, int bin2, int bin3) |
Increment the given bin (assumes 3D histogram). More... | |
void | setBin (int bin1, long val) |
Reset the value of the given bin to val (assumes 1D histogram). More... | |
void | setBin (int bin1, int bin2, long val) |
Reset the value of the given bin to val (assumes 2D histogram). More... | |
void | setBin (int bin1, int bin2, int bin3, long val) |
Reset the value of the given bin to val (assumes 3D histogram). More... | |
void | setBin (int bin1, double val) |
Reset the value of the given bin to val (assumes 1D histogram). More... | |
void | setBin (int bin1, int bin2, double val) |
Reset the value of the given bin to val (assumes 2D histogram). More... | |
void | setBin (int bin1, int bin2, int bin3, double val) |
Reset the value of the given bin to val (assumes 3D histogram). More... | |
Statistics | |
HxHistogram | smooth (double sigma=3.0) |
Smooth histogram data. More... | |
std::list< HxVec2Double > | modes () |
Get histogram modes. More... | |
HxHistogram | normalize (double weight=1.0) |
Normalize histogram data. More... | |
double | sum () const |
The sum of the histogram. More... | |
double | minVal () const |
The minimum number of elements in the histogram. More... | |
double | minVal (int *index) const |
The minimum number of elements in the histogram. More... | |
double | maxVal () const |
The maximum number of elements in the histogram. More... | |
double | maxVal (int *index) const |
The maximum number of elements in the histogram. More... | |
double | intersection (const HxHistogram &) const |
Intersection of histograms. More... | |
double | chiSquare (const HxHistogram &) const |
Chi square intersection of histograms. More... | |
double | chiSquareNorm (const HxHistogram &) const |
Normalized chi square intersection of histograms. More... | |
Output/display | |
HxHistogram | convert (HxValueType dataType) |
convert dataType. More... | |
void | getDataDouble (double *data) |
Fill the externally allocated buffer with data from this histogram. More... | |
void | getDataInt (int *data) |
Fill the externally allocated buffer with data from this histogram. More... | |
void | render3d (int *data, int dataWidth, int dataHeight, double elevation, double alpha, double threshold) |
Assume the histogram is a 3d rgb cube and render it for display in Java in the externally allocated data buffer. More... | |
STD_OSTREAM & | put (STD_OSTREAM &, HxString delimit="") const |
Print histogram data in the given stream. More... | |
int | write (HxString filename) |
Write histogram to disk. More... | |
Reduce operations | |
HxHistogram | threshold (double valThreshold) |
Returns new histogram in which bins with count<=valThreshold are set to 0.0, bins with count>valThreshold keep original value. More... | |
int | countBins (double valThreshold=0.0) |
Returns number of bins with count>valThreshold. More... | |
HxHistogram | reduceRange (int binMin1, int binMax1=-1, int binMin2=0, int binMax2=-1, int binMin3=0, int binMax3=-1) |
Returns new histogram containing given range of bins only. More... | |
HxHistogram | reduceRangeVal (double binValMin1, double binValMax1, double binValMin2=0, double binValMax2=0, double binValMin3=0, double binValMax3=0) |
Returns new histogram containing given range of values (mapped to bin numbers) only. More... | |
HxHistogram | to1D (int dim=1) |
Projects n-dimensional (1<n<=3) histogram on a 1-D histogram for given dimension. More... |
The current implementation supports 1, 2, and 3 dimensional histograms with real-valued data (no integer data yet). For each dimension a range (lowB - highB) and a number of bins has to be specified (typically highB - lowB + 1 to get a binWidth of 1). The number of bins in a given dimension is known as the dimensionSize. The width of a bin is defined as (highB - lowB) / (nBins - 1). The first bin goes from lowB to lowB + binWidth, the last bin from highB to highB + binWidth.
|
Construct an empty histogram.
00067 : _data(0) 00068 { 00069 } |
|
Copy constructor.
00071 : _data(rhs._data) 00072 { 00073 } |
|
Construct a 1D histogram with a range from 0 to dimSize - 1 and a binWidth of 1.
00076 { 00077 _data = new HxHistogramData(REAL_VALUE, 1, 00078 0, dimSize - 1, dimSize, 00079 0, 0, 0, 00080 0, 0, 0); 00081 } |
|
Construct a 2D histogram with a range from 0 to dimSize - 1 and a binWidth of 1 in each dimension.
00084 { 00085 _data = new HxHistogramData(REAL_VALUE, 2, 00086 0, dimSize1 - 1, dimSize1, 00087 0, dimSize2 - 1, dimSize2, 00088 0, 0, 0); 00089 } |
|
Construct a 3D histogram with a range from 0 to dimSize - 1 and a binWidth of 1 in each dimension.
00092 { 00093 _data = new HxHistogramData(REAL_VALUE, 3, 00094 0, dimSize1 - 1, dimSize1, 00095 0, dimSize2 - 1, dimSize2, 00096 0, dimSize3 - 1, dimSize3); 00097 } |
|
Construct Histogram with given data type and number of dimensions. The range in a dimension is 0 to dimSize - 1, the binWidth is 1.
00101 { 00102 _data = new HxHistogramData(dataType, dimensions, 00103 0, dimSize1 - 1, dimSize1, 00104 0, dimSize2 - 1, dimSize2, 00105 0, dimSize3 - 1, dimSize3); 00106 } |
|
Construct a Histogram with given parameters. If dataType == INT\_VALUE parameters are casted.
00112 { 00113 _data = new HxHistogramData(dataType, dimensions, 00114 lowBin1, highBin1, nBins1, 00115 lowBin2, highBin2, nBins2, 00116 lowBin3, highBin3, nBins3); 00117 } |
|
Read a Histogram from disk.
00124 { 00125 HxString name; 00126 FILE *fp; 00127 IOHEADER header; 00128 00129 name = filename + ".hst"; 00130 00131 fp = fopen(name.c_str(), "rb"); 00132 if (!fp) 00133 _data = 0; 00134 else { 00135 fread(&header, sizeof(header), 1, fp); 00136 00137 _data = new HxHistogramData(header.dataType, header.dimensions, 00138 header.lowBin1, header.highBin1, header.nBins1, 00139 header.lowBin2, header.highBin2, header.nBins2, 00140 header.lowBin3, header.highBin3, header.nBins3); 00141 00142 if (_data->_dataType == REAL_VALUE) 00143 fread(_data->_bins.realValue, _data->_totSize, 00144 sizeof(*(_data->_bins.realValue)), fp); 00145 else 00146 fread(_data->_bins.intValue, _data->_totSize, 00147 sizeof(*(_data->_bins.intValue)), fp); 00148 fclose(fp); 00149 } 00150 } |
|
Destructor.
00153 { 00154 } |
|
Assignment operator.
00165 { 00166 _data = rhs._data; 00167 return *this; 00168 } |
|
Indicates wether this is a valid histogram.
00172 { 00173 return _data ? 0 : 1; 00174 } |
|
Indicates wether this is a valid histogram.
00178 { 00179 return _data ? 1 : 0; 00180 } |
|
The unique identifier of the histogram.
00184 { 00185 return _data ? _data->_id : 0 ; 00186 } |
|
The data value type. Either INT\_VALUE or REAL\_VALUE.
00190 { 00191 return _data ? _data->_dataType : INT_VALUE; 00192 } |
|
The number of dimensions of the histogram.
00196 { 00197 return _data ? _data->_nDims : 0; 00198 } |
|
The size of the histogram in the i-th dimension. The first dimension has i = 1.
00202 { 00203 if (!_data) 00204 return 0; 00205 switch (dim) { 00206 case 1: return _data->_dimSize1; 00207 case 2: return _data->_dimSize2; 00208 case 3: return _data->_dimSize3; 00209 } 00210 return 0; 00211 } |
|
The total size of the histogram.
00215 { 00216 if (!_data) 00217 return 0; 00218 return _data->_totSize; 00219 } |
|
The lowest bin in the i-th dimension.
00223 { 00224 if (!_data) 00225 return 0; 00226 switch (dim) { 00227 case 1: return _data->_lowBin1; 00228 case 2: return _data->_lowBin2; 00229 case 3: return _data->_lowBin3; 00230 } 00231 return 0; 00232 } |
|
The highest bin in the i-th dimension.
00236 { 00237 if (!_data) 00238 return 0; 00239 switch (dim) { 00240 case 1: return _data->_highBin1; 00241 case 2: return _data->_highBin2; 00242 case 3: return _data->_highBin3; 00243 } 00244 return 0; 00245 } |
|
The bin width in the i-th dimension.
00249 { 00250 if (!_data) 00251 return 0; 00252 switch (dim) { 00253 case 1: return _data->_binWidth1; 00254 case 2: return _data->_binWidth2; 00255 case 3: return _data->_binWidth3; 00256 } 00257 return 0; 00258 } |
|
Translate bin to value.
00262 { 00263 if (!_data) 00264 return 0; 00265 switch (dimension) { 00266 case 1: return bin * _data->_binWidth1 + _data->_lowBin1; 00267 case 2: return bin * _data->_binWidth2 + _data->_lowBin2; 00268 case 3: return bin * _data->_binWidth3 + _data->_lowBin3; 00269 } 00270 return 0; 00271 } |
|
Translate value to bin.
00275 { 00276 if (!_data) 00277 return -1; 00278 switch (dimension) { 00279 case 1: return (int) (((val - _data->_lowBin1) / _data->_binWidth1) + 0.5); 00280 case 2: return (int) (((val - _data->_lowBin2) / _data->_binWidth2) + 0.5); 00281 case 3: return (int) (((val - _data->_lowBin3) / _data->_binWidth3) + 0.5); 00282 } 00283 return -1; 00284 } |
|
Get the number of elements in the given bin.
00428 { 00429 return _data ? _data->getBin(bin1) : 0; 00430 } |
|
Get the number of elements in the given bin.
00434 { 00435 return _data ? _data->getBin(bin2 * _data->_dimSize1 + bin1) : 0; 00436 } |
|
Get the number of elements in the given bin.
00440 { 00441 return _data ? _data->getBin((bin3 * _data->_dimSize2 + bin2) * 00442 _data->_dimSize1 + bin1) : 0; 00443 } |
|
Insert value in 1D histogram.
00288 { 00289 if (_data && (_data->_nDims == 1)) 00290 incBinChecked( 00291 (int) (((val - _data->_lowBin1) / _data->_binWidth1) + 0.5)); 00292 } |
|
Insert value in 1D histogram.
00296 { 00297 if (_data && (_data->_nDims == 1)) 00298 incBinChecked( 00299 (int) (((val - _data->_lowBin1) / _data->_binWidth1) + 0.5)); 00300 } |
|
Insert value in 1D histogram.
00304 { 00305 if (_data && (_data->_nDims == 1)) 00306 incBinChecked( 00307 (int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5)); 00308 } |
|
Insert value in 1D histogram.
00312 { 00313 if (_data && (_data->_nDims == 1)) 00314 incBinChecked( 00315 (int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5)); 00316 } |
|
Insert value in 2D histogram.
00320 { 00321 if (_data && (_data->_nDims == 2)) 00322 incBinChecked( 00323 (int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5), 00324 (int) (((val.y() - _data->_lowBin2) / _data->_binWidth2) + 0.5)); 00325 } |
|
Insert value in 2D histogram.
00329 { 00330 if (_data && (_data->_nDims == 2)) 00331 incBinChecked( 00332 (int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5), 00333 (int) (((val.y() - _data->_lowBin2) / _data->_binWidth2) + 0.5)); 00334 } |
|
Insert value in 3D histogram.
00338 { 00339 if (_data && (_data->_nDims == 3)) 00340 incBinChecked( 00341 (int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5), 00342 (int) (((val.y() - _data->_lowBin2) / _data->_binWidth2) + 0.5), 00343 (int) (((val.z() - _data->_lowBin3) / _data->_binWidth3) + 0.5)); 00344 } |
|
Insert value in 3D histogram.
00348 { 00349 if (_data && (_data->_nDims == 3)) 00350 incBinChecked( 00351 (int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5), 00352 (int) (((val.y() - _data->_lowBin2) / _data->_binWidth2) + 0.5), 00353 (int) (((val.z() - _data->_lowBin3) / _data->_binWidth3) + 0.5)); 00354 } |
|
Increment the given bin. Checks whether this is a 1D histogram and preserves reference count. Values outside the histogram range are ignored.
00358 { 00359 if (_data) { 00360 if ((_data->_nDims == 1) && 00361 (bin >= 0) && (bin < _data->_dimSize1)) { 00362 _data->getUnshared(); 00363 _data->incBin(bin); 00364 } 00365 } 00366 } |
|
Increment the given bin. Checks whether this is a 2D histogram and preserves reference count. Values outside the histogram range are ignored.
00370 { 00371 if (_data) { 00372 if ((_data->_nDims == 2) && 00373 (bin1 >= 0) && (bin1 < _data->_dimSize1) && 00374 (bin2 >= 0) && (bin2 < _data->_dimSize2)) { 00375 _data->getUnshared(); 00376 _data->incBin(bin2 * _data->_dimSize1 + bin1); 00377 } 00378 } 00379 } |
|
Increment the given bin. Checks whether this is a 3D histogram and preserves reference count. Values outside the histogram range are ignored.
00383 { 00384 if (_data) { 00385 if ((_data->_nDims == 3) && 00386 (bin1 >= 0) && (bin1 < _data->_dimSize1) && 00387 (bin2 >= 0) && (bin2 < _data->_dimSize2) && 00388 (bin3 >= 0) && (bin3 < _data->_dimSize3)) { 00389 _data->getUnshared(); 00390 _data->incBin((bin3 * _data->_dimSize2 + bin2) * 00391 _data->_dimSize1 + bin1); 00392 } 00393 } 00394 } |
|
Insert value in 1D histogram.
00522 { 00523 incBin((int) (((val - _data->_lowBin1) / _data->_binWidth1) + 0.5)); 00524 } |
|
Insert value in 1D histogram.
00528 { 00529 incBin((int) (((val - _data->_lowBin1) / _data->_binWidth1) + 0.5)); 00530 } |
|
Kernel Density Estimator.
00399 { 00400 if (!_data || (_data->_dataType != REAL_VALUE)) 00401 return; 00402 00403 double ori = (val - _data->_lowBin1) / _data->_binWidth1; 00404 double s = sigma/_data->_binWidth1; 00405 double t, sat; 00406 00407 int binmin = (int) (ori-3*s+0.5); 00408 int binmax = (int) (ori+3*s+0.5); 00409 int bin; 00410 00411 if (binmin < 0) 00412 binmin = 0; 00413 00414 /* gaussian mass left outside kernel */ 00415 t = (ori-binmin+0.5)/(sqrt(2.0)*s); 00416 00417 sat = erfc(t)*0.5; 00418 00419 _data->_bins.realValue[binmin ? binmin-1 : 0] += sat; 00420 00421 if (binmax >= _data->_dimSize1) 00422 binmax = _data->_dimSize1-1; 00423 00424 /* gaussian mass right outside kernel */ 00425 t = (binmax-ori+0.5)/(sqrt(2.0)*s); 00426 00427 sat = erfc(t)*0.5; 00428 00429 _data->_bins.realValue[binmax < _data->_dimSize1-1 ? binmax+1 : binmax] 00430 += sat; 00431 00432 double a = 1./(sqrt(2*M_PI)*s); 00433 double b = -0.5/(s*s); 00434 00435 for (bin=binmin; bin<=binmax; bin++) { 00436 double v = bin-ori; 00437 _data->_bins.realValue[bin] += a*exp(b*v*v); 00438 } 00439 } |
|
Insert value in 1D histogram.
|
|
Insert value in 1D histogram.
|
|
Insert value in 2D histogram.
|
|
Insert value in 2D histogram.
|
|
Insert value in 3D histogram.
|
|
Insert value in 3D histogram.
|
|
Increment the given bin (assumes 1D histogram). Values outside the histogram range are ignored.
00447 { 00448 if ((bin >= 0) && (bin < _data->_dimSize1)) 00449 _data->incBin(bin); 00450 } |
|
Increment the given bin (assumes 2D histogram). Values outside the histogram range are ignored.
00454 { 00455 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) && 00456 (bin2 >= 0) && (bin2 < _data->_dimSize2)) 00457 _data->incBin(bin2 * _data->_dimSize1 + bin1); 00458 } |
|
Increment the given bin (assumes 3D histogram). Values outside the histogram range are ignored.
00462 { 00463 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) && 00464 (bin2 >= 0) && (bin2 < _data->_dimSize2) && 00465 (bin3 >= 0) && (bin3 < _data->_dimSize3)) 00466 _data->incBin((bin3 * _data->_dimSize2 + bin2) * 00467 _data->_dimSize1 + bin1); 00468 } |
|
Reset the value of the given bin to val (assumes 1D histogram). Values outside the histogram range are ignored.
00472 { 00473 if ((bin1 >= 0) && (bin1 < _data->_dimSize1)) 00474 _data->setBin(bin1, val); 00475 } |
|
Reset the value of the given bin to val (assumes 2D histogram). Values outside the histogram range are ignored.
00479 { 00480 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) && 00481 (bin2 >= 0) && (bin2 < _data->_dimSize2)) 00482 _data->setBin(bin2 * _data->_dimSize1 + bin1, val); 00483 } |
|
Reset the value of the given bin to val (assumes 3D histogram). Values outside the histogram range are ignored.
00487 { 00488 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) && 00489 (bin2 >= 0) && (bin2 < _data->_dimSize2) && 00490 (bin3 >= 0) && (bin3 < _data->_dimSize3)) 00491 _data->setBin((bin3 * _data->_dimSize2 + bin2) * 00492 _data->_dimSize1 + bin1, val); 00493 } |
|
Reset the value of the given bin to val (assumes 1D histogram). Values outside the histogram range are ignored.
00497 { 00498 if ((bin1 >= 0) && (bin1 < _data->_dimSize1)) 00499 _data->setBin(bin1, val); 00500 } |
|
Reset the value of the given bin to val (assumes 2D histogram). Values outside the histogram range are ignored.
00504 { 00505 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) && 00506 (bin2 >= 0) && (bin2 < _data->_dimSize2)) 00507 _data->setBin(bin2 * _data->_dimSize1 + bin1, val); 00508 } |
|
Reset the value of the given bin to val (assumes 3D histogram). Values outside the histogram range are ignored.
00512 { 00513 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) && 00514 (bin2 >= 0) && (bin2 < _data->_dimSize2) && 00515 (bin3 >= 0) && (bin3 < _data->_dimSize3)) 00516 _data->setBin((bin3 * _data->_dimSize2 + bin2) * 00517 _data->_dimSize1 + bin1, val); 00518 } |
|
Smooth histogram data.
00443 { 00444 if (!_data) 00445 return HxHistogram(); 00446 00447 GaussIIR g(sigma); 00448 HxHistogramData *data = new HxHistogramData(REAL_VALUE, *_data); 00449 00450 /* for now only works for 1D histogram */ 00451 /* will be fixed when image processing works on sampled density fields */ 00452 /* instead of HxImageRep only... */ 00453 00454 #ifndef _DEBUG 00455 g.lineFilter(data->_bins.realValue, data->_totSize); 00456 #endif 00457 00458 return HxHistogram(data); 00459 } |
|
Get histogram modes.
00501 { 00502 HxHistogramData *data = (_data->_dataType != REAL_VALUE) ? 00503 new HxHistogramData(REAL_VALUE, *_data) : _data.pointee(); 00504 00505 00506 00507 /* for now only works for 1D histogram */ 00508 /* will be fixed when image processing works on sampled density fields */ 00509 /* instead of HxImageRep only... */ 00510 /* then, see PAMI 22(11), pp. 1318--1323, 2000 */ 00511 00512 data->getUnshared(); 00513 std::list<MicrosoftListSortDoesntWork> l; 00514 00515 /* maxima detection */ 00516 double *ptr = data->_bins.realValue; 00517 double max = *ptr++; 00518 int dir = 1; 00519 for (int i=1; i < data->_totSize; i++) { 00520 double val = *ptr++; 00521 double grad = dir ? val-max : max-val; 00522 if (grad <= 0) { 00523 if (dir == 1) // maximum 00524 l.push_back(MicrosoftListSortDoesntWork(binToValue(i-1,1), max)); 00525 // else minimum 00526 dir = dir ? 0 : 1; 00527 } 00528 max = val; 00529 } 00530 00531 if (data != _data.pointee()) 00532 delete data; 00533 00534 l.sort(); 00535 std::list<HxVec2Double> res; 00536 for (std::list<MicrosoftListSortDoesntWork>::iterator it = l.begin(); 00537 it != l.end(); it++) 00538 res.push_back(HxVec2Double(*it)); 00539 00540 return res; 00541 } |
|
Normalize histogram data.
00545 { 00546 if (!_data) 00547 return HxHistogram(); 00548 HxHistogramData *data = new HxHistogramData(REAL_VALUE, *_data); 00549 00550 int n = data->_totSize; 00551 double norm = sum() / weight; 00552 if (fabs(norm) > 0.0) 00553 { 00554 while (--n >= 0) 00555 data->_bins.realValue[n] /= norm; 00556 data->_sum = weight; 00557 } 00558 00559 return HxHistogram(data); 00560 } |
|
The sum of the histogram.
00564 { 00565 if (!_data) 00566 return 0; 00567 int n = _data->_totSize; 00568 double s = 0; 00569 if (_data->_dataType == REAL_VALUE) 00570 while (--n >= 0) 00571 s += _data->_bins.realValue[n]; 00572 else 00573 while (--n >= 0) 00574 s += _data->_bins.intValue[n]; 00575 _data->_sum = s; 00576 return s; 00577 } |
|
The minimum number of elements in the histogram.
00581 { 00582 if (!_data) 00583 return 0; 00584 int n = _data->_totSize; 00585 double m; 00586 if (_data->_dataType == REAL_VALUE) { 00587 m = _data->_bins.realValue[0]; 00588 while (--n >= 0) 00589 if (_data->_bins.realValue[n] < m) 00590 m = _data->_bins.realValue[n]; 00591 } 00592 else { 00593 m = _data->_bins.intValue[0]; 00594 while (--n >= 0) 00595 if (_data->_bins.intValue[n] < m) 00596 m = _data->_bins.intValue[n]; 00597 } 00598 return m; 00599 } |
|
The minimum number of elements in the histogram. Index is the number of the bin at which the minimum number is first found.
00625 { 00626 if (!_data) 00627 return 0; 00628 int n = _data->_totSize; 00629 double m; 00630 *index = 0; 00631 if (_data->_dataType == REAL_VALUE) { 00632 m = _data->_bins.realValue[0]; 00633 while (--n >= 0) 00634 if (_data->_bins.realValue[n] < m) { 00635 m = _data->_bins.realValue[n]; 00636 *index = n; 00637 } 00638 } 00639 else { 00640 m = _data->_bins.intValue[0]; 00641 while (--n >= 0) 00642 if (_data->_bins.intValue[n] < m) { 00643 m = _data->_bins.intValue[n]; 00644 *index = n; 00645 } 00646 } 00647 return m; 00648 } |
|
The maximum number of elements in the histogram.
00603 { 00604 if (!_data) 00605 return 0; 00606 int n = _data->_totSize; 00607 double m; 00608 if (_data->_dataType == REAL_VALUE) { 00609 m = _data->_bins.realValue[0]; 00610 while (--n >= 0) 00611 if (_data->_bins.realValue[n] > m) 00612 m = _data->_bins.realValue[n]; 00613 } 00614 else { 00615 m = _data->_bins.intValue[0]; 00616 while (--n >= 0) 00617 if (_data->_bins.intValue[n] > m) 00618 m = _data->_bins.intValue[n]; 00619 } 00620 return m; 00621 } |
|
The maximum number of elements in the histogram. Index is the number of the bin at which the maximum number is first found.
00652 { 00653 if (!_data) 00654 return 0; 00655 int n = _data->_totSize; 00656 double m; 00657 *index = 0; 00658 if (_data->_dataType == REAL_VALUE) { 00659 m = _data->_bins.realValue[0]; 00660 while (--n >= 0) 00661 if (_data->_bins.realValue[n] > m) { 00662 m = _data->_bins.realValue[n]; 00663 *index = n; 00664 } 00665 } 00666 else { 00667 m = _data->_bins.intValue[0]; 00668 while (--n >= 0) 00669 if (_data->_bins.intValue[n] > m) { 00670 m = _data->_bins.intValue[n]; 00671 *index = n; 00672 } 00673 } 00674 return m; 00675 } |
|
Intersection of histograms.
00699 { 00700 if (!_data) 00701 return 0; 00702 if (!isEqualSize(rhs)) 00703 return -1; 00704 int n = _data->_totSize; 00705 double s = 0; 00706 if (_data->_dataType == REAL_VALUE) 00707 if (rhs._data->_dataType == REAL_VALUE) 00708 s = ::intersect(_data->_bins.realValue, rhs._data->_bins.realValue, n); 00709 else 00710 s = ::intersect(_data->_bins.realValue, rhs._data->_bins.intValue, n); 00711 else 00712 if (rhs._data->_dataType == REAL_VALUE) 00713 s = ::intersect(_data->_bins.intValue, rhs._data->_bins.realValue, n); 00714 else 00715 s = ::intersect(_data->_bins.intValue, rhs._data->_bins.intValue, n); 00716 00717 return s; 00718 } |
|
Chi square intersection of histograms.
00736 { 00737 if (!_data) 00738 return 0; 00739 if (!isEqualSize(rhs)) 00740 return -1; 00741 int n = _data->_totSize; 00742 double s = 0; 00743 if (_data->_dataType == REAL_VALUE) 00744 if (rhs._data->_dataType == REAL_VALUE) 00745 s = ::chiSq(_data->_bins.realValue, rhs._data->_bins.realValue, n); 00746 else 00747 s = ::chiSq(_data->_bins.realValue, rhs._data->_bins.intValue, n); 00748 else 00749 if (rhs._data->_dataType == REAL_VALUE) 00750 s = ::chiSq(_data->_bins.intValue, rhs._data->_bins.realValue, n); 00751 else 00752 s = ::chiSq(_data->_bins.intValue, rhs._data->_bins.intValue, n); 00753 return s; 00754 } |
|
Normalized chi square intersection of histograms.
00773 { 00774 if (!_data) 00775 return 0; 00776 if (!isEqualSize(rhs)) 00777 return -1; 00778 int n = _data->_totSize; 00779 double s = 0; 00780 if (_data->_dataType == REAL_VALUE) 00781 if (rhs._data->_dataType == REAL_VALUE) 00782 s = ::chiSqNorm(_data->_bins.realValue, rhs._data->_bins.realValue, n); 00783 else 00784 s = ::chiSqNorm(_data->_bins.realValue, rhs._data->_bins.intValue, n); 00785 else 00786 if (rhs._data->_dataType == REAL_VALUE) 00787 s = ::chiSqNorm(_data->_bins.intValue, rhs._data->_bins.realValue, n); 00788 else 00789 s = ::chiSqNorm(_data->_bins.intValue, rhs._data->_bins.intValue, n); 00790 return s; 00791 } |
|
convert dataType.
00158 { 00159 HxHistogramData *data = new HxHistogramData(*_data); 00160 return HxHistogram(data); 00161 } |
|
Fill the externally allocated buffer with data from this histogram.
00795 { 00796 if (!_data) 00797 return; 00798 int n = _data->_totSize; 00799 if (_data->_dataType == REAL_VALUE) 00800 while (--n >= 0) 00801 data[n] = _data->_bins.realValue[n]; 00802 else 00803 while (--n >= 0) 00804 data[n] = _data->_bins.intValue[n]; 00805 } |
|
Fill the externally allocated buffer with data from this histogram.
00809 { 00810 if (!_data) 00811 return; 00812 int n = _data->_totSize; 00813 if (_data->_dataType == REAL_VALUE) 00814 while (--n >= 0) 00815 data[n] = (int)(_data->_bins.realValue[n] + 0.5); 00816 else 00817 while (--n >= 0) 00818 data[n] = _data->_bins.intValue[n]; 00819 } |
|
Assume the histogram is a 3d rgb cube and render it for display in Java in the externally allocated data buffer.
00896 { 00897 if (!_data) 00898 return; 00899 /* 00900 el = (elevation * M_PI) / 180.; 00901 al = (alpha * M_PI) / 180.; 00902 cosa = cos(al); 00903 sina = sin(al); 00904 cose = cos(el); 00905 sine = sin(el); 00906 dataW = dataWidth; 00907 xMin = 190; //for 3D histo 00908 yMax = 190; //255; 00909 */ 00910 double el = (elevation * M_PI) / 180.; 00911 double al = (alpha * M_PI) / 180.; 00912 double cosa = cos(al); 00913 double sina = sin(al); 00914 double cose = cos(el); 00915 double sine = sin(el); 00916 int dataW = dataWidth; 00917 int xMin = 190; //for 3D histo 00918 int yMax = 190; //255; 00919 drawAxis(data,cosa,sina,cose,sine,dataW); 00920 00921 int n = 0; 00922 00923 if (_data->_dataType == REAL_VALUE) { 00924 for (int b=0 ; b < _data->_dimSize3 ; b++) { 00925 for (int g=0 ; g < _data->_dimSize2 ; g++) { 00926 for (int r=0 ; r < _data->_dimSize1 ; r++) { 00927 if (_data->_bins.realValue[n] > threshold) { 00928 /* 00929 Doen't work if hist range unequals 0..255 00930 double rV = r * _data->_binWidth1 + _data->_lowBin1; 00931 double gV = g * _data->_binWidth2 + _data->_lowBin2; 00932 double bV = b * _data->_binWidth3 + _data->_lowBin3; 00933 */ 00934 double rV = r * 255./(_data->_dimSize1-1); 00935 double gV = g * 255./(_data->_dimSize2-1); 00936 double bV = b * 255./(_data->_dimSize3-1); 00937 setPixelV(data, transf3Dto2D(rV,gV,bV,cosa,sina,cose,sine), HxVec3Int(rV,gV,bV), dataW); 00938 } 00939 n++; 00940 } 00941 } 00942 } 00943 } 00944 else { 00945 for (int b=0 ; b < _data->_dimSize3 ; b++) { 00946 for (int g=0 ; g < _data->_dimSize2 ; g++) { 00947 for (int r=0 ; r < _data->_dimSize1 ; r++) { 00948 if (_data->_bins.intValue[n] > threshold) { 00949 /* 00950 Doen't work if hist range unequals 0..255 00951 double rV = r * _data->_binWidth1 + _data->_lowBin1; 00952 double gV = g * _data->_binWidth2 + _data->_lowBin2; 00953 double bV = b * _data->_binWidth3 + _data->_lowBin3; 00954 */ 00955 double rV = r * 255./(_data->_dimSize1-1); 00956 double gV = g * 255./(_data->_dimSize2-1); 00957 double bV = b * 255./(_data->_dimSize3-1); 00958 setPixelV(data, transf3Dto2D(rV,gV,bV,cosa,sina,cose,sine), HxVec3Int(rV,gV,bV), dataW); 00959 } 00960 n++; 00961 } 00962 } 00963 } 00964 } 00965 } |
|
Print histogram data in the given stream.
00969 { 00970 if (!_data) 00971 return os << "HxHistogram(null)" << STD_ENDL; 00972 if (_data->_dataType == REAL_VALUE) 00973 for (int dim3=0; dim3<dimensionSize(3) ; dim3++) 00974 for (int dim2=0 ; dim2<dimensionSize(2) ; dim2++) 00975 for (int dim1=0 ; dim1<dimensionSize(1) ; dim1++) 00976 os << _data->_bins.realValue[(dim3 * _data->_dimSize2 00977 + dim2) * _data->_dimSize1 + dim1] << delimit; 00978 else 00979 for (int dim3=0; dim3<dimensionSize(3) ; dim3++) 00980 for (int dim2=0 ; dim2<dimensionSize(2) ; dim2++) 00981 for (int dim1=0 ; dim1<dimensionSize(1) ; dim1++) 00982 os << _data->_bins.intValue[(dim3 * _data->_dimSize2 00983 + dim2) * _data->_dimSize1 + dim1] << delimit; 00984 return os; 00985 } |
|
Write histogram to disk.
01004 { 01005 HxString name; 01006 FILE *fp; 01007 IOHEADER header; 01008 01009 if (!_data) 01010 return 0; 01011 01012 name = filename + ".hst"; 01013 01014 fp = fopen(name.c_str(), "wb"); 01015 if (!fp) 01016 return 0; 01017 01018 header.dataType = _data->_dataType; 01019 header.dimensions = _data->_nDims; 01020 header.lowBin1 = _data->_lowBin1; 01021 header.highBin1 = _data->_highBin1; 01022 header.nBins1 = _data->_dimSize1; 01023 header.lowBin2 = _data->_lowBin2; 01024 header.highBin2 = _data->_highBin2; 01025 header.nBins2 = _data->_dimSize2; 01026 header.lowBin3 = _data->_lowBin3; 01027 header.highBin3 = _data->_highBin3; 01028 header.nBins3 = _data->_dimSize3; 01029 fwrite(&header, sizeof(header), 1, fp); 01030 01031 if (_data->_dataType == REAL_VALUE) 01032 fwrite(_data->_bins.realValue, _data->_totSize, 01033 sizeof(*(_data->_bins.realValue)), fp); 01034 else 01035 fwrite(_data->_bins.intValue, _data->_totSize, 01036 sizeof(*(_data->_bins.intValue)), fp); 01037 01038 fclose(fp); 01039 01040 return 1; 01041 } |
|
Returns new histogram in which bins with count<=valThreshold are set to 0.0, bins with count>valThreshold keep original value.
01045 { 01046 if (!_data) 01047 return HxHistogram(); 01048 HxHistogramData *data = new HxHistogramData(*_data); 01049 01050 int n = data->_totSize; 01051 01052 if (data->_dataType == REAL_VALUE) 01053 while (--n >= 0) { 01054 if (data->_bins.realValue[n]<=valThreshold) 01055 data->_bins.realValue[n]=0.0; 01056 } 01057 else 01058 while (--n >= 0) { 01059 if (data->_bins.intValue[n]<=valThreshold) 01060 data->_bins.intValue[n]=0.0; 01061 } 01062 01063 return HxHistogram(data); 01064 } |
|
Returns number of bins with count>valThreshold. Counts number of non-empty bins by default.
01068 { 01069 if (!_data) 01070 return 0; 01071 01072 int n = _data->_totSize; 01073 01074 int counter=0; 01075 01076 if (_data->_dataType == REAL_VALUE) 01077 while (--n >= 0) { 01078 if (_data->_bins.realValue[n]>valThreshold) 01079 counter++; 01080 } 01081 else 01082 while (--n >= 0) { 01083 if (_data->_bins.intValue[n]>valThreshold) 01084 counter++; 01085 } 01086 01087 return counter; 01088 } |
|
Returns new histogram containing given range of bins only. (Including given min and max.) Default value -1 maps to dimensionSize()-1.
01094 { 01095 if (!_data) 01096 return HxHistogram(); 01097 01098 // Default value binMax=-1 maps to dimensionSize()-1. 01099 if (binMax1<0) 01100 binMax1=dimensionSize(1)-1; 01101 if (binMax2<0) 01102 binMax2=dimensionSize(2)-1; 01103 if (binMax3<0) 01104 binMax3=dimensionSize(3)-1; 01105 01106 if (binMin1<0 || binMin2<0 || binMin3<0) 01107 { 01108 STD_CERR << "Error in HxHistogram::reduceRange, minimum smaller than 0." << STD_ENDL; 01109 return HxHistogram(); 01110 } 01111 01112 if (binMax1<binMin1 || binMax2<binMin2 || binMax3<binMin3) 01113 { 01114 STD_CERR << "Error in HxHistogram::reduceRange, minimum higher than maximum." << STD_ENDL; 01115 return HxHistogram(); 01116 } 01117 01118 // Make new histogram for given range 01119 HxHistogram h=HxHistogram(dataType(),dimensionality(), 01120 binToValue(binMin1,1),binToValue(binMax1,1),binMax1-binMin1+1, 01121 binToValue(binMin2,2),binToValue(binMax2,2),binMax2-binMin2+1, 01122 binToValue(binMin3,3),binToValue(binMax3,3),binMax3-binMin3+1); 01123 01124 if (_data->_dataType == REAL_VALUE) { 01125 for (int z=binMin3; z<=binMax3; z++) 01126 for (int y=binMin2; y<=binMax2; y++) 01127 for (int x=binMin1; x<=binMax1; x++) { 01128 int n = ((z-binMin3) * _data->_dimSize2 + (y-binMin2)) * 01129 _data->_dimSize1 + x-binMin1; 01130 int m = (z * _data->_dimSize2 + y) * 01131 _data->_dimSize1 + x; 01132 h._data->_bins.realValue[n] = _data->_bins.realValue[m]; 01133 } 01134 } 01135 else { 01136 for (int z=binMin3; z<=binMax3; z++) 01137 for (int y=binMin2; y<=binMax2; y++) 01138 for (int x=binMin1; x<=binMax1; x++) { 01139 int n = ((z-binMin3) * _data->_dimSize2 + (y-binMin2)) * 01140 _data->_dimSize1 + x-binMin1; 01141 int m = (z * _data->_dimSize2 + y) * 01142 _data->_dimSize1 + x; 01143 h._data->_bins.intValue[n] = _data->_bins.intValue[m]; 01144 } 01145 } 01146 01147 return h; 01148 } |
|
Returns new histogram containing given range of values (mapped to bin numbers) only. (Including bins for given min and max.) If min==max, the whole range for that dimension is returned.
01153 { 01154 if (binValMin1==binValMax1) { 01155 binValMin1=_data->_lowBin1; 01156 binValMax1=_data->_highBin1; 01157 } 01158 if (binValMin1<_data->_lowBin1) 01159 binValMin1=_data->_lowBin1; 01160 if (binValMax1>_data->_highBin1) 01161 binValMax1=_data->_highBin1; 01162 if (binValMin2==binValMax2) { 01163 binValMin2=_data->_lowBin2; 01164 binValMax2=_data->_highBin2; 01165 } 01166 if (binValMin2<_data->_lowBin2) 01167 binValMin2=_data->_lowBin2; 01168 if (binValMax2>_data->_highBin2) 01169 binValMax2=_data->_highBin2; 01170 if (binValMin3==binValMax3) { 01171 binValMin3=_data->_lowBin3; 01172 binValMax3=_data->_highBin3; 01173 } 01174 if (binValMin3<_data->_lowBin3) 01175 binValMin3=_data->_lowBin3; 01176 if (binValMax3>_data->_highBin3) 01177 binValMax3=_data->_highBin3; 01178 return reduceRange(valueToBin(binValMin1,1),valueToBin(binValMax1,1), 01179 valueToBin(binValMin2,2),valueToBin(binValMax2,2), 01180 valueToBin(binValMin3,3),valueToBin(binValMax3,3)); 01181 } |
|
Projects n-dimensional (1<n<=3) histogram on a 1-D histogram for given dimension.
01186 { 01187 if (dimensionality()<2) 01188 { 01189 // STD_CERR << "Warning. HxHistogram::to1D, dimensionality is " << dimensionality() << STD_ENDL; 01190 return *this; 01191 } 01192 01193 if (dim<1 || dim>3) 01194 { 01195 STD_CERR << "Error. Dimension out of bounds: " << dim << STD_ENDL; 01196 return HxHistogram(); 01197 } 01198 01199 01200 HxHistogram result; 01201 result=HxHistogram(dataType(), 1, 01202 lowBin(dim),highBin(dim),dimensionSize(dim), 01203 0,0,0, 01204 0,0,0); 01205 01206 int otherDim1=-1; 01207 int otherDim2=-1; 01208 01209 if (dim==1) 01210 { 01211 otherDim1=3; 01212 otherDim2=2; 01213 } 01214 if (dim==2) 01215 { 01216 otherDim1=3; 01217 otherDim2=1; 01218 } 01219 if (dim==3) 01220 { 01221 otherDim1=2; 01222 otherDim2=1; 01223 } 01224 01225 for (int b=0; b<dimensionSize(dim); b++) 01226 { 01227 double total=0; 01228 for (int sb=0; sb<dimensionSize(otherDim1); sb++) 01229 for (int tb=0; tb<dimensionSize(otherDim2); tb++) 01230 { 01231 if (dim==1) 01232 total+=get(b,tb,sb); 01233 if (dim==2) 01234 total+=get(tb,b,sb); 01235 if (dim==3) 01236 total+=get(tb,sb,b); 01237 } 01238 result.setBin(b, total); 01239 } 01240 01241 return result; 01242 } |