Beispiel #1
0
void		*put_memory(void *ptr, size_t size)
{
  void		*tmp;

  tmp = get_place(size);
  if (tmp != NULL)
    {
      ptr = tmp;
      modif_list(ptr, size);
    }
  else
    {
      ptr = sbrk(size);
      my_put_bot_list(ptr, size);
      end = sbrk(0);
    }
  return (ptr);
}
void StarFinder::rejectOutliers(
    std::vector<PotentialStar*>& list, 
    double nsigma, double min_sigma, const Function2D& f)
{
    // This rejects outliers by finding the median and the quartile 
    // values, and calls sigma the average of the two quartile deviations.
    // "nsigma" is then how many of these "sigma" away from the median
    //  to consider something an outlier.

    const int nstars = list.size();
    if (nstars <= 4) return;
    // Find median, 1st and 3rd quartile stars;
    std::vector<PotentialStar*> modif_list(nstars);
    for(int k=0;k<nstars;++k) {
        modif_list[k] = new PotentialStar(*list[k]);
        double newSize = list[k]->getSize() - f(list[k]->getPos());
        modif_list[k]->setSize(newSize);
    }
    std::sort(modif_list.begin(),modif_list.end(),
              std::mem_fun(&PotentialStar::isSmallerThan));
    PotentialStar* mStar = modif_list[modif_list.size()/2];
    PotentialStar* q1Star = modif_list[modif_list.size()/4];
    PotentialStar* q3Star = modif_list[modif_list.size()*3/4];
    double median = mStar->getSize();
    double q1 = q1Star->getSize();
    double q3 = q3Star->getSize();
    double sigma = std::max(q3-median,median-q1);
    sigma = std::max(sigma,min_sigma);
    xdbg<<"q1,m,q3 = "<<q1<<" , "<<median<<" , "<<q3<<std::endl;
    xdbg<<"sigma = "<<sigma<<", nsig * sigma = "<<nsigma*sigma<<std::endl;
    // Remove elements which std::abs(x->getSize()-median) > nsigma*sigma
    int j=0;
    for(int k=0; k<nstars;++k) {
        if (std::abs(modif_list[k]->getSize()-median)>nsigma*sigma) {
            xdbg<<"k = "<<k<<", size = "<<modif_list[k]->getSize();
            xdbg<<" might be an outlier (median = "<<median<<")\n";
        }
        list[j] = list[k];  // Note: update original list, not modified version.
        ++j;
    }
    if (j<nstars) list.erase(list.begin()+j,list.end());
    for(int k=0;k<nstars;++k) delete modif_list[k];
}