예제 #1
0
        /// <summary>
        /// 计算
        /// </summary>
        /// <param name="matrixBuilder"></param>
        private void Process(ManualAdjustMatrixBuilder matrixBuilder)
        {
            var matrixResult = adjuster.Run(new AdjustObsMatrix(matrixBuilder));

            this.CurrentResult = new AdjustmentResult(matrixResult);


            var paramTalbe = ResultTables.GetOrCreate("Param");
            var rmsTable   = ResultTables.GetOrCreate("Rms");

            paramTalbe.NewRow((IVector)CurrentResult.ResultMatrix.Estimated);
            rmsTable.NewRow(CurrentResult.ResultMatrix.StdOfEstimatedParam);
        }
예제 #2
0
        /// <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();
        }