コード例 #1
0
        /// <summary>
        /// Savitzky–Golay平滑和求导数(处理后的数据在spectrumDatas返回)
        /// </summary>
        /// <param name="specDatas">第一行为X数据,后面几行为Y数据</param>
        /// <param name="specRows">数据的行数</param>
        /// <param name="specCols">数据的列数</param>
        /// <param name="windowSize">平滑点数</param>
        /// <param name="polyDegree">多项式阶数</param>
        /// <param name="derDegree">导数阶数, 0=平滑</param>
        /// <returns>正确或错误</returns>
        public static bool SGSmoothAndDerivative(double[] specDatas, int specRows, int specCols, int windowSize, int polyDegree, int derDegree)
        {
            try
            {
                if (specDatas == null || specDatas.Length != specRows * specCols)
                {
                    ErrorString = "Invalid parameters";
                    return(false);
                }

                bool retcode = false;
                if (CommonMethod.Is64BitVersion())
                {
                    retcode = PPSGSmoothAndDerivative64(specDatas, specRows, specCols, windowSize, polyDegree, derDegree);
                }
                else
                {
                    retcode = PPSGSmoothAndDerivative32(specDatas, specRows, specCols, windowSize, polyDegree, derDegree);
                }
                if (!retcode)
                {
                    ErrorString = CommonMethod.GetDLLErrorMessage();
                }

                return(retcode);
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(false);
            }
        }
コード例 #2
0
        /// <summary>
        /// 预测时的MSC多元散射校正(处理后的数据在spectrumDatas返回)
        /// </summary>
        /// <param name="averageData">建模平均光谱(从PLS Coefficient获取)</param>
        /// <param name="specDatas">第一行为X数据,后面几行为Y数据</param>
        /// <param name="specRows">数据的行数</param>
        /// <param name="specCols">数据的列数</param>
        /// <returns>正确或错误</returns>
        public static bool MutiScatterCorrectionOnPredict(double[] averageData, double[] specDatas, int specRows, int specCols)
        {
            try
            {
                if (specDatas == null || averageData == null || specDatas.Length != specRows * specCols)
                {
                    ErrorString = "Invalid parameters";
                    return(false);
                }

                bool retcode = false;
                if (CommonMethod.Is64BitVersion())
                {
                    retcode = PPMutiScatterCorrectionOnPredict64(averageData, specDatas, specRows, specCols);
                }
                else
                {
                    retcode = PPMutiScatterCorrectionOnPredict32(averageData, specDatas, specRows, specCols);
                }
                if (!retcode)
                {
                    ErrorString = CommonMethod.GetDLLErrorMessage();
                }

                return(retcode);
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(false);
            }
        }
コード例 #3
0
        /// <summary>
        /// SNV标准正态变换(处理后的数据在spectrumDatas返回)
        /// </summary>
        /// <param name="spectrumDatas">第一行为X数据,后面几行为Y数据</param>
        /// <param name="specRows">数据的行数</param>
        /// <param name="specCols">数据的列数</param>
        /// <returns>正确或错误</returns>
        public static bool SNVNormalDistribution(double[] spectrumDatas, int specRows, int specCols)
        {
            try
            {
                if (spectrumDatas == null || spectrumDatas.Length != specRows * specCols)
                {
                    ErrorString = "Invalid parameters";
                    return(false);
                }

                bool retcode = false;
                if (CommonMethod.Is64BitVersion())
                {
                    retcode = PPSNVNormalDistribution64(spectrumDatas, specRows, specCols);
                }
                else
                {
                    retcode = PPSNVNormalDistribution32(spectrumDatas, specRows, specCols);
                }

                if (!retcode)
                {
                    ErrorString = CommonMethod.GetDLLErrorMessage();
                }

                return(retcode);
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(false);
            }
        }
コード例 #4
0
        /// <summary>
        /// 三次样条曲线插值(使用X轴步长)
        /// </summary>
        /// <param name="specDatas">第一行为X数据,后面几行为Y数据</param>
        /// <param name="specRows">数据的行数</param>
        /// <param name="specCols">数据的列数</param>
        /// <param name="firstX">起始波数</param>
        /// <param name="lastX">结束波数</param>
        /// <param name="stepX">波数间隔</param>
        /// <returns>返回处理后的数据, 第一行是X轴,其余行为Y轴</returns>
        public static List <double[]> SplineCubicInterpolation(double[] specDatas, int specRows, int specCols, double firstX, double lastX, double stepX)
        {
            try
            {
                if (specDatas == null || specRows < 2 || specCols < 2 || stepX == 0 ||
                    (firstX < lastX && stepX < 0) || (firstX > lastX && stepX > 0))
                {
                    throw new Exception("Invalid parameters");
                }

                IntPtr retptr      = IntPtr.Zero;
                int    outColsSize = 0;
                if (CommonMethod.Is64BitVersion())
                {
                    retptr = PPSplineCubicInterpolation64(specDatas, specRows, specCols, firstX, lastX, stepX, ref outColsSize);
                }
                else
                {
                    retptr = PPSplineCubicInterpolation32(specDatas, specRows, specCols, firstX, lastX, stepX, ref outColsSize);
                }

                if (retptr == IntPtr.Zero)
                {
                    throw new Exception(CommonMethod.GetDLLErrorMessage());
                }

                List <double[]> retdatas = new List <double[]>();

                //逐行拷贝返回数据,第一行是X轴,其余行为Y轴
                for (int i = 0; i < specRows; i++)
                {
                    double[] rowdata = new double[outColsSize];
                    Marshal.Copy(IntPtr.Add(retptr, i * outColsSize * sizeof(double)), rowdata, 0, outColsSize);
                    retdatas.Add(rowdata);
                }
                Marshal.FreeCoTaskMem(retptr);

                return(retdatas);
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(null);
            }
        }
コード例 #5
0
        /// <summary>
        /// 三次样条曲线插值(使用数据点数量,直接返回数组)
        /// </summary>
        /// <param name="specDatas">第一行为X数据,后面几行为Y数据</param>
        /// <param name="specRows">数据的行数</param>
        /// <param name="specCols">数据的列数</param>
        /// <param name="firstX">起始波数</param>
        /// <param name="lastX">结束波数</param>
        /// <param name="dataCount">数据点数量</param>
        /// <param name="returnArray">直接返回数组</param>
        /// <returns>返回处理后的数据, 第一行是X轴,其余行为Y轴</returns>
        public static double[] SplineCubicInterpolation(double[] specDatas, int specRows, int specCols, double firstX, double lastX, int dataCount, bool returnArray)
        {
            try
            {
                if (specDatas == null || specRows < 2 || specCols < 2 || dataCount < 1)
                {
                    throw new Exception("Invalid parameters");
                }

                //如果数据格式相同,不需要处理
                if (CommonMethod.IsSameXDatas(specDatas[0], specDatas[specCols - 1], firstX, lastX, dataCount) && dataCount == specCols)
                {
                    return(specDatas);
                }

                IntPtr retptr = IntPtr.Zero;
                if (CommonMethod.Is64BitVersion())
                {
                    retptr = PPInterpolationUseDataCount64(specDatas, specRows, specCols, firstX, lastX, dataCount);
                }
                else
                {
                    retptr = PPInterpolationUseDataCount32(specDatas, specRows, specCols, firstX, lastX, dataCount);
                }

                if (retptr == IntPtr.Zero)
                {
                    throw new Exception(CommonMethod.GetDLLErrorMessage());
                }

                double[] retdatas = new double[dataCount * specRows];
                Marshal.Copy(retptr, retdatas, 0, retdatas.Length);

                Marshal.FreeCoTaskMem(retptr);

                return(retdatas);
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(null);
            }
        }