/// <summary> /// Kalman滤波计算不变参数。 /// </summary> /// <param name="input"></param> /// <returns></returns> private AdjustResultMatrix GetSequentialConst(AdjustObsMatrix input) { WeightedVector appri = null; Matrix B2 = input.BuildCoeefOfConstParam(); if (LastConstResult != null) { var IsEqual = Geo.Utils.ListUtil.IsEqual(LastConstResult.ParamNames, input.SecondParamNames); if (IsEqual) { appri = LastConstResult.Estimated; } else { appri = SimpleAdjustMatrixBuilder.GetNewWeighedVectorInOrder(input.SecondParamNames, LastConstResult.Estimated); } } if (appri == null)//第一次,使用参数平差结果 { ParamAdjuster paramAdjuster = new ParamAdjuster(); var paramResult = paramAdjuster.Run(new AdjustObsMatrix(input.Observation, B2, null, input.SecondParamNames)); appri = paramResult.Estimated; } AdjustObsMatrix obsMatrix1 = new AdjustObsMatrix(appri, input.Observation, B2, input.SecondTransfer); obsMatrix1.ParamNames = input.SecondParamNames; //var kalmanFilter = new SimpleKalmanFilter(); var res = MatrixAdjuster.Run(obsMatrix1); return(res); }
/// <summary> /// 计算 /// </summary> /// <param name="filePath"></param> public override void Run(string filePath) { ResultTables.Clear(); IsCancel = false; ObjectTableManagerReader reader = new ObjectTableManagerReader(filePath); ObjectTableManager tables = reader.Read(); var approxTable = tables.Get(AdjustName.Approx); var paramNameTable = tables.Get(AdjustName.ParamName); var obsTable = tables.Get(AdjustName.Obs); var rmsOfObsTable = tables.Get(AdjustName.RmsOfObs); var designTable = tables.Get(AdjustName.Design); var transTable = tables.Get(AdjustName.Trans); var rmsOfTransTable = tables.Get(AdjustName.RmsOfTrans); var aprioriTable = tables.Get(AdjustName.Apriori); var rmsOfAprioriTable = tables.Get(AdjustName.RmsOfApriori); int length = obsTable.RowCount; InitProcess(length); Vector approx = null; if (approxTable != null && approxTable.RowCount > 0) { approx = new Vector(approxTable.BufferedValues[0]); } WeightedVector apriori = null; if (aprioriTable != null && aprioriTable.RowCount > 0 && rmsOfAprioriTable != null && rmsOfAprioriTable.RowCount > 0) { apriori = new WeightedVector(new Vector(aprioriTable.BufferedValues[0]), new Matrix(new Vector(rmsOfAprioriTable.BufferedValues[0]))); } for (int i = 0; i < length; i++) { if (IsCancel) { break; } Dictionary <string, Object> obsRow = obsTable.BufferedValues[i]; Dictionary <string, Object> rmsOfObsRow = rmsOfObsTable.BufferedValues[i]; Dictionary <string, Object> designRow = designTable.BufferedValues[i]; Dictionary <string, Object> paramNameRow = paramNameTable.BufferedValues[i]; Vector obs = new Vector(obsRow); Vector RmsOfObs = new Vector(rmsOfObsRow); Vector Design = new Vector(designRow); int obsCount = obsRow.Count; int paramCount = paramNameRow.Count; Matrix RmsOfObsMatrix = new Matrix(RmsOfObs); Matrix designMatrix = new Matrix(Design.OneDimArray, obsCount, paramCount); List <string> paramNames = new List <string>(); foreach (var item in paramNameRow) { paramNames.Add(item.Key); } //平差矩阵生成 ManualAdjustMatrixBuilder matrixBuilder = new ManualAdjustMatrixBuilder(); matrixBuilder.ApproxParam = approx; matrixBuilder.SetCoeffOfDesign(designMatrix) .SetObsMinusApprox(new WeightedVector(obs, RmsOfObsMatrix.Pow(2.0))) .SetParamNames(paramNames); #region 先验值 if (apriori == null) { if (CurrentResult == null) { apriori = CreateInitAprioriParam(paramCount); apriori.ParamNames = paramNames; } else if (!IsParamsChanged(paramNames)) { apriori = CurrentResult.ResultMatrix.Estimated; } else { apriori = SimpleAdjustMatrixBuilder.GetNewWeighedVectorInOrder(paramNames, CurrentResult.ResultMatrix.Estimated); } } matrixBuilder.SetAprioriParam(apriori); apriori = null; #endregion //非必须的转移矩阵 if ((transTable != null && transTable.BufferedValues.Count > i) && (rmsOfTransTable != null && rmsOfTransTable.BufferedValues.Count > i)) { var transRow = transTable.BufferedValues[i]; Vector Trans = new Vector(transRow); var transMatrix = new Matrix(Trans.OneDimArray, paramCount, paramCount); var rmsOfTransRow = rmsOfTransTable.BufferedValues[i]; Vector RmsOfTrans = new Vector(rmsOfTransRow); var rmsOfTransMatrix = new Matrix(RmsOfTrans.OneDimArray, paramCount, paramCount); matrixBuilder.SetTransfer(new WeightedMatrix(transMatrix, rmsOfTransMatrix.Pow(2.0))); } Process(matrixBuilder); PerformProcessStep(); } this.FullProcess(); }