コード例 #1
0
        internal void Update(VisualOdometer visualOdometer)
        {
            if (!this.Created)
            {
                return;
            }

            List <double> headingChanges = visualOdometer.RotationAnalyzer.MeasuredRotationIncrements;

            if (headingChanges.Count == 0)
            {
                return;
            }

            double[] degreeAngles = new double[headingChanges.Count];
            for (int i = 0; i < headingChanges.Count; i++)
            {
                degreeAngles[i] = headingChanges[i] * s_RadToDegree;
            }

            m_Histogram.Fill(degreeAngles);
            m_HistogramSeries.Points.Clear();

            for (int i = 0; i < m_Histogram.BinsCount; i++)
            {
                HistogramBin bin = m_Histogram[i];
                // Add data point into the histogram series
                double x = (bin.Min + bin.Max) / 2.0;
                m_HistogramSeries.Points.AddXY(x, bin.Count);
            }

            m_CurrentHeadingChangeSeries.Points.Clear();
            m_CurrentHeadingChangeSeries.Points.AddXY(visualOdometer.RotationAnalyzer.HeadingChange.Degrees, 0);
            m_CurrentHeadingChangeAnnotation.AnchorDataPoint = m_CurrentHeadingChangeSeries.Points[0];
        }
コード例 #2
0
        public static HistogramBin[] Histogram(this IList <MetaNum> self, int binCount = -1, double binWidth = double.NaN)
        {
            var min = (double)self.Min();
            var max = (double)self.Max();
            HistogramInterval intervals;

            if (!double.IsNaN(binWidth))
            {
                intervals = HistogramHelper.GetHistogramIntervalFromBinWidth(min, max, binWidth);
            }
            else
            {
                if (binCount < 0)
                {
                    binCount = HistogramHelper.GetBinCount(min, max, self.Count);
                }

                intervals = HistogramHelper.GetHistogramIntervalFromBinCount(min, max, binCount);
            }

            var collect = CollectHistogram(self, intervals);
            var counts  = collect.Item1;
            var total   = collect.Item2;

            return(HistogramBin.CreateHistogram(intervals, counts, total));
        }
コード例 #3
0
        public static PlotModel CreateNormalDistributionHistogram(int n, int binCount)
        {
            var    bins = new HistogramBin[binCount];
            double min  = -10;
            double max  = 10;

            for (int i = 0; i < bins.Length; i++)
            {
                var v = min + (max - min) * i / (bins.Length - 1);
                bins[i] = new HistogramBin {
                    Label = v.ToString("0.0")
                };
            }

            var r = new Random(31);

            for (int i = 0; i < n; i++)
            {
                // http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform
                var u1 = r.NextDouble();
                var u2 = r.NextDouble();
                var v  = Math.Sqrt(-2 * Math.Log(u1)) * Math.Cos(2 * Math.PI * u2);

                int bin = (int)Math.Round((v - min) / (max - min) * (bins.Length - 1));
                if (bin >= 0 && bin < bins.Length)
                {
                    bins[bin].Value++;
                }
            }

            var temp = new PlotModel {
                Title = string.Format("Histogram (bins={0}, n={1})", binCount, n), Subtitle = "Standard normal distribution by Box-Muller transform"
            };
            var series1 = new TSeries {
                ItemsSource = bins, ValueField = "Value"
            };

            temp.Series.Add(series1);

            var categoryAxis = new CategoryAxis
            {
                Position = CategoryAxisPosition(),
                GapWidth = 0
            };

            categoryAxis.Labels.AddRange(bins.Select(b => b.Label));
            categoryAxis.IsAxisVisible = false;
            temp.Axes.Add(categoryAxis);

            // todo: link category and linear axis
            temp.Axes.Add(new LinearAxis {
                Position = CategoryAxisPosition(), Minimum = min, Maximum = max
            });

            temp.Axes.Add(new LinearAxis {
                Position = ValueAxisPosition(), MinimumPadding = 0, AbsoluteMinimum = 0
            });

            return(temp);
        }
コード例 #4
0
ファイル: Form1.cs プロジェクト: nithi89/code-browse
        private void InitializeHistogramChart()
        {
            m_HistogramSeries = m_Chart.Series.Add("Histogram");

            // Set new series chart type and other attributes
            m_HistogramSeries.ChartType        = SeriesChartType.Column;
            m_HistogramSeries.BorderColor      = Color.Black;
            m_HistogramSeries.BorderWidth      = 1;
            m_HistogramSeries.BorderDashStyle  = ChartDashStyle.Solid;
            m_HistogramSeries["PointWidth"]    = "1.0";
            m_HistogramSeries["BarLabelStyle"] = "Center";

            // Adjust chart area
            ChartArea chartArea = m_Chart.ChartAreas[m_HistogramSeries.ChartArea];

            //chartArea.AxisY.Title = "Frequency";
            chartArea.AxisX.Minimum = 3;
            chartArea.AxisX.Maximum = 18;

            //Series series1 = new Series();
            //m_Chart.Series.Add(series1);
            //for (int index = 3; index < 19; index++)
            //{
            //    m_HistogramSeries.Points.AddXY(index, 2 * index);
            //}
            for (int i = 0; i < m_Data.Histogram.BinsCount; i++)
            {
                HistogramBin bin = m_Data.Histogram[i];
                // Add data point into the histogram series
                double x = (bin.Min + bin.Max) / 2.0;
                m_HistogramSeries.Points.AddXY(x, bin.Count);
            }
        }
コード例 #5
0
        public static PlotModel CreateHistogram(int n, int binCount)
        {
            var bins = new HistogramBin[binCount];

            for (int i = 0; i < bins.Length; i++)
            {
                bins[i] = new HistogramBin {
                    Label = i.ToString()
                };
            }

            var r = new Random(31);

            for (int i = 0; i < n; i++)
            {
                int value = r.Next(binCount);
                bins[value].Value++;
            }

            var temp = new PlotModel {
                Title = string.Format("Histogram (bins={0}, n={1})", binCount, n), Subtitle = "Pseudorandom numbers"
            };
            var series1 = new TSeries {
                ItemsSource = bins, ValueField = "Value"
            };

            if (binCount < 100)
            {
                series1.LabelFormatString = "{0}";
            }

            temp.Series.Add(series1);

            temp.Axes.Add(new CategoryAxis {
                Position = CategoryAxisPosition(), ItemsSource = bins, LabelField = "Label", GapWidth = 0
            });
            temp.Axes.Add(new LinearAxis {
                Position = ValueAxisPosition(), MinimumPadding = 0, MaximumPadding = 0.1, AbsoluteMinimum = 0
            });

            return(temp);
        }
コード例 #6
0
        public static List <HistogramBin> BinData(List <double> theData, double minBin, double maxBin, int noBins, bool discardValuesBeyondMinMax)
        {
            if (discardValuesBeyondMinMax)
            {
                int itemsRemoved = theData.RemoveAll(a => a <minBin || a> maxBin);
                //Console.WriteLine(itemsRemoved + " items removed when generating histogram; out of bounds");
            }

            List <HistogramBin> histogramBins = new List <HistogramBin>(noBins);

            theData.Sort();

            double interval      = (maxBin - minBin) / noBins;
            double intervalFloor = minBin;


            //Create all bins
            for (double i = 0; i <= noBins; i++)
            {
                histogramBins.Add(new HistogramBin(minBin + i * interval));
            }

            //Fill the bins
            foreach (double d in theData)
            {
                HistogramBin b = histogramBins.Find(a => a.IntervalFloor > d && d < a.IntervalFloor + interval);

                try
                {
                    b.TheData.Add(d);
                }
                catch
                {
                    Console.WriteLine("Null Bin");
                }
            }

            Normalize(histogramBins);


            return(histogramBins);
        }
コード例 #7
0
        public static List <HistogramBin> BinData(List <double> theData, int noBins)
        {
            if (theData.Count == 0)
            {
                throw new Exception("No datapoint provided for binning");
            }

            List <HistogramBin> histogramBins = new List <HistogramBin>(noBins);

            double min   = theData.Min();
            double max   = theData.Max();
            double delta = max - min;
            double step  = delta / noBins;

            theData.Sort();

            double intervalFloor = double.MinValue;

            HistogramBin hb = new HistogramBin(0);

            //Fill the bins
            intervalFloor = min;
            foreach (double datapoint in theData)
            {
                if (datapoint > (intervalFloor + step))
                {
                    hb = new HistogramBin(datapoint);
                    hb.TheData.Add(datapoint);
                    histogramBins.Add(hb);
                    intervalFloor += step;
                }
                else
                {
                    hb.TheData.Add(datapoint);
                }
            }

            Normalize(histogramBins);

            return(histogramBins);
        }
コード例 #8
0
        public static List <HistogramBin> BinData(List <int> theData)
        {
            if (theData.Count == 0)
            {
                throw new Exception("No datapoint provided for binning");
            }

            List <HistogramBin> histogramBins = new List <HistogramBin>();

            var groups = from integer in theData
                         group integer by integer into theBin
                         select new { theBin.Key, theBin };

            foreach (var group in groups)
            {
                HistogramBin h = new HistogramBin((double)group.Key);
                h.TheData = group.theBin.Select(a => (double)a).ToList();
                histogramBins.Add(h);
            }

            return(histogramBins);
        }
コード例 #9
0
ファイル: BufUtils.cs プロジェクト: glasgowdev/i2p-cs
        public static HistogramBin[] Histogram <T>(this IEnumerable <T> list, Func <T, float> select, int bins)
        {
            var result = new HistogramBin[bins];
            var min    = list.Min(v => select(v));
            var max    = list.Max(v => select(v));

            if (min == max)
            {
                return(result);
            }

            for (int i = 0; i < bins; ++i)
            {
                result[i].Start = i * ((max - min) / bins) + min;
            }

            foreach (var one in list)
            {
                var ix = Math.Min(result.Length - 1, (int)((bins * (select(one) - min)) / (max - min)));
                ++result[ix].Count;
            }
            return(result);
        }
        public static PlotModel Histogram()
        {
            int n        = 1000;
            int binCount = 20;
            var bins     = new HistogramBin[binCount];

            for (int i = 0; i < bins.Length; i++)
            {
                bins[i] = new HistogramBin {
                    Label = i.ToString()
                };
            }

            var r = new Random();

            for (int i = 0; i < n; i++)
            {
                int value = r.Next(binCount);
                bins[value].Value++;
            }

            var temp    = new PlotModel();
            var series1 = new TSeries {
                ItemsSource = bins, ValueField = "Value"
            };

            temp.Series.Add(series1);

            temp.Axes.Add(new CategoryAxis {
                Position = CategoryAxisPosition(), ItemsSource = bins, LabelField = "Label", GapWidth = 0
            });
            temp.Axes.Add(new LinearAxis {
                Position = ValueAxisPosition(), MinimumPadding = 0, AbsoluteMinimum = 0
            });

            return(temp);
        }
コード例 #11
0
ファイル: BufUtils.cs プロジェクト: itfenom/i2p-cs
        public static HistogramBin[] Histogram <T>(this IEnumerable <T> list,
                                                   Func <T, float> select,
                                                   int bins,
                                                   float lowerabsdevs = float.MaxValue,
                                                   float upperabsdevs = float.MaxValue)
        {
            if (list == null || !list.Any())
            {
                return(default(HistogramBin[]));
            }
            var dbgcount = list.Count();

            var result = new HistogramBin[bins];

            float avg    = 0f;
            float absdev = 0f;

            var values = list.Select(v => select(v));

            if (lowerabsdevs != float.MaxValue || upperabsdevs != float.MaxValue)
            {
                avg    = values.Average();
                absdev = values.AbsDev();
            }

            var min = values.Min();
            var max = values.Max();

            if (lowerabsdevs != float.MaxValue && list.Count() > 3)
            {
                min = Math.Max(avg - absdev * lowerabsdevs, min);
            }

            if (upperabsdevs != float.MaxValue && list.Count() > 3)
            {
                max = Math.Min(avg + absdev * upperabsdevs, max);
            }

            if (min == max)
            {
                return(result);
            }

            for (int i = 0; i < bins; ++i)
            {
                result[i].Start = i * ((max - min) / bins) + min;
            }

            foreach (var one in values)
            {
                var val = one;

                if (lowerabsdevs != float.MaxValue && list.Count() > 3)
                {
                    val = Math.Max(avg - absdev * lowerabsdevs, val);
                }

                if (upperabsdevs != float.MaxValue && list.Count() > 3)
                {
                    val = Math.Min(avg + absdev * upperabsdevs, val);
                }

                var ix = Math.Max(0,
                                  Math.Min(
                                      result.Length - 1,
                                      (int)((bins * (val - min)) / (max - min))));
                ++result[ix].Count;
            }
            return(result);
        }