📄 statistical_filter.cc
字号:
//Copyright (c) 2004, Charles Killian, Adolfo Rodriguez, Dejan Kostic, Sooraj Bhat, and Amin Vahdat//All rights reserved.////Redistribution and use in source and binary forms, with or without//modification, are permitted provided that the following conditions are met://// * Redistributions of source code must retain the above copyright// notice, this list of conditions and the following disclaimer.// * Redistributions in binary form must reproduce the above copyright// notice, this list of conditions and the following disclaimer in// the documentation and/or other materials provided with the// distribution.// * Neither the names of Duke University nor The University of// California, San Diego, nor the names of its contributors// may be used to endorse or promote products derived from// this software without specific prior written permission.////THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"//AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE//IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE//DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE//FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL//DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR//SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,//OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE//USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.#include "statistical_filter.h"#include "stdio.h"#include <math.h>statistical_filter::statistical_filter(int history) :measurements( 0), total( 0), total_square( 0),standard_deviation (0),keep_history(history){}statistical_filter::~statistical_filter(){}// ---------------------------------------------- // update// ---------------------------------------------- void statistical_filter::update (double incoming){ total+= incoming; total_square+= incoming*incoming; measurements ++; standard_deviation =sqrt( (total_square* measurements- (total*total))/ ( measurements*( measurements - 1)) ); value =total/( double)measurements;// printf("statistical_value: %lf, incoming %lf\n", // value, incoming); if (keep_history) { contents.insert( incoming); }}// ---------------------------------------------- // get_deviation// ---------------------------------------------- double statistical_filter::get_deviation (){ return standard_deviation;}// ---------------------------------------------- // get_percentile// ---------------------------------------------- double statistical_filter::get_percentile (double rank){ if (rank < 0 || rank > 1.0) { fprintf(stderr, "get_percentile invalid rank: %d\n", rank); return -1; } if (!keep_history) { fprintf(stderr, "get_percentile not maintaining history: %d\n", keep_history); return -1; } if (contents.size() == 0) { // fprintf(stderr, " get_percentilecontents.size(): %d\n", contents.size()); return -1; } int which = (int)((double)(contents.size()-1)*rank); //The -1 is because it is 0 indexed //printf("which: %d out of %d %f \n", which, contents.size(), rank); set<double, less<double> >::const_iterator element; int counter = 0; for(element=contents.begin();element!=contents.end();element++) { //printf("looking at %f (%d) -- ", *element, counter); if (counter == which) { return *element; } counter++; } //somehow we got here, return the largest value return *((contents.end())--);}// ---------------------------------------------- // get_count// ---------------------------------------------- int statistical_filter::get_count (){ return measurements;}// ---------------------------------------------- // reset// ---------------------------------------------- int statistical_filter::reset (){ measurements = 0; value = 0; total = 0; total_square = 0; standard_deviation= 0; contents.clear();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -