示例#1
0
        public Array splice(int start, int deleteCount = int.MaxValue, params as3.Object[] addElements)
        {
            var result = new Array(deleteCount);

            while (deleteCount-- > 0 && start < this.length)
            {
                result.Add(this[start]);
                vector.RemoveAt(start);
            }
            vector.AddRange(addElements);
            return(result);
        }
示例#2
0
        /// <summary>
        /// Defines the control points defining the tangent values for the first and last points.
        /// </summary>
        private static List <Point4> SolveCtrlPtsWithTangents(KnotVector knots, List <Point3> pts, Matrix coeffMatrix, int degree, Vector3 startTangent, Vector3 endTangent)
        {
            Matrix matrixLu  = Matrix.Decompose(coeffMatrix, out int[] permutation);
            Matrix ptsSolved = new Matrix();

            // Equations 9.11
            double mult0 = knots[degree + 1] / degree;
            // Equations 9.12
            double mult1 = (1 - knots[knots.Count - degree - 2]) / degree;

            // Solve for each dimension.
            for (int i = 0; i < 3; i++)
            {
                Vector b = new Vector {
                    pts[0][i], startTangent[i] * mult0
                };
                // Insert the tangents at the second and second to last index.
                // Equations 9.11
                b.AddRange(pts.Skip(1).Take(pts.Count - 2).Select(pt => pt[i]));
                // Equations 9.12
                b.Add(endTangent[i] * mult1);
                b.Add(pts[pts.Count - 1][i]);

                Vector solution = Matrix.Solve(matrixLu, permutation, b);
                ptsSolved.Add(solution);
            }

            return(ptsSolved.Transpose().Select(pt => new Point4(pt[0], pt[1], pt[2], 1)).ToList());
        }
示例#3
0
        public void VectorAddRange()
        {
            var vector = new Vector <int>(10);

            vector.AddRange(new List <int> {
                1, 2, 3, 4, 5
            });
            Assert.AreEqual(vector.Count, 5);
            for (int i = 0; i < vector.Count; i++)
            {
                Assert.AreEqual(vector[i], i + 1);
            }
        }
示例#4
0
        public void AddRange()
        {
            var vector = new Vector <string> {
                "", null, "1"
            };
            var system = new S.List <string> {
                "", null, "1"
            };

            Comparer <string> .Compare(vector, system);

            vector.AddRange(Globals.Strings);
            system.AddRange(Globals.Strings);

            Comparer <string> .Compare(vector, system);
        }
示例#5
0
        public void TestAddRange()
        {
            int[] array = new int[]{0,1,2,3,4,5,6};
            Vector<int> v = new Vector<int>(array);
            int[] splice = new int[]{-1,-2,-3};

            v.AddRange(splice);
            Assert.AreEqual(array.Length+splice.Length, v.Count);
            Assert.AreEqual(5, v[5]);
            Assert.AreEqual(6, v[6]);
            Assert.AreEqual(-1, v[7]);
            Assert.AreEqual(-2, v[8]);
            Assert.AreEqual(-3, v[9]);

            v = new Vector<int>(array);
            v.AddRange(IteratorUtil.Begin(splice), IteratorUtil.End(splice));
            Assert.AreEqual(array.Length+splice.Length, v.Count);
            Assert.AreEqual(5, v[5]);
            Assert.AreEqual(6, v[6]);
            Assert.AreEqual(-1, v[7]);
            Assert.AreEqual(-2, v[8]);
            Assert.AreEqual(-3, v[9]);
        }
示例#6
0
        /// <summary>
        /// 具有约束条件的参数平差的无限权解法解算模糊度固定。
        /// </summary>
        /// <param name="totalFloat"></param>
        /// <param name="fixedAmbiguities"></param>
        /// <returns></returns>
        public WeightedVector GetResultByWeighedParamAdjust(WeightedVector totalFloat, WeightedVector fixedAmbiguities)
        {
            if (fixedAmbiguities.Count == 0)
            {
                return(totalFloat);
            }

            int totalParamCount = totalFloat.Count; //待估参数个数
            int fixedAmbiCount  = fixedAmbiguities.Count;

            //平差系数阵
            var PA = new Matrix(totalFloat.Weights);
            var LA = new Matrix((IVector)totalFloat, true)
            {
                RowNames = totalFloat.ParamNames
            };
            var A  = DiagonalMatrix.GetIdentity(totalParamCount);//A x = l
            var LB = new Matrix((IVector)fixedAmbiguities, true)
            {
                RowNames = fixedAmbiguities.ParamNames
            };
            var PB = new Matrix(fixedAmbiguities.Weights);

            Matrix B = BuildCoeefOfFixedToFloat(totalFloat, fixedAmbiguities);

            var BTBP = B.Trans * PB;

            //A 为单位阵,不需要计算
            var NA = PA;      //AT * P * A
            var UA = PA * LA; //AT * P * L

            UA.ColNames = new List <string>()
            {
                "Names"
            };
            NA.ColNames = totalFloat.ParamNames;
            UA.RowNames = totalFloat.ParamNames;
            NA.RowNames = totalFloat.ParamNames;


            var NB = BTBP * B;
            var UB = BTBP * LB;

            UB.ColNames = new List <string>()
            {
                "Names"
            };
            NB.ColNames = totalFloat.ParamNames;
            UB.RowNames = totalFloat.ParamNames;
            NB.RowNames = totalFloat.ParamNames;

            MatrixEquation neA = new MatrixEquation(NA, UA);
            MatrixEquation neB = new MatrixEquation(NB, UB);
            var            eq  = neA + neB;

            var result = eq.GetEstimated();

            //整体矩阵验证, 2018.10.20, czs, in hmx, 已经验证与整体平差一致,但是如果权太大如1e40,则可能出现舍入误差,而失真!!
            if (false)
            {
                Matrix AB = new Matrix(A.RowCount + B.RowCount, A.ColCount);
                AB.SetSub(A);
                AB.SetSub(B, A.ColCount);

                Matrix PAB = new Matrix(PA.RowCount + PB.RowCount);
                PAB.SetSub(PA);
                PAB.SetSub(PB, PA.RowCount, PA.ColCount);

                Vector LAB = new Vector(totalFloat);
                LAB.AddRange(fixedAmbiguities);

                ParamAdjuster paramAdjuster = new ParamAdjuster();
                var           result2       = paramAdjuster.Run(new AdjustObsMatrix(new WeightedVector(LAB, PAB.Inversion), AB));
            }
            return(result);
        }
示例#7
0
        public static Cons FormatCode(Cons template, params object[] args)
        {
            var result = new Vector();
            foreach (var item in template)
            {
                if (item is Symbol)
                {
                    var sym = (Symbol)item;
                    if (sym.Name.StartsWith("%%"))
                    {
                        int index;
                        if (int.TryParse(sym.Name.Substring(2), out index))
                        {
                            result.AddRange((Cons)args[index - 1]);
                            continue;
                        }
                    }
                    else if (sym.Name.StartsWith("%"))
                    {
                        int index;
                        if (int.TryParse(sym.Name.Substring(1), out index))
                        {
                            result.Add(args[index - 1]);
                            continue;
                        }
                    }
                }

                if (item is Cons)
                {
                    result.Add(FormatCode((Cons)item, args));
                    continue;
                }
                result.Add(item);
            }
            return AsList(result);
        }
示例#8
0
        public static Expression CompileTry(Cons form, AnalysisScope scope)
        {
            var tryForms = new Vector();
            var catchForms = new List<Cons>();
            var cleanupForms = new Vector();
            foreach (var expr in Cdr(form))
            {
                if (expr is Cons)
                {
                    var list = (Cons)expr;
                    var head = First(list);
                    if (head == Symbols.Catch)
                    {
                        catchForms.Add(Cdr(list));
                        continue;
                    }
                    else if (head == Symbols.Finally)
                    {
                        cleanupForms.AddRange(Cdr(list));
                        continue;
                    }
                }
                tryForms.Add(expr);
            }

            if (cleanupForms.Count != 0)
            {
                return CompileTryCatchFinally(AsList(tryForms), catchForms, AsList(cleanupForms), scope);
            }
            else if (catchForms.Count != 0)
            {
                return CompileTryCatch(AsList(tryForms), catchForms, scope);
            }
            else {
                return CompileBody(AsList(tryForms), scope);
            }
        }