コード例 #1
0
ファイル: CubicSpline.cs プロジェクト: javamng/GitHUB
		/// <summary>
		/// Fit the input x,y points using a 'geometric' strategy so that y does not have to be a single-valued
		/// function of x.
		/// </summary>
		/// <param name="x">Input x coordinates.</param>
		/// <param name="y">Input y coordinates, do not need to be a single-valued function of x.</param>
		/// <param name="nOutputPoints">How many output points to create.</param>
		/// <param name="xs">Output (interpolated) x values.</param>
		/// <param name="ys">Output (interpolated) y values.</param>
		public static void FitGeometric(float[] x, float[] y, int nOutputPoints, out float[] xs, out float[] ys)
		{
			// Compute distances
			int n = x.Length;
			float[] dists = new float[n]; // cumulative distance
			dists[0] = 0;
			float totalDist = 0;

			for (int i = 1; i < n; i++)
			{
				float dx = x[i] - x[i - 1];
				float dy = y[i] - y[i - 1];
				float dist = (float)Math.Sqrt(dx * dx + dy * dy);
				totalDist += dist;
				dists[i] = totalDist;
			}

			// Create 'times' to interpolate to
			float dt = totalDist / (nOutputPoints - 1);
			float[] times = new float[nOutputPoints];
			times[0] = 0;

			for (int i = 1; i < nOutputPoints; i++)
			{
				times[i] = times[i - 1] + dt;
			}

			// Spline fit both x and y to times
			CubicSpline xSpline = new CubicSpline();
			xs = xSpline.FitAndEval(dists, x, times);

			CubicSpline ySpline = new CubicSpline();
			ys = ySpline.FitAndEval(dists, y, times);
		}
コード例 #2
0
        /// <summary>
        /// Static all-in-one method to fit the splines and evaluate at X coordinates.
        /// </summary>
        /// <param name="x">Input. X coordinates to fit.</param>
        /// <param name="y">Input. Y coordinates to fit.</param>
        /// <param name="xs">Input. X coordinates to evaluate the fitted curve at.</param>
        /// <param name="startSlope">Optional slope constraint for the first point. Single.NaN means no constraint.</param>
        /// <param name="endSlope">Optional slope constraint for the final point. Single.NaN means no constraint.</param>
        /// <param name="debug">Turn on console output. Default is false.</param>
        /// <returns>The computed y values for each xs.</returns>
        public static float[] Compute(float[] x, float[] y, float[] xs, float startSlope = float.NaN, float endSlope = float.NaN, bool debug = false)
        {
            CubicSpline spline = new CubicSpline();

            return(spline.FitAndEval(x, y, xs, startSlope, endSlope, debug));
        }
コード例 #3
0
ファイル: CubicSpline.cs プロジェクト: javamng/GitHUB
		/// <summary>
		/// Static all-in-one method to fit the splines and evaluate at X coordinates.
		/// </summary>
		/// <param name="x">Input. X coordinates to fit.</param>
		/// <param name="y">Input. Y coordinates to fit.</param>
		/// <param name="xs">Input. X coordinates to evaluate the fitted curve at.</param>
		/// <param name="startSlope">Optional slope constraint for the first point. Single.NaN means no constraint.</param>
		/// <param name="endSlope">Optional slope constraint for the final point. Single.NaN means no constraint.</param>
		/// <param name="debug">Turn on console output. Default is false.</param>
		/// <returns>The computed y values for each xs.</returns>
		public static float[] Compute(float[] x, float[] y, float[] xs, float startSlope = float.NaN, float endSlope = float.NaN, bool debug = false)
		{
			CubicSpline spline = new CubicSpline();
			return spline.FitAndEval(x, y, xs, startSlope, endSlope, debug);
		}
コード例 #4
0
ファイル: Spectrum.cs プロジェクト: javamng/GitHUB
        public void FilterNoiseBySlope(double slopeThreshold = 10000)
        {
            if (Peaks.Length < 2) return;

            var mzData = new float[Peaks.Length];
            var intensityData = new float[Peaks.Length];
            var i = 0;

            for (i = 0; i < Peaks.Length; i++)
            {
                mzData[i] = (float) Peaks[i].Mz;
                intensityData[i] = (float) Peaks[i].Intensity;
            }

            var spline = new CubicSpline();
            spline.Fit(mzData, intensityData);

            var intensitySlope = spline.EvalSlope(mzData);

            var filteredPeaks = new List<Peak>();
            
            for (i = 0; i < Peaks.Length; i++)
            {
                if (Math.Abs(intensitySlope[i]) > slopeThreshold)
                    filteredPeaks.Add(Peaks[i]);
            }
            Peaks = filteredPeaks.ToArray();
        }