/// <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)); }
/// <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); } }