Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "MaxQuantileOnAxis.h"
00036
00037 #include <algorithm>
00038 #include <vector>
00039
00040
00041
00042 template<typename T>
00043 MaxQuantileOnAxisDataPointsFilter<T>::MaxQuantileOnAxisDataPointsFilter(
00044 const Parameters& params):
00045 PointMatcher<T>::DataPointsFilter("MaxQuantileOnAxisDataPointsFilter",
00046 MaxQuantileOnAxisDataPointsFilter::availableParameters(), params),
00047 dim(Parametrizable::get<unsigned>("dim")),
00048 ratio(Parametrizable::get<T>("ratio"))
00049 {
00050 }
00051
00052
00053 template<typename T>
00054 typename PointMatcher<T>::DataPoints
00055 MaxQuantileOnAxisDataPointsFilter<T>::filter(
00056 const DataPoints& input)
00057 {
00058 DataPoints output(input);
00059 inPlaceFilter(output);
00060 return output;
00061 }
00062
00063
00064 template<typename T>
00065 void MaxQuantileOnAxisDataPointsFilter<T>::inPlaceFilter(DataPoints& cloud)
00066 {
00067 if (int(dim) >= cloud.features.rows())
00068 throw InvalidParameter((boost::format("MaxQuantileOnAxisDataPointsFilter: Error, filtering on dimension number %1%, larger than feature dimensionality %2%") % dim % cloud.features.rows()).str());
00069
00070 const int nbPointsIn = cloud.features.cols();
00071 const int nbPointsOut = nbPointsIn * ratio;
00072
00073
00074 std::vector<T> values;
00075 values.reserve(nbPointsIn);
00076 for (int x = 0; x < nbPointsIn; ++x)
00077 values.push_back(cloud.features(dim, x));
00078
00079
00080 std::nth_element(values.begin(), values.begin() + (values.size() * ratio), values.end());
00081 const T limit = values[nbPointsOut];
00082
00083
00084 int j = 0;
00085 for (int i = 0; i < nbPointsIn; ++i)
00086 {
00087 if (cloud.features(dim, i) < limit)
00088 {
00089 assert(j <= i);
00090 cloud.setColFrom(j, cloud, i);
00091 ++j;
00092 }
00093 }
00094 assert(j <= nbPointsOut);
00095
00096 cloud.conservativeResize(j);
00097
00098 }
00099
00100 template struct MaxQuantileOnAxisDataPointsFilter<float>;
00101 template struct MaxQuantileOnAxisDataPointsFilter<double>;
00102
00103