예제 #1
0
        public static void Interpolation(Altaxo.Data.DataColumn xCol, Altaxo.Data.DataColumn yCol,
                                         Calc.Interpolation.IInterpolationFunction interpolInstance, IReadOnlyList <double> samplePoints,
                                         Altaxo.Data.DataColumn xRes, Altaxo.Data.DataColumn yRes)
        {
            int rows = Math.Min(xCol.Count, yCol.Count);
            var yVec = DataColumnWrapper.ToROVector((INumericColumn)yCol, rows);
            var xVec = DataColumnWrapper.ToROVector((INumericColumn)xCol, rows);

            interpolInstance.Interpolate(xVec, yVec);

            using (var suspendToken_xRes = xRes.SuspendGetToken())
            {
                using (var suspendToken_yRes = yRes.SuspendGetToken())
                {
                    for (int i = 0; i < samplePoints.Count; i++)
                    {
                        //double r = i / (double)(parameters.NumberOfPoints - 1);
                        //double x = parameters.XOrg * (1 - r) + parameters.XEnd * (r);
                        double x = samplePoints[i];
                        double y = interpolInstance.GetYOfX(x);
                        xRes[i] = x;
                        yRes[i] = y;
                    }
                    suspendToken_yRes.Resume();
                }
                suspendToken_xRes.Resume();
            }
        }
예제 #2
0
        public static void SavitzkyGolay(SavitzkyGolayParameters parameters, Altaxo.Data.DataColumn yCol, Altaxo.Data.DataColumn xCol)
        {
            double spacing = 1;

            if (xCol is Data.INumericColumn)
            {
                var calcspace = new Calc.LinearAlgebra.VectorSpacingEvaluator(Calc.LinearAlgebra.DataColumnWrapper.ToROVector(xCol));
                if (!calcspace.HasValidSpaces || calcspace.HasInvalidSpaces)
                {
                    Current.Gui.ErrorMessageBox(string.Format("The x-column {0} contains invalid spaces (is not equally spaced)", xCol.Name));
                    return;
                }
                if (calcspace.RelativeSpaceDeviation > 1E-2)
                {
                    if (!Current.Gui.YesNoMessageBox(
                            string.Format("The x-column {0} is not equally spaced, the deviation is {1}, the mean spacing is {2}. Continue anyway?", xCol.Name, calcspace.RelativeSpaceDeviation, calcspace.SpaceMeanValue),
                            "Continue?", true))
                    {
                        return;
                    }
                }

                spacing = calcspace.SpaceMeanValue;
            }

            var filter = new SavitzkyGolay(parameters);

            using (var suspendToken = yCol.SuspendGetToken())
            {
                filter.Apply(DataColumnWrapper.ToROVectorCopy(yCol), DataColumnWrapper.ToVector(yCol));

                if (parameters.DerivativeOrder > 0)
                {
                    double factor = Math.Pow(1 / spacing, parameters.DerivativeOrder) * Calc.GammaRelated.Fac(parameters.DerivativeOrder);
                    yCol.Data = yCol * factor;
                }
                suspendToken.Dispose();
            }
        }