Ejemplo n.º 1
0
        /// <summary>
        /// 根据主机光谱创建辅机的校准系数(数据不包含X轴)
        /// </summary>
        /// <param name="algorithmType">校准算法</param>
        /// <param name="masterData">主机数据(一条光谱一行Y轴数据)</param>
        /// <param name="slaveData">辅机数据(一条光谱一行Y轴数据)</param>
        /// <param name="windowSize">校准窗口大小</param>
        /// <param name="tolerance">校准偏差(PLS)</param>
        /// <param name="firstX">起始波数</param>
        /// <param name="lastX">结束波数</param>
        /// <param name="withXDatas">True=masterData和slaveData第一行包含X轴数据</param>
        /// <returns>校准系数</returns>
        public static byte[] GetCoefficient(enumAlgorithmType algorithmType, IList <double[]> masterData, IList <double[]> slaveData,
                                            int windowSize, double tolerance, double firstX, double lastX, bool withXDatas = false)
        {
            if (masterData == null || slaveData == null || masterData.Count < 2 || masterData.Count != slaveData.Count ||
                masterData[0].Length != slaveData[0].Length || windowSize < 1 || masterData[0].Length < windowSize + 1)
            {
                ErrorString = "Invalid parameters";
                return(null);
            }

            double[] allmaster = CommonMethod.CombineSpectrumDatas(masterData);
            double[] allslave  = CommonMethod.CombineSpectrumDatas(slaveData);
            if (allmaster == null || allslave == null)
            {
                ErrorString = "Invalid parameters";
                return(null);
            }

            return(GetCoefficient(algorithmType, allmaster, allslave, masterData.Count, masterData[0].Length, windowSize, tolerance, firstX, lastX, withXDatas));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 根据主机光谱创建辅机的校准系数
        /// </summary>
        /// <param name="algorithmType">校准算法</param>
        /// <param name="masterData">主机数据(一条光谱一行Y轴数据)</param>
        /// <param name="slaveData">辅机数据(一条光谱一行Y轴数据)</param>
        /// <param name="specRows">光谱的行数</param>
        /// <param name="specCols">每条光谱的数据点数量</param>
        /// <param name="windowSize">校准窗口大小(PDS), RANK(SST)</param>
        /// <param name="tolerance">校准偏差(PLS)</param>
        /// <param name="firstX">起始波数</param>
        /// <param name="lastX">结束波数</param>
        /// <param name="withXDatas">是否包含X轴数据</param>
        /// <returns>校准系数</returns>
        public static byte[] GetCoefficient(enumAlgorithmType algorithmType, double[] masterData, double[] slaveData, int specRows, int specCols,
                                            int windowSize, double tolerance, double firstX, double lastX, bool withXDatas)
        {
            if (masterData == null || slaveData == null || specRows < 2 || specCols < windowSize + 1 || windowSize < 1 ||
                masterData.Length != specRows * specCols || masterData.Length != slaveData.Length)
            {
                ErrorString = "Invalid Parameters";
                return(null);
            }

            try
            {
                IntPtr retptr   = IntPtr.Zero;
                int    datasize = 0;
                switch (algorithmType)
                {
                case enumAlgorithmType.PDS:
                    if (CommonMethod.Is64BitVersion())
                    {
                        retptr = PDSCoefficient64(masterData, slaveData, specRows, specCols, windowSize, firstX, lastX, withXDatas, ref datasize);
                    }
                    else
                    {
                        retptr = PDSCoefficient32(masterData, slaveData, specRows, specCols, windowSize, firstX, lastX, withXDatas, ref datasize);
                    }
                    break;

                case enumAlgorithmType.PLS:
                    if (CommonMethod.Is64BitVersion())
                    {
                        retptr = PLSCoefficient64(masterData, slaveData, specRows, specCols, windowSize, tolerance, firstX, lastX, withXDatas, ref datasize);
                    }
                    else
                    {
                        retptr = PLSCoefficient32(masterData, slaveData, specRows, specCols, windowSize, tolerance, firstX, lastX, withXDatas, ref datasize);
                    }
                    break;

                case enumAlgorithmType.SST:
                    if (CommonMethod.Is64BitVersion())
                    {
                        retptr = SSTCoefficient64(masterData, slaveData, specRows, specCols, windowSize, firstX, lastX, withXDatas, ref datasize);
                    }
                    else
                    {
                        retptr = SSTCoefficient32(masterData, slaveData, specRows, specCols, windowSize, firstX, lastX, withXDatas, ref datasize);
                    }
                    break;

                default:
                    break;
                }

                if (retptr == IntPtr.Zero)
                {
                    ErrorString = GetErrorMessage();
                    return(null);
                }

                return(CommonMethod.CopyDataArrayFromIntptrAndFree <byte>(ref retptr, datasize));
            }
            catch (Exception ex)
            {
                ErrorString = ex.Message;
                return(null);
            }
        }