コード例 #1
0
 public void GeneralMatrixChangeEventTest()
 {
     GeneralMatrix<int> matrix = new GeneralMatrix<int>(new int[3, 3] { { 1, 2, 3 }, { 2, 1, 2 }, { 3, 2, 1 } });
     Subscribe(matrix);
     matrix[0, 1] = 5;
     Unsubscribe(matrix);
     Assert.AreEqual<string>("GeneralMatrix", message);
 }
コード例 #2
0
 public static void WriteMatrix(GeneralMatrix m)
 {
     if (m==null)
         return;
     for(int i = 0;i<m.RowDimension;++i)
     {
         for(int j = 0;j<m.ColumnDimension;++j)
         {
             Console.Write("{0} ",m.GetElement(i,j));
         }
         Console.WriteLine();
     }
 }
コード例 #3
0
ファイル: QRDecomposition.cs プロジェクト: lzhm216/coordtrans
        /// <summary>QR Decomposition, computed by Householder reflections.</summary>
        /// <param name="A">   Rectangular matrix
        /// </param>
        /// <returns>     Structure to access R and the Householder vectors and compute Q.
        /// </returns>
        public QRDecomposition(GeneralMatrix A)
        {
            // Initialize.
            QR = A.ArrayCopy;
            m = A.RowDimension;
            n = A.ColumnDimension;
            Rdiag = new double[n];

            // Main loop.
            for (int k = 0; k < n; k++)
            {
                // Compute 2-norm of k-th column without under/overflow.
                double nrm = 0;
                for (int i = k; i < m; i++)
                {
                    nrm = Maths.Hypot(nrm, QR[i][k]);
                }

                if (nrm != 0.0)
                {
                    // Form k-th Householder vector.
                    if (QR[k][k] < 0)
                    {
                        nrm = - nrm;
                    }
                    for (int i = k; i < m; i++)
                    {
                        QR[i][k] /= nrm;
                    }
                    QR[k][k] += 1.0;

                    // Apply transformation to remaining columns.
                    for (int j = k + 1; j < n; j++)
                    {
                        double s = 0.0;
                        for (int i = k; i < m; i++)
                        {
                            s += QR[i][k] * QR[i][j];
                        }
                        s = (- s) / QR[k][k];
                        for (int i = k; i < m; i++)
                        {
                            QR[i][j] += s * QR[i][k];
                        }
                    }
                }
                Rdiag[k] = - nrm;
            }
        }
コード例 #4
0
 /// <summary>Cholesky algorithm for symmetric and positive definite matrix.</summary>
 /// <param name="Arg">  Square, symmetric matrix.
 /// </param>
 /// <returns>     Structure to access L and isspd flag.
 /// </returns>
 public CholeskyDecomposition(GeneralMatrix Arg)
 {
     // Initialize.
     double[][] A = Arg.Array;
     n = Arg.RowDimension;
     L = new double[n][];
     for (int i = 0; i < n; i++)
     {
         L[i] = new double[n];
     }
     isspd = (Arg.ColumnDimension == n);
     // Main loop.
     for (int j = 0; j < n; j++)
     {
         double[] Lrowj = L[j];
         double d = 0.0;
         for (int k = 0; k < j; k++)
         {
             double[] Lrowk = L[k];
             double s = 0.0;
             for (int i = 0; i < k; i++)
             {
                 s += Lrowk[i] * Lrowj[i];
             }
             Lrowj[k] = s = (A[j][k] - s) / L[k][k];
             d = d + s * s;
             isspd = isspd & (A[k][j] == A[j][k]);
         }
         d = A[j][j] - d;
         isspd = isspd & (d > 0.0);
         L[j][j] = System.Math.Sqrt(System.Math.Max(d, 0.0));
         for (int k = j + 1; k < n; k++)
         {
             L[j][k] = 0.0;
         }
     }
 }
コード例 #5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="p0">First point on route, in projected (metric) coordinates relative to projection origin</param>
        /// <param name="q0">First point on map, in pixels</param>
        /// <param name="p1">Second point on route, in projected (metric) coordinates relative to projection origin</param>
        /// <param name="q1">Second point on map, in pixels</param>
        /// <param name="fallbackMatrix">Matrix to use if calculation fails due to singular matrix</param>
        /// <param name="useRotation">If true, assumes orthogonal map and calculates scale and rotation. If false, calculates different scale in x and y directions and no rotation.</param>
        /// <returns></returns>
        public static GeneralMatrix CalculateTransformationMatrix(PointD p0, PointD q0, PointD p1, PointD q1, GeneralMatrix fallbackMatrix, bool useRotation)
        {
            try
            {
                if (useRotation)
                {
                    // note that we need to mirror y pixel value in x axis
                    double angleDifferece = GetAngleR(p1 - p0, new PointD(q1.X, -q1.Y) - new PointD(q0.X, -q0.Y));
                    double lengthQ        = DistancePointToPoint(q0, q1);
                    double lengthP        = DistancePointToPoint(p0, p1);
                    double scaleFactor    = lengthP == 0 ? 0 : lengthQ / lengthP;
                    double cos            = Math.Cos(angleDifferece);
                    double sin            = Math.Sin(angleDifferece);

                    // translation to origo in metric space
                    var a = new GeneralMatrix(3, 3);
                    a.SetElement(0, 0, 1);
                    a.SetElement(0, 1, 0);
                    a.SetElement(0, 2, -p0.X);
                    a.SetElement(1, 0, 0);
                    a.SetElement(1, 1, 1);
                    a.SetElement(1, 2, -p0.Y);
                    a.SetElement(2, 0, 0);
                    a.SetElement(2, 1, 0);
                    a.SetElement(2, 2, 1);

                    // rotation
                    var b = new GeneralMatrix(3, 3);
                    b.SetElement(0, 0, cos);
                    b.SetElement(0, 1, -sin);
                    b.SetElement(0, 2, 0);
                    b.SetElement(1, 0, sin);
                    b.SetElement(1, 1, cos);
                    b.SetElement(1, 2, 0);
                    b.SetElement(2, 0, 0);
                    b.SetElement(2, 1, 0);
                    b.SetElement(2, 2, 1);

                    // scaling, note that we need to mirror y scale around x axis
                    var c = new GeneralMatrix(3, 3);
                    c.SetElement(0, 0, scaleFactor);
                    c.SetElement(0, 1, 0);
                    c.SetElement(0, 2, 0);
                    c.SetElement(1, 0, 0);
                    c.SetElement(1, 1, -scaleFactor);
                    c.SetElement(1, 2, 0);
                    c.SetElement(2, 0, 0);
                    c.SetElement(2, 1, 0);
                    c.SetElement(2, 2, 1);

                    // translation from origo to pixel space
                    var d = new GeneralMatrix(3, 3);
                    d.SetElement(0, 0, 1);
                    d.SetElement(0, 1, 0);
                    d.SetElement(0, 2, q0.X);
                    d.SetElement(1, 0, 0);
                    d.SetElement(1, 1, 1);
                    d.SetElement(1, 2, q0.Y);
                    d.SetElement(2, 0, 0);
                    d.SetElement(2, 1, 0);
                    d.SetElement(2, 2, 1);

                    return(d * c * b * a);
                }
                else // useRotation == false
                {
                    var m1 = new GeneralMatrix(2, 2);
                    m1.SetElement(0, 0, p0.X);
                    m1.SetElement(0, 1, 1);
                    m1.SetElement(1, 0, p1.X);
                    m1.SetElement(1, 1, 1);

                    var v1 = new GeneralMatrix(2, 1);
                    v1.SetElement(0, 0, q0.X);
                    v1.SetElement(1, 0, q1.X);
                    var t1 = m1.Inverse() * v1;

                    var m2 = new GeneralMatrix(2, 2);
                    m2.SetElement(0, 0, p0.Y);
                    m2.SetElement(0, 1, 1);
                    m2.SetElement(1, 0, p1.Y);
                    m2.SetElement(1, 1, 1);

                    var v2 = new GeneralMatrix(2, 1);
                    v2.SetElement(0, 0, q0.Y);
                    v2.SetElement(1, 0, q1.Y);
                    var t2 = m2.Inverse() * v2;

                    var t = new GeneralMatrix(3, 3);
                    t.SetElement(0, 0, t1.GetElement(0, 0));
                    t.SetElement(0, 1, 0);
                    t.SetElement(0, 2, t1.GetElement(1, 0));
                    t.SetElement(1, 0, 0);
                    t.SetElement(1, 1, t2.GetElement(0, 0));
                    t.SetElement(1, 2, t2.GetElement(1, 0));
                    t.SetElement(2, 0, 0);
                    t.SetElement(2, 1, 0);
                    t.SetElement(2, 2, 1);

                    return(t);
                }
            }
            catch (Exception)
            {
                return((GeneralMatrix)fallbackMatrix.Clone());
            }
        }
コード例 #6
0
 public static PointD ToPointD(GeneralMatrix _3x1Matrix)
 {
     return(new PointD(_3x1Matrix.GetElement(0, 0), _3x1Matrix.GetElement(1, 0)));
 }
コード例 #7
0
 public Transformation(GeneralMatrix transformationMatrix, LongLat projectionOrigin)
 {
     TransformationMatrix = transformationMatrix;
     ProjectionOrigin     = projectionOrigin;
 }
コード例 #8
0
        void OnFrameArrived(object sender, BodyFrameArrivedEventArgs e)
        {
            using (var frame = e.FrameReference.AcquireFrame())
            {
                if ((frame != null) && (frame.BodyCount > 0))
                {
                    if ((this.bodies == null) || (this.bodies.Length != frame.BodyCount))
                    {
                        this.bodies = new Body[frame.BodyCount];
                    }

                    frame.GetAndRefreshBodyData(this.bodies); // Sensor will reveive 6 body -> this mean for 6 people

                    for (int i = 0; i < brushes.Length; i++)
                    {
                        if (this.bodies[i].IsTracked) // For this testing will only get 1 body that is tracked
                        {
                            this.bodyDrawers[i].DrawFrame(this.bodies[i]);

                            if (count < dt)
                            {
                                rBody[count] = this.bodies[i];
                            }
                            else
                            {
                                // Calculate R Variance every 30 Frame Body
                                calcRVariance();

                                // Set the counter back to 0 (restart the frame tracked count)
                                // Set body hist
                                count        = 0;
                                rBody[count] = this.bodies[i];
                            }

                            if ((count + 1) % dt == 0 && count != 0) // Calculate every dt frame
                            {
                                // Hitung sudut dari sensor kamera RULA
                                this.calculateAngle(this.bodies[i]);
                                // Lakukan perhitungan RULA
                                this.calculateRulaEngine();
                            }

                            // Initialize Xk-1
                            if (first)
                            {
                                if (count + 1 == dt - 1)
                                {
                                    for (int c = 0; c < Xk.Length; c++)
                                    {
                                        GeneralMatrix StateMatrix = GeneralMatrix.Random(6, 1);
                                        StateMatrix.SetElement(0, 0, rBody[count].Joints[GlobalVal.BodyPart[c]].Position.X);
                                        StateMatrix.SetElement(1, 0, rBody[count].Joints[GlobalVal.BodyPart[c]].Position.Y);
                                        StateMatrix.SetElement(2, 0, rBody[count].Joints[GlobalVal.BodyPart[c]].Position.Z);
                                        StateMatrix.SetElement(3, 0, 1);
                                        StateMatrix.SetElement(4, 0, 1);
                                        StateMatrix.SetElement(5, 0, 1);
                                        Xk[c] = StateMatrix;
                                    }
                                    first = false;
                                }
                            }

                            // Count the frame
                            count += 1;
                        }
                        else
                        {
                            this.bodyDrawers[i].ClearFrame();
                        }
                    }
                }
            }
        }
コード例 #9
0
        /// <summary>
        /// Converts a map image pixel coordinate to a longitude and latitude coordinate
        /// </summary>
        /// <param name="mapImagePosition">Map pixel coordinate, referring to unzoomed map without any borders and image header</param>
        /// <returns></returns>
        public LongLat GetLongLatForMapImagePosition(PointD mapImagePosition, GeneralMatrix averageTransformationMatrixInverse)
        {
            var projectedPosition = LinearAlgebraUtil.Transform(mapImagePosition, averageTransformationMatrixInverse);

            return(LongLat.Deproject(projectedPosition, ProjectionOrigin));
        }
コード例 #10
0
 static void Unsubscribe(GeneralMatrix<int> matrix)
 {
     matrix.ElementChanged -= ElementChanged;
 }
コード例 #11
0
 public RubineRecognizer()
 {
     _weights    = new GeneralMatrix(1, 1);
     _weights_0  = new List <double>();
     _classNames = new List <string>();
 }
コード例 #12
0
 public void InitData()
 {
     A = new GeneralMatrix(columnwise, validld);
     T = new GeneralMatrix(tvals);
 }
コード例 #13
0
        public void MultiplyZero()
        {
            GeneralMatrix Z = new GeneralMatrix(A.RowDimension, A.ColumnDimension);

            Assert.IsTrue(GeneralTests.Check(A.Multiply(0.0), Z));
        }
コード例 #14
0
        public static void  Main(System.String[] argv)
        {
            /*
             | Tests LU, QR, SVD and symmetric Eig decompositions.
             |
             |   n       = order of magic square.
             |   trace   = diagonal sum, should be the magic sum, (n^3 + n)/2.
             |   max_eig = maximum eigenvalue of (A + A')/2, should equal trace.
             |   rank    = linear algebraic rank,
             |             should equal n if n is odd, be less than n if n is even.
             |   cond    = L_2 condition number, ratio of singular values.
             |   lu_res  = test of LU factorization, norm1(L*U-A(p,:))/(n*eps).
             |   qr_res  = test of QR factorization, norm1(Q*R-A)/(n*eps).
             */

            print("\n    Test of GeneralMatrix Class, using magic squares.\n");
            print("    See MagicSquareExample.main() for an explanation.\n");
            print("\n      n     trace       max_eig   rank        cond      lu_res      qr_res\n\n");

            System.DateTime start_time = System.DateTime.Now;
            double          eps        = System.Math.Pow(2.0, -52.0);

            for (int n = 3; n <= 32; n++)
            {
                print(fixedWidthIntegertoString(n, 7));

                GeneralMatrix M = magic(n);

                //UPGRADE_WARNING: Narrowing conversions may produce unexpected results in C#. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1042"'
                int t = (int)M.Trace();
                print(fixedWidthIntegertoString(t, 10));

                EigenvalueDecomposition E = new EigenvalueDecomposition(M.Add(M.Transpose()).Multiply(0.5));
                double[] d = E.RealEigenvalues;
                print(fixedWidthDoubletoString(d[n - 1], 14, 3));

                int r = M.Rank();
                print(fixedWidthIntegertoString(r, 7));

                double c = M.Condition();
                print(c < 1 / eps ? fixedWidthDoubletoString(c, 12, 3):"         Inf");

                LUDecomposition LU  = new LUDecomposition(M);
                GeneralMatrix   L   = LU.L;
                GeneralMatrix   U   = LU.U;
                int[]           p   = LU.Pivot;
                GeneralMatrix   R   = L.Multiply(U).Subtract(M.GetMatrix(p, 0, n - 1));
                double          res = R.Norm1() / (n * eps);
                print(fixedWidthDoubletoString(res, 12, 3));

                QRDecomposition QR = new QRDecomposition(M);
                GeneralMatrix   Q  = QR.Q;
                R   = QR.R;
                R   = Q.Multiply(R).Subtract(M);
                res = R.Norm1() / (n * eps);
                print(fixedWidthDoubletoString(res, 12, 3));

                print("\n");
            }

            System.DateTime stop_time = System.DateTime.Now;
            double          etime     = (stop_time.Ticks - start_time.Ticks) / 1000.0;

            print("\nElapsed Time = " + fixedWidthDoubletoString(etime, 12, 3) + " seconds\n");
            print("Adios\n");
        }
コード例 #15
0
        /// <summary>Generate magic square test matrix. *</summary>

        public static GeneralMatrix magic(int n)
        {
            double[][] M = new double[n][];
            for (int i = 0; i < n; i++)
            {
                M[i] = new double[n];
            }

            // Odd order

            if ((n % 2) == 1)
            {
                int a = (n + 1) / 2;
                int b = (n + 1);
                for (int j = 0; j < n; j++)
                {
                    for (int i = 0; i < n; i++)
                    {
                        M[i][j] = n * ((i + j + a) % n) + ((i + 2 * j + b) % n) + 1;
                    }
                }

                // Doubly Even Order
            }
            else if ((n % 4) == 0)
            {
                for (int j = 0; j < n; j++)
                {
                    for (int i = 0; i < n; i++)
                    {
                        if (((i + 1) / 2) % 2 == ((j + 1) / 2) % 2)
                        {
                            M[i][j] = n * n - n * i - j;
                        }
                        else
                        {
                            M[i][j] = n * i + j + 1;
                        }
                    }
                }

                // Singly Even Order
            }
            else
            {
                int           p = n / 2;
                int           k = (n - 2) / 4;
                GeneralMatrix A = magic(p);
                for (int j = 0; j < p; j++)
                {
                    for (int i = 0; i < p; i++)
                    {
                        double aij = A.GetElement(i, j);
                        M[i][j]         = aij;
                        M[i][j + p]     = aij + 2 * p * p;
                        M[i + p][j]     = aij + 3 * p * p;
                        M[i + p][j + p] = aij + p * p;
                    }
                }
                for (int i = 0; i < p; i++)
                {
                    for (int j = 0; j < k; j++)
                    {
                        double t = M[i][j]; M[i][j] = M[i + p][j]; M[i + p][j] = t;
                    }
                    for (int j = n - k + 1; j < n; j++)
                    {
                        double t = M[i][j]; M[i][j] = M[i + p][j]; M[i + p][j] = t;
                    }
                }
                double t2 = M[k][0]; M[k][0] = M[k + p][0]; M[k + p][0] = t2;
                t2 = M[k][k]; M[k][k] = M[k + p][k]; M[k + p][k] = t2;
            }
            return(new GeneralMatrix(M));
        }
コード例 #16
0
ファイル: KabschNode.cs プロジェクト: jvolker/dx11-particles
        // this is the straight forward implementation of the kabsch algorithm.
        // see http://en.wikipedia.org/wiki/Kabsch_algorithm for a detailed explanation.
        public void Evaluate(int SpreadMax)
        {
            FOutput.SliceCount = 1;
            Matrix4x4 mOut;

            if (FInputP.SliceCount > 0 && FInputQ.SliceCount > 0 && FInputEnabled[0])
            {
                // ======================== STEP 1 ========================
                // translate both sets so that their centroids coincides with the origin
                // of the coordinate system.

                double[] meanP = new double[3] {
                    0.0, 0.0, 0.0
                };                                                // mean of first point set
                for (int i = 0; i < FInputP.SliceCount; i++)
                {
                    meanP[0] += FInputP[i].x;
                    meanP[1] += FInputP[i].y;
                    meanP[2] += FInputP[i].z;
                }
                meanP[0] /= FInputP.SliceCount;
                meanP[1] /= FInputP.SliceCount;
                meanP[2] /= FInputP.SliceCount;
                double[][]    centroidP  = new double[3][] { new double[] { meanP[0] }, new double[] { meanP[1] }, new double[] { meanP[2] } };
                GeneralMatrix mCentroidP = new GeneralMatrix(centroidP);

                double[][] arrayP = new double[FInputP.SliceCount][];
                for (int i = 0; i < FInputP.SliceCount; i++)
                {
                    arrayP[i]    = new double[3];
                    arrayP[i][0] = FInputP[i].x - meanP[0]; // subtract the mean values from the incoming pointset
                    arrayP[i][1] = FInputP[i].y - meanP[1];
                    arrayP[i][2] = FInputP[i].z - meanP[2];
                }
                // this is the matrix of the first pointset translated to the origin of the coordinate system
                GeneralMatrix P = new GeneralMatrix(arrayP);

                double[] meanQ = new double[3] {
                    0.0, 0.0, 0.0
                };                                                // mean of second point set
                for (int i = 0; i < FInputQ.SliceCount; i++)
                {
                    meanQ[0] += FInputQ[i].x;
                    meanQ[1] += FInputQ[i].y;
                    meanQ[2] += FInputQ[i].z;
                }
                meanQ[0] /= FInputQ.SliceCount;
                meanQ[1] /= FInputQ.SliceCount;
                meanQ[2] /= FInputQ.SliceCount;
                double[][]    centroidQ  = new double[3][] { new double[] { meanQ[0] }, new double[] { meanQ[1] }, new double[] { meanQ[2] } };
                GeneralMatrix mCentroidQ = new GeneralMatrix(centroidQ);

                double[][] arrayQ = new double[FInputQ.SliceCount][];
                for (int i = 0; i < FInputQ.SliceCount; i++)
                {
                    arrayQ[i]    = new double[3];
                    arrayQ[i][0] = FInputQ[i].x - meanQ[0]; // subtract the mean values from the incoming pointset
                    arrayQ[i][1] = FInputQ[i].y - meanQ[1];
                    arrayQ[i][2] = FInputQ[i].z - meanQ[2];
                }
                // this is the matrix of the second pointset translated to the origin of the coordinate system
                GeneralMatrix Q = new GeneralMatrix(arrayQ);


                // ======================== STEP2 ========================
                // calculate a covariance matrix A and compute the optimal rotation matrix
                GeneralMatrix A = P.Transpose() * Q;

                SingularValueDecomposition svd = A.SVD();
                GeneralMatrix U = svd.GetU();
                GeneralMatrix V = svd.GetV();

                // calculate determinant for a special reflexion case.
                double     det    = (V * U.Transpose()).Determinant();
                double[][] arrayD = new double[3][] { new double[] { 1, 0, 0 },
                                                      new double[] { 0, 1, 0 },
                                                      new double[] { 0, 0, 1 } };
                arrayD[2][2] = det < 0 ? -1 : 1; // multiply 3rd column with -1 if determinant is < 0
                GeneralMatrix D = new GeneralMatrix(arrayD);

                // now we can compute the rotation matrix:
                GeneralMatrix R = V * D * U.Transpose();

                // ======================== STEP3 ========================
                // calculate the translation:
                GeneralMatrix T = mCentroidP - R.Inverse() * mCentroidQ;

                // ================== OUTPUT TRANSFORM ===================

                mOut.m11   = (R.Array)[0][0];
                mOut.m12   = (R.Array)[0][1];
                mOut.m13   = (R.Array)[0][2];
                mOut.m14   = 0;
                mOut.m21   = (R.Array)[1][0];
                mOut.m22   = (R.Array)[1][1];
                mOut.m23   = (R.Array)[1][2];
                mOut.m24   = 0;
                mOut.m31   = (R.Array)[2][0];
                mOut.m32   = (R.Array)[2][1];
                mOut.m33   = (R.Array)[2][2];
                mOut.m34   = 0;
                mOut.m41   = (T.Array)[0][0];
                mOut.m42   = (T.Array)[1][0];
                mOut.m43   = (T.Array)[2][0];
                mOut.m44   = 1;
                FOutput[0] = mOut;
            }


            //FLogger.Log(LogType.Debug, T.Array[2][0].ToString());
        }
コード例 #17
0
 private void calculateCCMInverse()
 {
     this.ccmInverse = ccm.Inverse();
 }
コード例 #18
0
        private void updateWeightsSize()
        {
            this.weights = new GeneralMatrix(this.classes.Count, this.classes[0].CovarianceMatrix.RowDimension, 0.0);

            this.weights_0 = new List <double>(this.classes.Count);
        }
コード例 #19
0
ファイル: TransformMatrix.cs プロジェクト: tsgouros/wv
 public void setTranslation(GeneralMatrix gm)
 {
     setTranslation(gm.Array[0]);
 }
コード例 #20
0
ファイル: QRDecomposition.cs プロジェクト: lzhm216/coordtrans
        /// <summary>Least squares solution of A*X = B</summary>
        /// <param name="B">   A Matrix with as many rows as A and any number of columns.
        /// </param>
        /// <returns>     X that minimizes the two norm of Q*R*X-B.
        /// </returns>
        /// <exception cref="System.ArgumentException"> Matrix row dimensions must agree.
        /// </exception>
        /// <exception cref="System.SystemException"> Matrix is rank deficient.
        /// </exception>
        public virtual GeneralMatrix Solve(GeneralMatrix B)
        {
            if (B.RowDimension != m)
            {
                throw new System.ArgumentException("GeneralMatrix row dimensions must agree.");
            }
            if (!this.FullRank)
            {
                throw new System.SystemException("Matrix is rank deficient.");
            }

            // Copy right hand side
            int nx = B.ColumnDimension;
            double[][] X = B.ArrayCopy;

            // Compute Y = transpose(Q)*B
            for (int k = 0; k < n; k++)
            {
                for (int j = 0; j < nx; j++)
                {
                    double s = 0.0;
                    for (int i = k; i < m; i++)
                    {
                        s += QR[i][k] * X[i][j];
                    }
                    s = (- s) / QR[k][k];
                    for (int i = k; i < m; i++)
                    {
                        X[i][j] += s * QR[i][k];
                    }
                }
            }
            // Solve R*X = Y;
            for (int k = n - 1; k >= 0; k--)
            {
                for (int j = 0; j < nx; j++)
                {
                    X[k][j] /= Rdiag[k];
                }
                for (int i = 0; i < k; i++)
                {
                    for (int j = 0; j < nx; j++)
                    {
                        X[i][j] -= X[k][j] * QR[i][k];
                    }
                }
            }

            return (new GeneralMatrix(X, n, nx).GetMatrix(0, n - 1, 0, nx - 1));
        }
コード例 #21
0
        private void FrmProcessLoad(object sender, EventArgs e)
        {
            //insertLog("\nENTER FUNC()=> private void FrmProcess_Load(...)");
            //_____START CALCULATING AHP
            log.Clear();
            log.Text += "[START] Kalkulasi Kriteria...";

            if (CalculatePcmCriteria())
            {
                InsertLog("[OK] Nilai Consistency Ratio dapat diterima\n");
            }
            else
            {
                InsertLog("[ERROR] Nilai Consistency Ratio tidak dapat diterima\n" +
                          "Proses tidak dapat dilanjutkan");
                // ReSharper disable RedundantJumpStatement
                return;
                // ReSharper restore RedundantJumpStatement
            }

            InsertLog("\n[START] Kalkulasi kandidat...");

            var dt = _dbConnect.GetRecord(string.Format("SELECT kode,nama " +
                                                        "FROM tbl_kriteria " +
                                                        "WHERE aktif='{0}' " +
                                                        "ORDER BY kode", "True"));

            int countCandidate = _dbConnect.intExecuteScalar("SELECT COUNT(*) " +
                                                             "FROM tbl_anggota");

            //inisialisasi AHP model
            AHPModel model = new AHPModel(dt.Rows.Count, countCandidate);

            //add kriteria
            model.AddCriteria(_criteria);


            //untuk masing-masing kriteria..
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                int kodeKriteria = int.Parse(dt.Rows[i][0].ToString());

                var dtA = _dbConnect.GetRecord(string.Format("SELECT kode_kriteria_item " +
                                                             "FROM tbl_anggota_kriteria_items " +
                                                             "WHERE kode_kriteria={0} " +
                                                             "ORDER BY kode_anggota", kodeKriteria));

                double[][] arrayKandidatBobot = new double[dtA.Rows.Count][];
                //kalkulasikan nilai dari matrix kriteria anggota
                for (int k = 0; k < dtA.Rows.Count; k++)
                {
                    arrayKandidatBobot[k] = new double[dtA.Rows.Count];
                    int kodeA = int.Parse(dtA.Rows[k][0].ToString());

                    for (int l = 0; l < dtA.Rows.Count; l++)
                    {
                        if (k == l)
                        {
                            //nilai = 1
                            arrayKandidatBobot[k][l] = 1;
                        }
                        else if (k > l)
                        {
                            //nilai 0
                            arrayKandidatBobot[k][l] = 0;
                        }
                        else
                        {
                            int kodeB = int.Parse(dtA.Rows[l][0].ToString());
                            arrayKandidatBobot[k][l] = GetNilaiKriteriaItem(kodeA, kodeB);
                        }
                    }
                }


                if (dtA.Rows.Count <= 2)
                {
                    InsertLog("Kandidat <= dari 2, maka tidak perlu dilakukan pengecekan Consistency Index(CI)");
                }
                else
                {
                    //periksa apakah Pair Comparation matrix untuk kriteria ini punya CI <= CI_acceptableValue ?
                    if (CalculatePcm(arrayKandidatBobot))
                    {
                        InsertLog(string.Format("[OK] Nilai Consistency Ratio untuk {0} dapat diterima\n", dt.Rows[i][1]));
                    }
                    else
                    {
                        InsertLog("[ERROR] Nilai Consistency Ratio tidak dapat diterima\n" +
                                  "Proses tidak dapat dilanjutkan");
                        // ReSharper disable RedundantJumpStatement
                        return;
                        // ReSharper restore RedundantJumpStatement
                    }
                }

                model.AddCriterionRatedChoices(i, arrayKandidatBobot);
            }

            model.CalculateModel();
            GeneralMatrix calcCriteria = model.CalculatedCriteria;
            GeneralMatrix results      = model.ModelResult;
            GeneralMatrix choices      = model.CalculatedChoices;

            //choices: SF 42%, Orlando31%, NY 27%
            //Assert.AreEqual(31, System.Math.Round(choices.GetElement(0, 0) * 100, 0));
            //Assert.AreEqual(42, System.Math.Round(choices.GetElement(1, 0) * 100, 0));
            //Assert.AreEqual(27, System.Math.Round(choices.GetElement(2, 0) * 100, 0));

            //clear all rows on gridview
            dtGridView.Columns.Clear();
            var dgvColumnKriteria = new DataGridViewTextBoxColumn
            {
                HeaderText = "Kriteria",
                Name       = "kriteria",
                SortMode   = DataGridViewColumnSortMode.NotSortable
            };
            int colKriteria = dtGridView.Columns.Add(dgvColumnKriteria);

            dtGridView.Columns[colKriteria].Frozen = true;

            var dgvColumnWeight = new DataGridViewTextBoxColumn
            {
                HeaderText = "Berat",
                Name       = "Weight",
                SortMode   = DataGridViewColumnSortMode.NotSortable
            };

            dtGridView.Columns.Add(dgvColumnWeight);

            //            calcCriteria : weight cantik -> kaya
            //            result : choise yayu (cantik -> kaya)
            //                     grace (cantik -> kaya)
            //                     fitri (cantik -> kaya)
            //            choices :Composite Weight (Yayu ->Fitri)

            //insert candidate name


            var dtKandidat = _dbConnect.GetRecord("SELECT nama " +
                                                  "FROM tbl_anggota " +
                                                  "ORDER BY kode");

            for (int a = 0; a < dtKandidat.Rows.Count; a++)
            {
                var dgvColumn = new DataGridViewTextBoxColumn
                {
                    HeaderText = dtKandidat.Rows[a][0].ToString(),
                    Name       = string.Format("kandidat-{0}", a),
                    SortMode   = DataGridViewColumnSortMode.NotSortable
                };
                dtGridView.Columns.Add(dgvColumn);
            }

            var dtKriteria = _dbConnect.GetRecord("SELECT nama " +
                                                  "FROM tbl_kriteria " +
                                                  "ORDER BY kode");

            //string[] chartSeriesArray = new string[dtKriteria.Rows.Count];


            chart1.Series.Clear();
            chart1.ChartAreas[0].BackColor          = Color.LightBlue;
            chart1.ChartAreas[0].BackSecondaryColor = Color.White;
            chart1.ChartAreas[0].BackGradientStyle  = GradientStyle.TopBottom;
            chart1.ChartAreas[0].BorderColor        = Color.Black;
            chart1.ChartAreas[0].BorderDashStyle    = ChartDashStyle.Solid;
            chart1.ChartAreas[0].BorderWidth        = 1;
            chart1.ChartAreas[0].ShadowOffset       = 4;
            //chart1.ChartAreas[0].Area3DStyle.Enable3D = true;
            //chart1.ChartAreas[0].Area3DStyle.Inclination = 90;
            //chart1.ChartAreas[0].Area3DStyle.Rotation = 45;
            chart1.ChartAreas[0].Area3DStyle.LightStyle = LightStyle.Simplistic;

            chart1.Legends[0].BackColor          = Color.LightBlue;
            chart1.Legends[0].BackSecondaryColor = Color.White;
            chart1.Legends[0].BackGradientStyle  = GradientStyle.DiagonalLeft;
            chart1.Legends[0].BorderColor        = Color.Black;
            chart1.Legends[0].BorderWidth        = 1;
            chart1.Legends[0].BorderDashStyle    = ChartDashStyle.Solid;

            chart1.Legends[0].ShadowOffset = 2;

            for (int i = 0; i < dtKriteria.Rows.Count; i++)
            {
                //add new ros
                dtGridView.Rows.Add(1);
                dtGridView[0, i].Value = dtKriteria.Rows[i][0].ToString();

                string seriesName = dtKriteria.Rows[i][0].ToString();
                this.chart1.Series.Add(seriesName);
                //gunakan ini untuk swith axis -> chart1.Series[seriesName].ChartType = SeriesChartType.Bar;
                chart1.Series[seriesName].ChartType    = SeriesChartType.Column;
                chart1.Series[seriesName].BorderWidth  = 0;
                chart1.Series[seriesName].ShadowOffset = 3;

                dtGridView[1, i].Value = System.Math.Round(calcCriteria.GetElement(i, 0), 4);

                for (int j = 0; j < dtKandidat.Rows.Count; j++)
                {
                    double val = results.GetElement(j, i);
                    dtGridView[j + 2, i].Value = System.Math.Round(val, 4);

                    string kandidateName = dtKandidat.Rows[j][0].ToString();
                    chart1.Series[seriesName].Points.AddXY(kandidateName, val);
                }
            }

            //composite weight
            dtGridView.Rows.Add(1);
            dtGridView[0, dtGridView.Rows.Count - 1].Value = "Composite Weight";
            for (int b = 0; b < dtKandidat.Rows.Count; b++)
            {
                dtGridView[b + 2, dtGridView.Rows.Count - 1].Value = string.Format("{0}", System.Math.Round(choices.GetElement(b, 0), 3), System.Math.Round(choices.GetElement(b, 0) * 100, 0));
            }
        }
コード例 #22
0
 public void MatricesAdditionDifferentAddendsSizesTest()
 {
     GeneralMatrix<int> matrix1 = new GeneralMatrix<int>(new int[3, 4] { { 1, 2, 3, 4 }, { 2, 1, 2, 4 }, { 3, 2, 1, 4 } });
     GeneralMatrix<int> matrix2 = new GeneralMatrix<int>(new int[3, 3] { { 1, 2, 3 }, { 2, 1, 2 }, { 3, 2, 1 } });
     matrix1.SumWith(matrix2, AdditionMethod);
 }
コード例 #23
0
 public void AddCriteria(GeneralMatrix matrix)
 {
     _criteria = ExpandUtility(matrix);
 }
コード例 #24
0
        /// <summary>
        /// QR�ֽⷨ
        /// </summary>
        /// <param name="st7"></param>
        public void CalculateTrans7Param3(List<Coords7ST> st7)
        {
            double[][] A = new double[0][];
            double[][] B = new double[0][];

            InitMatrixAB(ref A, ref B, st7);

            GeneralMatrix matrixA = new GeneralMatrix(A);
            GeneralMatrix matrixB = new GeneralMatrix(B);

            QRDecomposition qrDecp = matrixA.QRD();
            GeneralMatrix q = qrDecp.Q;
            GeneralMatrix r = qrDecp.R;

            GeneralMatrix matrixParam = r.Inverse().Multiply(q.Transpose()).Multiply(matrixB);

            this.Set4Param(matrixParam.GetElement(0, 0), matrixParam.GetElement(1, 0), matrixParam.GetElement(2, 0), matrixParam.GetElement(6, 0));
            this.SetRotationParam(matrixParam.GetElement(3, 0), matrixParam.GetElement(4, 0), matrixParam.GetElement(5, 0));
        }
コード例 #25
0
        public void AddCriteria(double[][] matrix)
        {
            GeneralMatrix newMatrix = new GeneralMatrix(matrix);

            AddCriteria(newMatrix);
        }
コード例 #26
0
 /// <summary>
 /// Creating a new document using the specified map, route, laps, initial transformation matrix and document settings, and adding one new session with the specified route and laps.
 /// </summary>
 /// <param name="map"></param>
 /// <param name="route"></param>
 /// <param name="laps"></param>
 /// <param name="initialTransformationMatrix"></param>
 /// <param name="settings"></param>
 public Document(Map map, Route route, LapCollection laps, GeneralMatrix initialTransformationMatrix, DocumentSettings settings)
     : this(map, route, laps, initialTransformationMatrix, null, settings)
 {
 }
コード例 #27
0
        public void AddCriterionRatedChoices(int criterionId, double[][] matrix)
        {
            GeneralMatrix gMatrix = new GeneralMatrix(matrix);

            AddCriterionRatedChoices(criterionId, gMatrix);
        }
コード例 #28
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="p0">First point on route</param>
        /// <param name="q0">First point on map</param>
        /// <param name="p1">Second point on route</param>
        /// <param name="q1">Second point on map</param>
        /// <param name="p2">Third point on route</param>
        /// <param name="q2">Third point on map</param>
        /// <param name="fallbackMatrix">Matrix to use if calculation fails due to singular matrix</param>
        /// <returns></returns>
        public static GeneralMatrix CalculateTransformationMatrix(PointD p0, PointD q0, PointD p1, PointD q1, PointD p2, PointD q2, GeneralMatrix fallbackMatrix)
        {
            try
            {
                var m = new GeneralMatrix(3, 3);
                m.SetElement(0, 0, p0.X);
                m.SetElement(0, 1, p0.Y);
                m.SetElement(0, 2, 1.0);
                m.SetElement(1, 0, p1.X);
                m.SetElement(1, 1, p1.Y);
                m.SetElement(1, 2, 1.0);
                m.SetElement(2, 0, p2.X);
                m.SetElement(2, 1, p2.Y);
                m.SetElement(2, 2, 1.0);

                var v1 = new GeneralMatrix(3, 1);
                v1.SetElement(0, 0, q0.X);
                v1.SetElement(1, 0, q1.X);
                v1.SetElement(2, 0, q2.X);
                var t1 = m.Inverse() * v1;

                var v2 = new GeneralMatrix(3, 1);
                v2.SetElement(0, 0, q0.Y);
                v2.SetElement(1, 0, q1.Y);
                v2.SetElement(2, 0, q2.Y);
                var t2 = m.Inverse() * v2;

                var v3 = new GeneralMatrix(3, 1);
                v3.SetElement(0, 0, 1.0);
                v3.SetElement(1, 0, 1.0);
                v3.SetElement(2, 0, 1.0);
                var t3 = m.Inverse() * v3;

                var t = new GeneralMatrix(3, 3);
                t.SetElement(0, 0, t1.GetElement(0, 0));
                t.SetElement(0, 1, t1.GetElement(1, 0));
                t.SetElement(0, 2, t1.GetElement(2, 0));
                t.SetElement(1, 0, t2.GetElement(0, 0));
                t.SetElement(1, 1, t2.GetElement(1, 0));
                t.SetElement(1, 2, t2.GetElement(2, 0));
                t.SetElement(2, 0, t3.GetElement(0, 0));
                t.SetElement(2, 1, t3.GetElement(1, 0));
                t.SetElement(2, 2, t3.GetElement(2, 0));

                return(t);
            }
            catch (Exception)
            {
                return((GeneralMatrix)fallbackMatrix.Clone());
            }
        }
コード例 #29
0
        private void computeaccCalButton_Click(object sender, EventArgs e)
        {
            int i, j;

            calStatusText.Text = "Computing Calibration...";

            // Construct D matrix
            // D = [x.^2, y.^2, z.^2, x.*y, x.*z, y.*z, x, y, z, ones(N,1)];
            for (i = 0; i < SAMPLES; i++)
            {
                // x^2 term
                D.SetElement(i, 0, loggedData[i, 0] * loggedData[i, 0]);

                // y^2 term
                D.SetElement(i, 1, loggedData[i, 1] * loggedData[i, 1]);

                // z^2 term
                D.SetElement(i, 2, loggedData[i, 2] * loggedData[i, 2]);

                // x*y term
                D.SetElement(i, 3, loggedData[i, 0] * loggedData[i, 1]);

                // x*z term
                D.SetElement(i, 4, loggedData[i, 0] * loggedData[i, 2]);

                // y*z term
                D.SetElement(i, 5, loggedData[i, 1] * loggedData[i, 2]);

                // x term
                D.SetElement(i, 6, loggedData[i, 0]);

                // y term
                D.SetElement(i, 7, loggedData[i, 1]);

                // z term
                D.SetElement(i, 8, loggedData[i, 2]);

                // Constant term
                D.SetElement(i, 9, 1);
            }

            // QR=triu(qr(D))
            QRDecomposition QR = new QRDecomposition(D);
            // [U,S,V] = svd(D)
            SingularValueDecomposition SVD = new SingularValueDecomposition(QR.R);
            GeneralMatrix V = SVD.GetV();

            GeneralMatrix A = new GeneralMatrix(3, 3);

            double[] p = new double[V.RowDimension];

            for (i = 0; i < V.RowDimension; i++)
            {
                p[i] = V.GetElement(i, V.ColumnDimension - 1);
            }

            /*
             * A = [p(1) p(4)/2 p(5)/2;
             * p(4)/2 p(2) p(6)/2;
             * p(5)/2 p(6)/2 p(3)];
             */

            if (p[0] < 0)
            {
                for (i = 0; i < V.RowDimension; i++)
                {
                    p[i] = -p[i];
                }
            }

            A.SetElement(0, 0, p[0]);
            A.SetElement(0, 1, p[3] / 2);
            A.SetElement(1, 2, p[4] / 2);

            A.SetElement(1, 0, p[3] / 2);
            A.SetElement(1, 1, p[1]);
            A.SetElement(1, 2, p[5] / 2);

            A.SetElement(2, 0, p[4] / 2);
            A.SetElement(2, 1, p[5] / 2);
            A.SetElement(2, 2, p[2]);

            CholeskyDecomposition Chol = new CholeskyDecomposition(A);
            GeneralMatrix         Ut   = Chol.GetL();
            GeneralMatrix         U    = Ut.Transpose();

            double[]      bvect = { p[6] / 2, p[7] / 2, p[8] / 2 };
            double        d     = p[9];
            GeneralMatrix b     = new GeneralMatrix(bvect, 3);

            GeneralMatrix v = Ut.Solve(b);

            double vnorm_sqrd = v.GetElement(0, 0) * v.GetElement(0, 0) + v.GetElement(1, 0) * v.GetElement(1, 0) + v.GetElement(2, 0) * v.GetElement(2, 0);
            double s          = 1 / Math.Sqrt(vnorm_sqrd - d);

            GeneralMatrix c = U.Solve(v);

            for (i = 0; i < 3; i++)
            {
                c.SetElement(i, 0, -c.GetElement(i, 0));
            }

            U = U.Multiply(s);

            for (i = 0; i < 3; i++)
            {
                for (j = 0; j < 3; j++)
                {
                    calMat[i, j] = U.GetElement(i, j);
                }
            }

            for (i = 0; i < 3; i++)
            {
                bias[i] = c.GetElement(i, 0);
            }

            accAlignment00.Text = calMat[0, 0].ToString();
            accAlignment01.Text = calMat[0, 1].ToString();
            accAlignment02.Text = calMat[0, 2].ToString();

            accAlignment10.Text = calMat[1, 0].ToString();
            accAlignment11.Text = calMat[1, 1].ToString();
            accAlignment12.Text = calMat[1, 2].ToString();

            accAlignment20.Text = calMat[2, 0].ToString();
            accAlignment21.Text = calMat[2, 1].ToString();
            accAlignment22.Text = calMat[2, 2].ToString();

            biasX.Text = bias[0].ToString();
            biasY.Text = bias[1].ToString();
            biasZ.Text = bias[2].ToString();

            calStatusText.Text               = "Done";
            flashCommitButton.Enabled        = true;
            accAlignmentCommitButton.Enabled = true;
        }
コード例 #30
0
 public static PointF ToPointF(GeneralMatrix _3x1Matrix)
 {
     return(new PointF((float)_3x1Matrix.GetElement(0, 0), (float)_3x1Matrix.GetElement(1, 0)));
 }
コード例 #31
0
 public CoordinateMapping()
 {
     m_transform = GeneralMatrix.Identity(3, 3);
 }
コード例 #32
0
 public static PointD Transform(PointD p, GeneralMatrix transformationMatrix)
 {
     return(ConvertUtil.ToPointD(transformationMatrix * ConvertUtil.To3x1Matrix(p)));
 }
コード例 #33
0
 public void Clear()
 {
     m_transform = GeneralMatrix.Identity(3, 3);
 }
コード例 #34
0
ファイル: TransformMatrix.cs プロジェクト: tsgouros/wv
 public TransformMatrix(GeneralMatrix gm) : base(4, 4)
 {
     this.SetMatrix(gm);
 }
コード例 #35
0
        /// <summary>Solve A*X = B</summary>
        /// <param name="B">  A Matrix with as many rows as A and any number of columns.
        /// </param>
        /// <returns>     X so that L*L'*X = B
        /// </returns>
        /// <exception cref="System.ArgumentException">  Matrix row dimensions must agree.
        /// </exception>
        /// <exception cref="System.SystemException"> Matrix is not symmetric positive definite.
        /// </exception>
        public virtual GeneralMatrix Solve(GeneralMatrix B)
        {
            if (B.RowDimension != n)
            {
                throw new System.ArgumentException("Matrix row dimensions must agree.");
            }
            if (!isspd)
            {
                throw new System.SystemException("Matrix is not symmetric positive definite.");
            }

            // Copy right hand side.
            double[][] X = B.ArrayCopy;
            int nx = B.ColumnDimension;

            // Solve L*Y = B;
            for (int k = 0; k < n; k++)
            {
                for (int i = k + 1; i < n; i++)
                {
                    for (int j = 0; j < nx; j++)
                    {
                        X[i][j] -= X[k][j] * L[i][k];
                    }
                }
                for (int j = 0; j < nx; j++)
                {
                    X[k][j] /= L[k][k];
                }
            }

            // Solve L'*X = Y;
            for (int k = n - 1; k >= 0; k--)
            {
                for (int j = 0; j < nx; j++)
                {
                    X[k][j] /= L[k][k];
                }
                for (int i = 0; i < k; i++)
                {
                    for (int j = 0; j < nx; j++)
                    {
                        X[i][j] -= X[k][j] * L[k][i];
                    }
                }
            }
            return new GeneralMatrix(X, n, nx);
        }
コード例 #36
0
        /// <summary>
        /// multiply normalized priority matrix by sum of average rows
        /// </summary>
        /// <param name="argMatrix"></param>
        /// <param name="selection"></param>
        /// <returns></returns>
        private GeneralMatrix FCalc(GeneralMatrix argMatrix, GeneralMatrix selection)
        {
            GeneralMatrix matrix = argMatrix.Multiply(selection);

            return(matrix.ArrayRightDivide(selection));
        }
コード例 #37
0
 public void GeneralMatrixSetterTest()
 {
     GeneralMatrix<int> matrix = new GeneralMatrix<int>(new int[3, 4] { { 1, 2, 3, 4 }, { 2, 1, 2, 4 }, { 3, 2, 1, 4 } });
     matrix[0, 3] = 5;
     matrix[1, 1] = 10;
     Assert.AreEqual<int>(5, matrix[0, 3]);
     Assert.AreEqual<int>(10, matrix[1, 1]);
 }
コード例 #38
0
        private byte[] CreateSessionData(Session session)
        {
            var sessionStream = new MemoryStream();
            var sessionWriter = new BinaryWriter(sessionStream);
            // route
            var routeStream = new MemoryStream();
            var routeWriter = new BinaryWriter(routeStream);

            // which attributes to include for each waypoint
            var attributes = WaypointAttribute.Position | WaypointAttribute.Time;

            if (session.Route.ContainsWaypointAttribute(BusinessEntities.WaypointAttribute.HeartRate))
            {
                attributes |= WaypointAttribute.HeartRate;
            }
            if (session.Route.ContainsWaypointAttribute(BusinessEntities.WaypointAttribute.Altitude))
            {
                attributes |= WaypointAttribute.Altitude;
            }
            routeWriter.Write((UInt16)attributes);
            // any extra length in bytes for future elements for each waypoint
            routeWriter.Write((UInt16)0);
            // number of route segments in this route
            routeWriter.Write((UInt32)session.Route.Segments.Count);

            foreach (var routeSegment in session.Route.Segments)
            {
                // number of waypoints in this route segment
                routeWriter.Write((UInt32)routeSegment.Waypoints.Count);
                var lastTime = DateTime.MinValue;
                foreach (var waypoint in routeSegment.Waypoints)
                {
                    // position: 8 bytes
                    WriteLongLat(waypoint.LongLat, routeWriter);
                    // time and tome type: 1 + 2-8 bytes
                    WriteTimeTypeAndTime(waypoint.Time, lastTime, routeWriter);
                    lastTime = waypoint.Time;
                    // heart rate: 1 byte
                    if ((((UInt16)attributes) & ((UInt16)WaypointAttribute.HeartRate)) == (UInt16)WaypointAttribute.HeartRate)
                    {
                        routeWriter.Write((byte)(waypoint.HeartRate.HasValue ? Math.Min(Math.Max(waypoint.HeartRate.Value, byte.MinValue), byte.MaxValue) : byte.MinValue));
                    }
                    // altitude: 2 bytes
                    if ((((UInt16)attributes) & ((UInt16)WaypointAttribute.Altitude)) == (UInt16)WaypointAttribute.Altitude)
                    {
                        routeWriter.Write((Int16)(waypoint.Altitude.HasValue ? Math.Min(Math.Max(waypoint.Altitude.Value, Int16.MinValue), Int16.MaxValue) : 0));
                    }
                }
            }
            sessionWriter.Write((byte)Tags.Route);
            sessionWriter.Write((UInt32)routeStream.Length);
            sessionWriter.Write(routeStream.ToArray());
            routeWriter.Close();
            routeStream.Close();
            routeStream.Dispose();

            // handles
            // TODO: adjust for zoom
            var handleStream = new MemoryStream();
            var handleWriter = new BinaryWriter(handleStream);

            handleWriter.Write((UInt32)session.Handles.Length);
            foreach (var handle in session.Handles)
            {
                // transformation matrix
                var scaleMatrix = new GeneralMatrix(new[] { PercentualSize, 0, 0, 0, PercentualSize, 0, 0, 0, 1 }, 3);
                var scaledTM    = scaleMatrix * handle.TransformationMatrix;
                for (var i = 0; i < 3; i++)
                {
                    for (var j = 0; j < 3; j++)
                    {
                        handleWriter.Write(scaledTM.GetElement(i, j));
                    }
                }
                // parameterized location
                handleWriter.Write((UInt32)handle.ParameterizedLocation.SegmentIndex);
                handleWriter.Write(handle.ParameterizedLocation.Value);
                // pixel location
                handleWriter.Write(PercentualSize * handle.Location.X);
                handleWriter.Write(PercentualSize * handle.Location.Y);
                // type
                handleWriter.Write((Int16)handle.Type);
            }
            sessionWriter.Write((byte)Tags.Handles);
            sessionWriter.Write((UInt32)handleStream.Length);
            sessionWriter.Write(handleStream.ToArray());
            handleWriter.Close();
            handleStream.Close();
            handleStream.Dispose();

            // projection origin
            sessionWriter.Write((byte)Tags.ProjectionOrigin);
            sessionWriter.Write((UInt32)8);
            WriteLongLat(session.ProjectionOrigin, sessionWriter);

            // laps
            var lapStream = new MemoryStream();
            var lapWriter = new BinaryWriter(lapStream);

            lapWriter.Write((UInt32)session.Laps.Count);
            foreach (var lap in session.Laps)
            {
                // time
                lapWriter.Write(lap.Time.ToUniversalTime().ToBinary());
                // type
                lapWriter.Write((byte)lap.LapType);
            }
            sessionWriter.Write((byte)Tags.Laps);
            sessionWriter.Write((UInt32)lapStream.Length);
            sessionWriter.Write(lapStream.ToArray());
            lapWriter.Close();
            lapStream.Close();
            lapStream.Dispose();

            // session info
            var sessionInfoStream = new MemoryStream();
            var sessionInfoWriter = new BinaryWriter(sessionInfoStream);

            // never change the order or remove field that has already been added!
            WriteString(session.SessionInfo.Person.Name, sessionInfoWriter);
            WriteString(session.SessionInfo.Person.Club, sessionInfoWriter);
            sessionInfoWriter.Write(session.SessionInfo.Person.Id);
            WriteString(session.SessionInfo.Description, sessionInfoWriter);

            sessionWriter.Write((byte)Tags.SessionInfo);
            sessionWriter.Write((UInt32)sessionInfoStream.Length);
            sessionWriter.Write(sessionInfoStream.ToArray());
            sessionInfoWriter.Close();
            sessionInfoStream.Close();
            sessionInfoStream.Dispose();

            // map reading info
            var mapReadingsList = session.Route.GetMapReadingsList();

            if (mapReadingsList != null)
            {
                var mapReadingInfoStream = new MemoryStream();
                var mapReadingInfoWriter = new BinaryWriter(mapReadingInfoStream);
                var lastTime             = DateTime.MinValue;
                foreach (var mapReading in mapReadingsList)
                {
                    WriteTimeTypeAndTime(mapReading, lastTime, mapReadingInfoWriter);
                }
                sessionWriter.Write((byte)Tags.MapReadingInfo);
                sessionWriter.Write((UInt32)mapReadingInfoStream.Length);
                sessionWriter.Write(mapReadingInfoStream.ToArray());
                mapReadingInfoWriter.Close();
                mapReadingInfoStream.Close();
                mapReadingInfoStream.Dispose();
            }

            var data = sessionStream.ToArray();

            sessionWriter.Close();
            sessionStream.Close();
            sessionStream.Dispose();
            return(data);
        }
コード例 #39
0
 public void MatricesAdditionCallingWithNullSecondAddendTest()
 {            
     GeneralMatrix<int> matrix1 = new GeneralMatrix<int>(new int[3, 4] { { 1, 2, 3, 4 }, { 2, 1, 2, 4 }, { 3, 2, 1, 4 } });
     GeneralMatrix<int> matrix2 = null;
     matrix1.SumWith(matrix2, AdditionMethod);
 }
コード例 #40
0
        /// <summary>Construct the singular value decomposition</summary>
        /// <param name="Arg">   Rectangular matrix
        /// </param>
        /// <returns>     Structure to access U, S and V.
        /// </returns>
        public SingularValueDecomposition(GeneralMatrix Arg)
        {
            // Derived from LINPACK code.
            // Initialize.
            double[][] A = Arg.ArrayCopy;
            m = Arg.RowDimension;
            n = Arg.ColumnDimension;
            int nu = System.Math.Min(m, n);
            s = new double[System.Math.Min(m + 1, n)];
            U = new double[m][];
            for (int i = 0; i < m; i++)
            {
                U[i] = new double[nu];
            }
            V = new double[n][];
            for (int i2 = 0; i2 < n; i2++)
            {
                V[i2] = new double[n];
            }
            double[] e = new double[n];
            double[] work = new double[m];
            bool wantu = true;
            bool wantv = true;

            // Reduce A to bidiagonal form, storing the diagonal elements
            // in s and the super-diagonal elements in e.

            int nct = System.Math.Min(m - 1, n);
            int nrt = System.Math.Max(0, System.Math.Min(n - 2, m));
            for (int k = 0; k < System.Math.Max(nct, nrt); k++)
            {
                if (k < nct)
                {

                    // Compute the transformation for the k-th column and
                    // place the k-th diagonal in s[k].
                    // Compute 2-norm of k-th column without under/overflow.
                    s[k] = 0;
                    for (int i = k; i < m; i++)
                    {
                        s[k] = Maths.Hypot(s[k], A[i][k]);
                    }
                    if (s[k] != 0.0)
                    {
                        if (A[k][k] < 0.0)
                        {
                            s[k] = - s[k];
                        }
                        for (int i = k; i < m; i++)
                        {
                            A[i][k] /= s[k];
                        }
                        A[k][k] += 1.0;
                    }
                    s[k] = - s[k];
                }
                for (int j = k + 1; j < n; j++)
                {
                    if ((k < nct) & (s[k] != 0.0))
                    {

                        // Apply the transformation.

                        double t = 0;
                        for (int i = k; i < m; i++)
                        {
                            t += A[i][k] * A[i][j];
                        }
                        t = (- t) / A[k][k];
                        for (int i = k; i < m; i++)
                        {
                            A[i][j] += t * A[i][k];
                        }
                    }

                    // Place the k-th row of A into e for the
                    // subsequent calculation of the row transformation.

                    e[j] = A[k][j];
                }
                if (wantu & (k < nct))
                {

                    // Place the transformation in U for subsequent back
                    // multiplication.

                    for (int i = k; i < m; i++)
                    {
                        U[i][k] = A[i][k];
                    }
                }
                if (k < nrt)
                {

                    // Compute the k-th row transformation and place the
                    // k-th super-diagonal in e[k].
                    // Compute 2-norm without under/overflow.
                    e[k] = 0;
                    for (int i = k + 1; i < n; i++)
                    {
                        e[k] = Maths.Hypot(e[k], e[i]);
                    }
                    if (e[k] != 0.0)
                    {
                        if (e[k + 1] < 0.0)
                        {
                            e[k] = - e[k];
                        }
                        for (int i = k + 1; i < n; i++)
                        {
                            e[i] /= e[k];
                        }
                        e[k + 1] += 1.0;
                    }
                    e[k] = - e[k];
                    if ((k + 1 < m) & (e[k] != 0.0))
                    {

                        // Apply the transformation.

                        for (int i = k + 1; i < m; i++)
                        {
                            work[i] = 0.0;
                        }
                        for (int j = k + 1; j < n; j++)
                        {
                            for (int i = k + 1; i < m; i++)
                            {
                                work[i] += e[j] * A[i][j];
                            }
                        }
                        for (int j = k + 1; j < n; j++)
                        {
                            double t = (- e[j]) / e[k + 1];
                            for (int i = k + 1; i < m; i++)
                            {
                                A[i][j] += t * work[i];
                            }
                        }
                    }
                    if (wantv)
                    {

                        // Place the transformation in V for subsequent
                        // back multiplication.

                        for (int i = k + 1; i < n; i++)
                        {
                            V[i][k] = e[i];
                        }
                    }
                }
            }

            // Set up the final bidiagonal matrix or order p.

            int p = System.Math.Min(n, m + 1);
            if (nct < n)
            {
                s[nct] = A[nct][nct];
            }
            if (m < p)
            {
                s[p - 1] = 0.0;
            }
            if (nrt + 1 < p)
            {
                e[nrt] = A[nrt][p - 1];
            }
            e[p - 1] = 0.0;

            // If required, generate U.

            if (wantu)
            {
                for (int j = nct; j < nu; j++)
                {
                    for (int i = 0; i < m; i++)
                    {
                        U[i][j] = 0.0;
                    }
                    U[j][j] = 1.0;
                }
                for (int k = nct - 1; k >= 0; k--)
                {
                    if (s[k] != 0.0)
                    {
                        for (int j = k + 1; j < nu; j++)
                        {
                            double t = 0;
                            for (int i = k; i < m; i++)
                            {
                                t += U[i][k] * U[i][j];
                            }
                            t = (- t) / U[k][k];
                            for (int i = k; i < m; i++)
                            {
                                U[i][j] += t * U[i][k];
                            }
                        }
                        for (int i = k; i < m; i++)
                        {
                            U[i][k] = - U[i][k];
                        }
                        U[k][k] = 1.0 + U[k][k];
                        for (int i = 0; i < k - 1; i++)
                        {
                            U[i][k] = 0.0;
                        }
                    }
                    else
                    {
                        for (int i = 0; i < m; i++)
                        {
                            U[i][k] = 0.0;
                        }
                        U[k][k] = 1.0;
                    }
                }
            }

            // If required, generate V.

            if (wantv)
            {
                for (int k = n - 1; k >= 0; k--)
                {
                    if ((k < nrt) & (e[k] != 0.0))
                    {
                        for (int j = k + 1; j < nu; j++)
                        {
                            double t = 0;
                            for (int i = k + 1; i < n; i++)
                            {
                                t += V[i][k] * V[i][j];
                            }
                            t = (- t) / V[k + 1][k];
                            for (int i = k + 1; i < n; i++)
                            {
                                V[i][j] += t * V[i][k];
                            }
                        }
                    }
                    for (int i = 0; i < n; i++)
                    {
                        V[i][k] = 0.0;
                    }
                    V[k][k] = 1.0;
                }
            }

            // Main iteration loop for the singular values.

            int pp = p - 1;
            int iter = 0;
            double eps = System.Math.Pow(2.0, - 52.0);
            while (p > 0)
            {
                int k, kase;

                // Here is where a test for too many iterations would go.

                // This section of the program inspects for
                // negligible elements in the s and e arrays.  On
                // completion the variables kase and k are set as follows.

                // kase = 1     if s(p) and e[k-1] are negligible and k<p
                // kase = 2     if s(k) is negligible and k<p
                // kase = 3     if e[k-1] is negligible, k<p, and
                //              s(k), ..., s(p) are not negligible (qr step).
                // kase = 4     if e(p-1) is negligible (convergence).

                for (k = p - 2; k >= - 1; k--)
                {
                    if (k == - 1)
                    {
                        break;
                    }
                    if (System.Math.Abs(e[k]) <= eps * (System.Math.Abs(s[k]) + System.Math.Abs(s[k + 1])))
                    {
                        e[k] = 0.0;
                        break;
                    }
                }
                if (k == p - 2)
                {
                    kase = 4;
                }
                else
                {
                    int ks;
                    for (ks = p - 1; ks >= k; ks--)
                    {
                        if (ks == k)
                        {
                            break;
                        }
                        double t = (ks != p?System.Math.Abs(e[ks]):0.0) + (ks != k + 1?System.Math.Abs(e[ks - 1]):0.0);
                        if (System.Math.Abs(s[ks]) <= eps * t)
                        {
                            s[ks] = 0.0;
                            break;
                        }
                    }
                    if (ks == k)
                    {
                        kase = 3;
                    }
                    else if (ks == p - 1)
                    {
                        kase = 1;
                    }
                    else
                    {
                        kase = 2;
                        k = ks;
                    }
                }
                k++;

                // Perform the task indicated by kase.

                switch (kase)
                {

                    // Deflate negligible s(p).
                    case 1:
                    {
                        double f = e[p - 2];
                        e[p - 2] = 0.0;
                        for (int j = p - 2; j >= k; j--)
                        {
                            double t = Maths.Hypot(s[j], f);
                            double cs = s[j] / t;
                            double sn = f / t;
                            s[j] = t;
                            if (j != k)
                            {
                                f = (- sn) * e[j - 1];
                                e[j - 1] = cs * e[j - 1];
                            }
                            if (wantv)
                            {
                                for (int i = 0; i < n; i++)
                                {
                                    t = cs * V[i][j] + sn * V[i][p - 1];
                                    V[i][p - 1] = (- sn) * V[i][j] + cs * V[i][p - 1];
                                    V[i][j] = t;
                                }
                            }
                        }
                    }
                    break;

                    // Split at negligible s(k).

                    case 2:
                    {
                        double f = e[k - 1];
                        e[k - 1] = 0.0;
                        for (int j = k; j < p; j++)
                        {
                            double t = Maths.Hypot(s[j], f);
                            double cs = s[j] / t;
                            double sn = f / t;
                            s[j] = t;
                            f = (- sn) * e[j];
                            e[j] = cs * e[j];
                            if (wantu)
                            {
                                for (int i = 0; i < m; i++)
                                {
                                    t = cs * U[i][j] + sn * U[i][k - 1];
                                    U[i][k - 1] = (- sn) * U[i][j] + cs * U[i][k - 1];
                                    U[i][j] = t;
                                }
                            }
                        }
                    }
                    break;

                    // Perform one qr step.

                    case 3:
                    {
                        // Calculate the shift.

                        double scale = System.Math.Max(System.Math.Max(System.Math.Max(System.Math.Max(System.Math.Abs(s[p - 1]), System.Math.Abs(s[p - 2])), System.Math.Abs(e[p - 2])), System.Math.Abs(s[k])), System.Math.Abs(e[k]));
                        double sp = s[p - 1] / scale;
                        double spm1 = s[p - 2] / scale;
                        double epm1 = e[p - 2] / scale;
                        double sk = s[k] / scale;
                        double ek = e[k] / scale;
                        double b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2.0;
                        double c = (sp * epm1) * (sp * epm1);
                        double shift = 0.0;
                        if ((b != 0.0) | (c != 0.0))
                        {
                            shift = System.Math.Sqrt(b * b + c);
                            if (b < 0.0)
                            {
                                shift = - shift;
                            }
                            shift = c / (b + shift);
                        }
                        double f = (sk + sp) * (sk - sp) + shift;
                        double g = sk * ek;

                        // Chase zeros.

                        for (int j = k; j < p - 1; j++)
                        {
                            double t = Maths.Hypot(f, g);
                            double cs = f / t;
                            double sn = g / t;
                            if (j != k)
                            {
                                e[j - 1] = t;
                            }
                            f = cs * s[j] + sn * e[j];
                            e[j] = cs * e[j] - sn * s[j];
                            g = sn * s[j + 1];
                            s[j + 1] = cs * s[j + 1];
                            if (wantv)
                            {
                                for (int i = 0; i < n; i++)
                                {
                                    t = cs * V[i][j] + sn * V[i][j + 1];
                                    V[i][j + 1] = (- sn) * V[i][j] + cs * V[i][j + 1];
                                    V[i][j] = t;
                                }
                            }
                            t = Maths.Hypot(f, g);
                            cs = f / t;
                            sn = g / t;
                            s[j] = t;
                            f = cs * e[j] + sn * s[j + 1];
                            s[j + 1] = (- sn) * e[j] + cs * s[j + 1];
                            g = sn * e[j + 1];
                            e[j + 1] = cs * e[j + 1];
                            if (wantu && (j < m - 1))
                            {
                                for (int i = 0; i < m; i++)
                                {
                                    t = cs * U[i][j] + sn * U[i][j + 1];
                                    U[i][j + 1] = (- sn) * U[i][j] + cs * U[i][j + 1];
                                    U[i][j] = t;
                                }
                            }
                        }
                        e[p - 2] = f;
                        iter = iter + 1;
                    }
                    break;

                    // Convergence.

                    case 4:
                    {
                        // Make the singular values positive.

                        if (s[k] <= 0.0)
                        {
                            s[k] = (s[k] < 0.0?- s[k]:0.0);
                            if (wantv)
                            {
                                for (int i = 0; i <= pp; i++)
                                {
                                    V[i][k] = - V[i][k];
                                }
                            }
                        }

                        // Order the singular values.

                        while (k < pp)
                        {
                            if (s[k] >= s[k + 1])
                            {
                                break;
                            }
                            double t = s[k];
                            s[k] = s[k + 1];
                            s[k + 1] = t;
                            if (wantv && (k < n - 1))
                            {
                                for (int i = 0; i < n; i++)
                                {
                                    t = V[i][k + 1]; V[i][k + 1] = V[i][k]; V[i][k] = t;
                                }
                            }
                            if (wantu && (k < m - 1))
                            {
                                for (int i = 0; i < m; i++)
                                {
                                    t = U[i][k + 1]; U[i][k + 1] = U[i][k]; U[i][k] = t;
                                }
                            }
                            k++;
                        }
                        iter = 0;
                        p--;
                    }
                    break;
                }
            }
        }
コード例 #41
0
        /// <summary>
        /// 计算四参数
        /// </summary>
        /// <param name="st4"></param>
        public void CalculateTrans4Param(List<Coords4ST> st4)
        {
            int count = st4.Count;

            double[][] A = new double[count * 2][];
            for (int i = 0; i < count * 2; i++)
            {
                A[i] = new double[4];
            }

            double[][] B = new double[count * 2][];
            for (int i = 0; i < count * 2; i++)
            {
                B[i] = new double[1];
            }

            int idx = 0;
            for (int i = 0; i < count * 2; i = i + 2)
            {
                A[i][0] = 1; A[i][1] = 0; A[i][2] = st4[idx].SourceX; A[i][3] = -st4[idx].SourceY;
                A[i + 1][0] = 0; A[i + 1][1] = 1; A[i + 1][2] = st4[idx].SourceY; A[i + 1][3] = st4[idx].SourceX;

                B[i][0] = st4[idx].TargetX;
                B[i + 1][0] = st4[idx].TargetY;

                idx = idx + 1;
            }
            GeneralMatrix matrixA = new GeneralMatrix(A);
            GeneralMatrix matrixB = new GeneralMatrix(B);

            GeneralMatrix matrixParm = matrixA.Inverse().Multiply(matrixB);

            this.dx = matrixParm.GetElement(0, 0);
            this.dy = matrixParm.GetElement(1, 0);
            this.arf = Math.Atan(matrixParm.GetElement(3, 0) / matrixParm.GetElement(2, 0));
            this.k = matrixParm.GetElement(3, 0) / Math.Sin(this.arf);
        }
コード例 #42
0
 public void MatricesAdditionCallingOnNullReferenceTest()
 {
     GeneralMatrix<int> matrix1 = null;
     GeneralMatrix<int> matrix2 = new GeneralMatrix<int>(new int[3, 4] { { 1, 2, 3, 4 }, { 2, 1, 2, 4 }, { 3, 2, 1, 4 } });
     matrix1.SumWith(matrix2, AdditionMethod);
 }
コード例 #43
0
ファイル: LUDecomposition.cs プロジェクト: lzhm216/coordtrans
        /// <summary>Solve A*X = B</summary>
        /// <param name="B">  A Matrix with as many rows as A and any number of columns.
        /// </param>
        /// <returns>     X so that L*U*X = B(piv,:)
        /// </returns>
        /// <exception cref="System.ArgumentException"> Matrix row dimensions must agree.
        /// </exception>
        /// <exception cref="System.SystemException"> Matrix is singular.
        /// </exception>
        public virtual GeneralMatrix Solve(GeneralMatrix B)
        {
            if (B.RowDimension != m)
            {
                throw new System.ArgumentException("Matrix row dimensions must agree.");
            }
            if (!this.IsNonSingular)
            {
                throw new System.SystemException("Matrix is singular.");
            }

            // Copy right hand side with pivoting
            int nx = B.ColumnDimension;
            GeneralMatrix Xmat = B.GetMatrix(piv, 0, nx - 1);
            double[][] X = Xmat.Array;

            // Solve L*Y = B(piv,:)
            for (int k = 0; k < n; k++)
            {
                for (int i = k + 1; i < n; i++)
                {
                    for (int j = 0; j < nx; j++)
                    {
                        X[i][j] -= X[k][j] * LU[i][k];
                    }
                }
            }
            // Solve U*X = Y;
            for (int k = n - 1; k >= 0; k--)
            {
                for (int j = 0; j < nx; j++)
                {
                    X[k][j] /= LU[k][k];
                }
                for (int i = 0; i < k; i++)
                {
                    for (int j = 0; j < nx; j++)
                    {
                        X[i][j] -= X[k][j] * LU[i][k];
                    }
                }
            }
            return Xmat;
        }
コード例 #44
0
 public void MatricesAdditionCallingWithAdditionRuleTest()
 {
     GeneralMatrix<int> matrix1 = new GeneralMatrix<int>(new int[3, 4] { { 1, 2, 3, 4 }, { 2, 1, 2, 4 }, { 3, 2, 1, 4 } });
     GeneralMatrix<int> matrix2 = new GeneralMatrix<int>(new int[3, 4] { { 1, 2, 3, 4 }, { 2, 1, 2, 4 }, { 3, 2, 1, 4 } });
     matrix1.SumWith(matrix2, null);
 }
コード例 #45
0
ファイル: LUDecomposition.cs プロジェクト: lzhm216/coordtrans
        /// <summary>LU Decomposition</summary>
        /// <param name="A">  Rectangular matrix
        /// </param>
        /// <returns>     Structure to access L, U and piv.
        /// </returns>
        public LUDecomposition(GeneralMatrix A)
        {
            // Use a "left-looking", dot-product, Crout/Doolittle algorithm.

            LU = A.ArrayCopy;
            m = A.RowDimension;
            n = A.ColumnDimension;
            piv = new int[m];
            for (int i = 0; i < m; i++)
            {
                piv[i] = i;
            }
            pivsign = 1;
            double[] LUrowi;
            double[] LUcolj = new double[m];

            // Outer loop.

            for (int j = 0; j < n; j++)
            {

                // Make a copy of the j-th column to localize references.

                for (int i = 0; i < m; i++)
                {
                    LUcolj[i] = LU[i][j];
                }

                // Apply previous transformations.

                for (int i = 0; i < m; i++)
                {
                    LUrowi = LU[i];

                    // Most of the time is spent in the following dot product.

                    int kmax = System.Math.Min(i, j);
                    double s = 0.0;
                    for (int k = 0; k < kmax; k++)
                    {
                        s += LUrowi[k] * LUcolj[k];
                    }

                    LUrowi[j] = LUcolj[i] -= s;
                }

                // Find pivot and exchange if necessary.

                int p = j;
                for (int i = j + 1; i < m; i++)
                {
                    if (System.Math.Abs(LUcolj[i]) > System.Math.Abs(LUcolj[p]))
                    {
                        p = i;
                    }
                }
                if (p != j)
                {
                    for (int k = 0; k < n; k++)
                    {
                        double t = LU[p][k]; LU[p][k] = LU[j][k]; LU[j][k] = t;
                    }
                    int k2 = piv[p]; piv[p] = piv[j]; piv[j] = k2;
                    pivsign = - pivsign;
                }

                // Compute multipliers.

                if (j < m & LU[j][j] != 0.0)
                {
                    for (int i = j + 1; i < m; i++)
                    {
                        LU[i][j] /= LU[j][j];
                    }
                }
            }
        }
コード例 #46
0
        public void GeneralMatrixAdditionTest()
        {
            GeneralMatrix<int> matrix1 = new GeneralMatrix<int>(new int[3, 4] { { 1, 2, 3, 4 }, { 2, 1, 2, 4 }, { 3, 2, 1, 4 } });
            GeneralMatrix<int> matrix2 = new GeneralMatrix<int>(new int[3, 4] { { 1, 2, 3, 4 }, { 2, 1, 2, 4 }, { 3, 2, 1, 4 } });
            matrix1.SumWith(matrix2, AdditionMethod);

            Assert.AreEqual<int>(2, matrix1[0, 0]);
            Assert.AreEqual<int>(4, matrix1[0, 1]);
            Assert.AreEqual<int>(6, matrix1[0, 2]);
            Assert.AreEqual<int>(8, matrix1[0, 3]);
            Assert.AreEqual<int>(4, matrix1[1, 0]);
            Assert.AreEqual<int>(2, matrix1[1, 1]);
            Assert.AreEqual<int>(4, matrix1[1, 2]);
            Assert.AreEqual<int>(8, matrix1[1, 3]);
            Assert.AreEqual<int>(6, matrix1[2, 0]);
            Assert.AreEqual<int>(4, matrix1[2, 1]);
            Assert.AreEqual<int>(2, matrix1[2, 2]);
            Assert.AreEqual<int>(8, matrix1[2, 3]);            
        }
コード例 #47
0
        public double[][] GetHessian(double[] x)
        {
            GeneralMatrix mat = CalculateHessian(x);

            return(mat.ArrayCopy);
        }
コード例 #48
0
ファイル: SessionCollection.cs プロジェクト: gabbe/quickroute
        /// <summary>
        /// Using linear least squares algorithm described at http://en.wikipedia.org/wiki/Linear_least_squares
        /// </summary>
        /// <returns></returns>
        public Transformation CalculateAverageTransformation()
        {
            var averageProjectionOrigin = new LongLat();

            foreach (var session in this)
            {
                averageProjectionOrigin += session.ProjectionOrigin / Count;
            }

            if (Count == 0)
            {
                return(null);
            }
            var n   = 4;
            var XtX = new GeneralMatrix(n, n);
            var Xty = new GeneralMatrix(n, 1);
            var numberOfUnknowns = 0;

            foreach (var session in this)
            {
                var m = session.Handles.Length;
                if (m < 2)
                {
                    continue;
                }
                numberOfUnknowns += m;

                var startDistance = session.Route.GetAttributeFromParameterizedLocation(WaypointAttribute.Distance, session.Route.FirstPL).Value;
                for (var i = 0; i < m; i++)
                {
                    var longLat     = session.Route.GetLocationFromParameterizedLocation(session.Handles[i].ParameterizedLocation);
                    var p           = longLat.Project(averageProjectionOrigin); // projected point on earth (metres)
                    var q           = session.Handles[i].Location;              // point on map image (pixels)
                    var endDistance = (i != m - 1)
                              ? (session.Route.GetAttributeFromParameterizedLocation(WaypointAttribute.Distance, session.Handles[i].ParameterizedLocation).Value +
                                 session.Route.GetAttributeFromParameterizedLocation(WaypointAttribute.Distance, session.Handles[i + 1].ParameterizedLocation).Value) / 2
                              : session.Route.GetAttributeFromParameterizedLocation(WaypointAttribute.Distance, session.Route.LastPL).Value;
                    var w = endDistance - startDistance; // weight
                    startDistance = endDistance;

                    XtX.SetElement(0, 0, XtX.GetElement(0, 0) + w * (p.X * p.X + p.Y * p.Y));
                    XtX.SetElement(0, 2, XtX.GetElement(0, 2) + w * p.X);
                    XtX.SetElement(0, 3, XtX.GetElement(0, 3) - w * p.Y);
                    XtX.SetElement(1, 1, XtX.GetElement(1, 1) + w * (p.X * p.X + p.Y * p.Y));
                    XtX.SetElement(1, 2, XtX.GetElement(1, 2) + w * p.Y);
                    XtX.SetElement(1, 3, XtX.GetElement(1, 3) + w * p.X);
                    XtX.SetElement(2, 0, XtX.GetElement(2, 0) + w * p.X);
                    XtX.SetElement(2, 1, XtX.GetElement(2, 1) + w * p.Y);
                    XtX.SetElement(2, 2, XtX.GetElement(2, 2) + w);
                    XtX.SetElement(3, 0, XtX.GetElement(3, 0) - w * p.Y);
                    XtX.SetElement(3, 1, XtX.GetElement(3, 1) + w * p.X);
                    XtX.SetElement(3, 3, XtX.GetElement(3, 3) + w);

                    Xty.SetElement(0, 0, Xty.GetElement(0, 0) + w * (q.X * p.X - q.Y * p.Y));
                    Xty.SetElement(1, 0, Xty.GetElement(1, 0) + w * (q.X * p.Y + q.Y * p.X));
                    Xty.SetElement(2, 0, Xty.GetElement(2, 0) + w * q.X);
                    Xty.SetElement(3, 0, Xty.GetElement(3, 0) + w * q.Y);
                }
            }

            var T = new GeneralMatrix(3, 3);

            if (numberOfUnknowns == 0)
            {
                T = this[0].InitialTransformationMatrix;
            }
            else if (numberOfUnknowns == 1)
            {
                T = this[0].Handles[0].TransformationMatrix;
            }
            else
            {
                var B = XtX.QRD().Solve(Xty);

                T.SetElement(0, 0, B.GetElement(0, 0));
                T.SetElement(0, 1, B.GetElement(1, 0));
                T.SetElement(0, 2, B.GetElement(2, 0));
                T.SetElement(1, 0, B.GetElement(1, 0));
                T.SetElement(1, 1, -B.GetElement(0, 0));
                T.SetElement(1, 2, B.GetElement(3, 0));
                T.SetElement(2, 0, 0);
                T.SetElement(2, 1, 0);
                T.SetElement(2, 2, 1);
            }
            return(new Transformation(T, averageProjectionOrigin));
        }
コード例 #49
0
        /// <summary>
        /// ֱ���������
        /// </summary>
        /// <param name="st7"></param>
        public void CalculateTrans7Param2(List<Coords7ST> st7)
        {
            double[][] A = new double[0][];
            double[][] B = new double[0][];

            InitMatrixAB(ref A, ref B, st7);

            GeneralMatrix matrixA = new GeneralMatrix(A);
            GeneralMatrix matrixB = new GeneralMatrix(B);
            GeneralMatrix matrixParam = matrixA.Inverse() * matrixB;

            this.Set4Param(matrixParam.GetElement(0, 0), matrixParam.GetElement(1, 0), matrixParam.GetElement(2, 0), matrixParam.GetElement(6, 0));
            this.SetRotationParam(matrixParam.GetElement(3, 0), matrixParam.GetElement(4, 0), matrixParam.GetElement(5, 0));
        }