Пример #1
0
        public void MatrixLU()
        {
            int N = 2;
            var A = new WWMatrix(N, N, new double[]
                                 { 4, 3,
                                   6, 3 });

            WWMatrix L;
            WWMatrix U;
            var      result = WWMatrix.LUdecompose(A, out L, out U);

            Assert.IsTrue(result == WWMatrix.ResultEnum.Success);

            // Lは下三角行列。
            var Ltype = L.DetermineMatType();

            Assert.IsTrue(0 != (Ltype & (ulong)WWMatrix.MatType.LowerTriangular));

            // Uは上三角行列。
            var Utype = U.DetermineMatType();

            Assert.IsTrue(0 != (Utype & (ulong)WWMatrix.MatType.UpperTriangular));

            // L * U = A
            WWMatrix Arecovered = WWMatrix.Mul(L, U);

            Assert.IsTrue(WWMatrix.IsSame(A, Arecovered));
        }
Пример #2
0
        public void MatrixJoinH()
        {
            int N = 2;
            var A = new WWMatrix(N, N, new double[]
                                 { 1, 2,
                                   3, 4 });
            var B = new WWMatrix(N, N, new double[]
                                 { 5, 6,
                                   7, 8 });
            var AB    = WWMatrix.JoinH(A, B);
            var ABref = new WWMatrix(N, N * 2, new double[]
                                     { 1, 2, 5, 6,
                                       3, 4, 7, 8 });

            Assert.IsTrue(WWMatrix.IsSame(AB, ABref));
        }
Пример #3
0
        public void MatrixLPU_4x4()
        {
            int N = 4;

            var r = new Random();

            for (int i = 0; i < 1000; ++i)
            {
                var A = new WWMatrix(N, N, new double[]
                                     { r.Next(10), r.Next(10), r.Next(10), r.Next(10),
                                       r.Next(10), r.Next(10), r.Next(10), r.Next(10),
                                       r.Next(10), r.Next(10), r.Next(10), r.Next(10),
                                       r.Next(10), r.Next(10), r.Next(10), r.Next(10) });

                WWMatrix P;
                WWMatrix L;
                WWMatrix U;
                var      result = WWMatrix.LUdecompose2(A, out L, out P, out U);
                if (result == WWMatrix.ResultEnum.FailedToChoosePivot)
                {
                    continue;
                }
                Assert.IsTrue(result == WWMatrix.ResultEnum.Success);

                // Lは下三角行列。
                var Ltype = L.DetermineMatType();
                Assert.IsTrue(0 != (Ltype & (ulong)WWMatrix.MatType.LowerTriangular));

                // Uは上三角行列。
                var Utype = U.DetermineMatType();
                Assert.IsTrue(0 != (Utype & (ulong)WWMatrix.MatType.UpperTriangular));

                A.Print("A");
                L.Print("L");
                U.Print("U");
                P.Print("P");

                // P * A = L * U
                var LU = WWMatrix.Mul(L, U);
                var PA = WWMatrix.Mul(P, A);
                Assert.IsTrue(WWMatrix.IsSame(PA, LU));
            }
        }
Пример #4
0
        public void MatrixLPU_3x3a()
        {
            int N = 3;

            var A = new WWMatrix(N, N, new double[]
                                 { 6, 4, 1,
                                   3, 3, 2,
                                   7, 7, 3 });

            WWMatrix P;
            WWMatrix L;
            WWMatrix U;
            var      result = WWMatrix.LUdecompose2(A, out L, out P, out U);

            Assert.IsTrue(result == WWMatrix.ResultEnum.Success);

            // Lは下三角行列。
            var Ltype = L.DetermineMatType();

            Assert.IsTrue(0 != (Ltype & (ulong)WWMatrix.MatType.LowerTriangular));

            // Uは上三角行列。
            var Utype = U.DetermineMatType();

            Assert.IsTrue(0 != (Utype & (ulong)WWMatrix.MatType.UpperTriangular));

            A.Print("A");
            L.Print("L");
            U.Print("U");
            P.Print("P");

            // P * A = L * U
            var LU = WWMatrix.Mul(L, U);
            var PA = WWMatrix.Mul(P, A);

            Assert.IsTrue(WWMatrix.IsSame(PA, LU));
        }