Changeset 1786


Ignore:
Timestamp:
Feb 9, 2009, 9:35:25 PM (11 years ago)
Author:
Peter
Message:

fixes #421

Location:
trunk/yat/utility
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/yat/utility/Matrix.cc

    r1783 r1786  
    2424
    2525#include "Matrix.h"
     26#include "stl_utility.h"
    2627#include "Vector.h"
    2728#include "VectorBase.h"
     
    547548  bool nan(const Matrix& templat, Matrix& flag)
    548549  {
    549     size_t rows=templat.rows();
    550     size_t columns=templat.columns();
    551     if (rows!=flag.rows() && columns!=flag.columns())
    552       flag.resize(rows,columns,1.0);
    553     else
    554       flag.all(1.0);
    555     bool nan=false;
    556     for (size_t i=0; i<rows; i++)
    557       for (size_t j=0; j<columns; j++)
    558         if (std::isnan(templat(i,j))) {
    559           flag(i,j)=0;
    560           nan=true;
    561         }
    562     return nan;
     550    if (templat.rows()!=flag.rows() || templat.columns()!=flag.columns())
     551      flag.resize(templat.rows(),templat.columns(),1.0);
     552    return BinaryWeight()(templat.begin(), templat.end(), flag.begin());
    563553  }
    564554
  • trunk/yat/utility/stl_utility.h

    r1746 r1786  
    7878    { return std::abs(x); }
    7979  };
     80
     81
     82  /**
     83     For each element in resulting range assign it to 0.0 if
     84     corresponding element in input range is NaN else assign it to
     85     1.0.
     86
     87     \since New in yat 0.5
     88   */
     89  struct BinaryWeight
     90  {
     91    /**
     92        \return true if there is at least one NaN in input range
     93        [first, last).
     94     */
     95    template<typename InputIterator, typename OutputIterator>
     96    bool inline operator()(InputIterator first, InputIterator last,
     97                           OutputIterator result) const
     98    {
     99      bool nan=false;
     100      while (first!=last) {
     101        if (std::isnan(*first)) {
     102          *result=0;
     103          nan=true;
     104        }
     105        else
     106          *result = 1.0;
     107        ++first;
     108        ++result;
     109      }
     110      return nan;
     111    }
     112  };
     113
    80114
    81115  /**
Note: See TracChangeset for help on using the changeset viewer.