public void Test_Multiply_Matrix_RectangularMatrix()
        {
            double[,] lhs =
            {
                { +88.409999999999997, -88.043999999999997 },
                { +91.227000000000004, -53.043999999999997 },
                { +15.042000000000000, -29.367999999999999 },
            };
            double[,] rhs =
            {
                { +64.239000000000004, -91.394999999999996, +29.823000000000000, +29.548999999999999 },
                { -96.918999999999997, -66.201999999999998, +46.344000000000001, -09.815000000000000 },
            };

            double[,] expected =
            {
                { 14212.50642600000, -02251.54306200000, -01443.65970600000, +03476.57895000000 },
                { 11001.30268900000, -04826.07277700000, +00262.39168500000, +03216.29348300000 },
                { 03812.60023000000, +00569.45674600000, -00912.43302600000, +00732.72297800000 },
            };

            double[,] actual = ArrayMatrixUtils.Multiply(lhs, rhs);

            Assert.That(actual, Is.EqualTo(expected).Within(precision));
        }
        public void Test_SVD_Rectangular_Matrix()
        {
            double[,] A =
            {
                { 79.2200, 03.5700 },
                { 95.9500, 84.9100 },
                { 65.5700, 93.4000 },
            };

            double[,] expected_U =
            {
                { -0.343225213778742, +0.878072041895140, +0.333445560577190 },
                { -0.710225885367531, -0.010313122653119, -0.703898310308420 },
                { -0.614634561654683, -0.478417316516910, +0.627169217098794 },
            };
            double[,] expected_S =
            {
                { 180.3990135626532, 000.0000000000000 },
                { 000.0000000000000, 056.4255678360587 },
                { 000.0000000000000, 000.0000000000000 },
            };
            double[,] expected_Vt =
            {
                { -0.751878076634585, -0.659302174936711 },
                { +0.659302174936711, -0.751878076634585 },
            };

            double[,] actual_U, actual_S, actual_Vt;

            ArrayMatrixUtils.SVD(A, out actual_U, out actual_S, out actual_Vt);

            Assert.That(actual_U, Is.EqualTo(expected_U).Within(precision));
            Assert.That(actual_S, Is.EqualTo(expected_S).Within(precision));
            Assert.That(actual_Vt, Is.EqualTo(expected_Vt).Within(precision));
        }
Esempio n. 3
0
        private Matrix4x4 ComputeTransform(double[,] A, double[] b)
        {
            double[,] Aplus = ArrayMatrixUtils.MoorePenroseInverse(A);
            double[] xOpt = ArrayMatrixUtils.Multiply(Aplus, b);

            return(TransformationMatrixFromXOpt(xOpt));
        }
        public void Test_ToDiagonalMatrix_NonSquareOutput_InvalidNumCols_Helper()
        {
            double[] diagonal = new double[] { 1, 2, 3 };
            int      numRows  = 3;
            int      numCols  = 2;

            ArrayMatrixUtils.ToDiagonalMatrix(diagonal, numRows, numCols);
        }
        public void Test_MatrixToVector_InvalidSize_Helper()
        {
            double[,] matrix =
            {
                { 1, 2, 3 },
                { 1, 2, 3 }
            };

            ArrayMatrixUtils.ToVector(matrix);
        }
        public void Test_InfinityNorm_Vector()
        {
            double[] vector = { -1, -7 };

            double expected = 7;

            double actual = ArrayMatrixUtils.InfinityNorm(vector);

            Assert.That(actual, Is.EqualTo(expected));
        }
        public void Test_MatrixToVector_RowMatrix()
        {
            double[,] matrix =
            {
                { 1, 2, 3 }
            };

            double[] expected = { 1, 2, 3 };

            double[] actual = ArrayMatrixUtils.ToVector(matrix);

            Assert.That(actual, Is.EqualTo(expected).Within(precision));
        }
        public void Test_RowVectorToMatrix()
        {
            double[] vector = { 1, 2, 3 };

            double[,] expected =
            {
                { 1, 2, 3 }
            };

            double[,] actual = ArrayMatrixUtils.RowVectorToMatrix(vector);

            Assert.That(actual, Is.EqualTo(expected).Within(precision));
        }
        public void Test_Multiply_Matrix_IncompatibleSize_Helper()
        {
            double[,] lhs =
            {
                { -26.303000000000001, +56.045000000000002 },
                { +25.123999999999999, -83.775000000000006 },
            };
            double[,] rhs =
            {
                { 85.876999999999995, -02.642000000000000 },
            };

            ArrayMatrixUtils.Multiply(lhs, rhs);
        }
        public void Test_InfinityNorm_Matrix()
        {
            double[,] matrix =
            {
                { +1, -7 },
                { -2, -3 }
            };

            double expected = 8;

            double actual = ArrayMatrixUtils.InfinityNorm(matrix);

            Assert.That(actual, Is.EqualTo(expected));
        }
        public void Test_ToDiagonalMatrix()
        {
            double[] diagonal = new double[] { 1, 2, 3 };

            double[,] expected = new double[, ] {
                { 1, 0, 0 },
                { 0, 2, 0 },
                { 0, 0, 3 },
            };

            double[,] actual = ArrayMatrixUtils.ToDiagonalMatrix(diagonal);

            Assert.That(actual, Is.EqualTo(expected).Within(precision));
        }
        public void Test_Multiply_Vector_IncompatibleSize_Helper()
        {
            double[,] lhs =
            {
                { -1.064000000000000, +0.215000000000000 },
                { -3.873000000000000, +6.353000000000000 },
                { +0.170000000000000, +5.897000000000000 },
            };
            double[] rhs =
            {
                +2.886000000000000, -2.428000000000000, -13.827296000000000
            };

            ArrayMatrixUtils.Multiply(lhs, rhs);
        }
        public void Test_GetDiagonal_SquareMatrix()
        {
            double[,] matrix =
            {
                { +1, -7, +0 },
                { -2, -3, -8 },
                { -2, -3, +9 }
            };

            double[] expected = { +1, -3, +9 };

            double[] actual = ArrayMatrixUtils.GetDiagonal(matrix);

            Assert.That(actual, Is.EqualTo(expected));
        }
        public void Test_ToDiagonalMatrix_NonSquareOutput()
        {
            double[] diagonal = new double[] { 1, 2, 3 };
            int      numRows  = 4;
            int      numCols  = 3;

            double[,] expected = new double[, ] {
                { 1, 0, 0 },
                { 0, 2, 0 },
                { 0, 0, 3 },
                { 0, 0, 0 },
            };

            double[,] actual = ArrayMatrixUtils.ToDiagonalMatrix(diagonal, numRows, numCols);

            Assert.That(actual, Is.EqualTo(expected).Within(precision));
        }
        public void Test_MoorePenroseInverse_SquareMatrix()
        {
            double[,] array =
            {
                { -6.040000000000000, +4.880000000000000 },
                { -9.390000000000001, +0.000000000000001 },
            };

            double[,] expected =
            {
                { +0.000000000000000, -0.106496272630458 },
                { +0.204918032786885, -0.131810960386878 },
            };

            double[,] actual = ArrayMatrixUtils.MoorePenroseInverse(array);

            Assert.That(actual, Is.EqualTo(expected).Within(precision));
        }
        public void Test_MoorePenroseInverse_RectangularMatrix()
        {
            double[,] array =
            {
                { +5.5800, +7.8200 },
                { +4.3000, -3.3200 },
                { +8.0700, +3.9700 },
            };

            double[,] expected =
            {
                { +0.0017, +0.0921, +0.0737 },
                { +0.0878, -0.1020, -0.0063 },
            };

            double[,] actual = ArrayMatrixUtils.MoorePenroseInverse(array);

            Assert.That(actual, Is.EqualTo(expected).Within(precision));
        }
        public void Test_PseudoInverseOfDiagonalMatrix_RectangularMatrix2_WithTolerance()
        {
            double[,] matrix =
            {
                { 0.1, 0.0 },
                { 0.0, 5.0 },
            };
            double tolerance = 0.2;

            double[,] expected =
            {
                { 0.0, 0.0 },
                { 0.0, 0.2 },
            };

            double[,] actual = ArrayMatrixUtils.PseudoInverseOfDiagonalMatrix(matrix, tolerance);

            Assert.That(actual, Is.EqualTo(expected));
        }
        public void Test_Transpose_Rectangular_Matrix()
        {
            double[,] matrix =
            {
                { +56.049999999999997, -19.218000000000000 },
                { -22.052000000000000, -80.709000000000003 },
                { -51.661999999999999, -73.605000000000004 },
            };

            double[,] expected =
            {
                { +56.049999999999997, -22.052000000000000, -51.661999999999999 },
                { -19.218000000000000, -80.709000000000003, -73.605000000000004 },
            };

            double[,] actual = ArrayMatrixUtils.Transpose(matrix);

            Assert.That(actual, Is.EqualTo(expected).Within(precision));
        }
        public void Test_Transpose_Square_Matrix()
        {
            double[,] matrix =
            {
                { -90.069000000000003, -01.827000000000000, +80.010999999999996 },
                { +80.543000000000006, -02.149000000000000, -26.151000000000000 },
                { +88.956999999999994, -32.456000000000003, -77.759000000000000 },
            };

            double[,] expected =
            {
                { -90.069000000000003, +80.543000000000006, +88.956999999999994 },
                { -01.827000000000000, -02.149000000000000, -32.456000000000003 },
                { +80.010999999999996, -26.151000000000000, -77.759000000000000 },
            };

            double[,] actual = ArrayMatrixUtils.Transpose(matrix);

            Assert.That(actual, Is.EqualTo(expected).Within(precision));
        }
        public void Test_PseudoInverseOfDiagonalMatrix_SquareMatrix_WithTolerance()
        {
            double[,] matrix =
            {
                { 1.0, 0.0, 0.0 },
                { 0.0, 0.5, 0.0 },
                { 0.0, 0.0, 0.1 },
            };
            double tolerance = 0.2;

            double[,] expected =
            {
                { 1.0, 0.0, 0.0 },
                { 0.0, 2.0, 0.0 },
                { 0.0, 0.0, 0.0 },
            };

            double[,] actual = ArrayMatrixUtils.PseudoInverseOfDiagonalMatrix(matrix, tolerance);

            Assert.That(actual, Is.EqualTo(expected));
        }
        public void Test_Multiply_Matrix_Vector()
        {
            double[,] lhs =
            {
                { -1.064000000000000, +0.215000000000000 },
                { -3.873000000000000, +6.353000000000000 },
                { +0.170000000000000, +5.897000000000000 },
            };
            double[] rhs =
            {
                +2.886000000000000, -2.428000000000000
            };

            double[] expected =
            {
                -03.592724000000000, -26.602561999999999, -13.827296000000000,
            };

            double[] actual = ArrayMatrixUtils.Multiply(lhs, rhs);

            Assert.That(actual, Is.EqualTo(expected).Within(precision));
        }
        public void Test_Multiply_Matrix_SquareMatrix()
        {
            double[,] lhs =
            {
                { -26.303000000000001, +56.045000000000002 },
                { +25.123999999999999, -83.775000000000006 },
            };
            double[,] rhs =
            {
                { 85.876999999999995, -02.642000000000000 },
                { 55.143000000000001, -12.827999999999999 },
            };

            double[,] expected =
            {
                { +0831.666704000000, -0649.452734000000 },
                { -2462.031077000001, +1008.288092000000 },
            };

            double[,] actual = ArrayMatrixUtils.Multiply(lhs, rhs);

            Assert.That(actual, Is.EqualTo(expected).Within(precision));
        }
        public void Test_SVD_Square_Matrix()
        {
            double[,] A =
            {
                { -29.809999999999999, -84.807000000000002, -63.218000000000004 },
                { +02.650000000000000, -52.017000000000003, -52.009000000000000 },
                { -19.638000000000002, -75.335999999999999, -16.547000000000001 },
            };

            double[,] expected_U =
            {
                { -0.729908087739305, -0.123505763730895, -0.672294957424195 },
                { -0.465764528149259, -0.630004873055934, +0.621415532670109 },
                { -0.500297499264836, +0.766707366764547, +0.402321048390866 },
            };
            double[,] expected_S =
            {
                { 149.7913869700865, 000.0000000000000, 000.0000000000000 },
                { 000.0000000000000, 034.0373717936407, 000.0000000000000 },
                { 000.0000000000000, 000.0000000000000, 015.2993660966482 },
            };
            double[,] expected_Vt =
            {
                { +0.202609288827379, +0.826612287707770, +0.525034857786977 },
                { -0.383237737754462, -0.426459172115321, +0.819305444190112 },
                { +0.901153878336938, -0.367212064520276, +0.230384433564968 },
            };

            double[,] actual_U, actual_S, actual_Vt;

            ArrayMatrixUtils.SVD(A, out actual_U, out actual_S, out actual_Vt);

            Assert.That(actual_U, Is.EqualTo(expected_U).Within(precision));
            Assert.That(actual_S, Is.EqualTo(expected_S).Within(precision));
            Assert.That(actual_Vt, Is.EqualTo(expected_Vt).Within(precision));
        }