コード例 #1
0
        public void CanSolveUsingQRTallMatrixUsingWorkArray()
        {
            var matrix = _matrices["Tall3x2"];
            var a = new float[matrix.RowCount * matrix.ColumnCount];
            Array.Copy(matrix.Values, a, a.Length);

            var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f };
            var x = new float[matrix.ColumnCount * 2];
            var work = new float[matrix.RowCount * matrix.RowCount];
            Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work);

            NotModified(3, 2, a, matrix);

            var mb = new DenseMatrix(matrix.RowCount, 2, b);
            var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb;

            AssertHelpers.AlmostEqual(test[0, 0], x[0], 6);
            AssertHelpers.AlmostEqual(test[1, 0], x[1], 6);
            AssertHelpers.AlmostEqual(test[0, 1], x[2], 6);
            AssertHelpers.AlmostEqual(test[1, 1], x[3], 6);
        }
コード例 #2
0
        public void CanSolveUsingCholeskyOnFactoredMatrix()
        {
            var a = new float[] { 1, 1, 1, 1, 2, 3, 1, 3, 6 };

            Control.LinearAlgebraProvider.CholeskyFactor(a, 3);

            var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f };
            Control.LinearAlgebraProvider.CholeskySolveFactored(a, 3, b, 2);

            AssertHelpers.AlmostEqual(b[0], 0, 6);
            AssertHelpers.AlmostEqual(b[1], 1, 6);
            AssertHelpers.AlmostEqual(b[2], 0, 6);
            AssertHelpers.AlmostEqual(b[3], 3, 6);
            AssertHelpers.AlmostEqual(b[4], 1, 6);
            AssertHelpers.AlmostEqual(b[5], 0, 6);
        }
コード例 #3
0
        public void CanSolveUsingQRSquareMatrixUsingWorkArray()
        {
            var matrix = _matrices["Square3x3"];
            var a = new float[matrix.RowCount * matrix.ColumnCount];
            Array.Copy(matrix.Values, a, a.Length);

            var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f };
            var x = new float[matrix.ColumnCount * 2];
            var work = new float[matrix.RowCount * matrix.RowCount];
            Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work);

            NotModified(3, 3, a, matrix);

            var mx = new DenseMatrix(matrix.ColumnCount, 2, x);
            var mb = matrix * mx;

            AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5);
            AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5);
            AssertHelpers.AlmostEqual(mb[2, 0], b[2], 5);
            AssertHelpers.AlmostEqual(mb[0, 1], b[3], 5);
            AssertHelpers.AlmostEqual(mb[1, 1], b[4], 5);
            AssertHelpers.AlmostEqual(mb[2, 1], b[5], 5);
        }
コード例 #4
0
        public void CanSolveUsingLUOnFactoredMatrix()
        {
            var matrix = _matrices["Square3x3"];
            var a = new float[matrix.RowCount * matrix.RowCount];
            Array.Copy(matrix.Values, a, a.Length);

            var ipiv = new int[matrix.RowCount];
            Control.LinearAlgebraProvider.LUFactor(a, matrix.RowCount, ipiv);

            var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f };
            Control.LinearAlgebraProvider.LUSolveFactored(2, a, matrix.RowCount, ipiv, b);

            AssertHelpers.AlmostEqual(b[0], -1.477272727272726, 6);
            AssertHelpers.AlmostEqual(b[1], -4.318181818181815, 6);
            AssertHelpers.AlmostEqual(b[2], 3.068181818181816, 6);
            AssertHelpers.AlmostEqual(b[3], -4.204545454545451, 6);
            AssertHelpers.AlmostEqual(b[4], -12.499999999999989, 6);
            AssertHelpers.AlmostEqual(b[5], 8.522727272727266, 6);
        }
コード例 #5
0
        public void CanSolveUsingCholesky()
        {
            var matrix = new DenseMatrix(3, 3, new float[] { 1, 1, 1, 1, 2, 3, 1, 3, 6 });
            var a = new float[] { 1, 1, 1, 1, 2, 3, 1, 3, 6 };

            var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f };
            Control.LinearAlgebraProvider.CholeskySolve(a, 3, b, 2);

            AssertHelpers.AlmostEqual(b[0], 0, 6);
            AssertHelpers.AlmostEqual(b[1], 1, 6);
            AssertHelpers.AlmostEqual(b[2], 0, 6);
            AssertHelpers.AlmostEqual(b[3], 3, 6);
            AssertHelpers.AlmostEqual(b[4], 1, 6);
            AssertHelpers.AlmostEqual(b[5], 0, 6);

            NotModified(3, 3, a, matrix);
        }
コード例 #6
0
        public void CanSolveUsingSVDSquareMatrixOnFactoredMatrix()
        {
            var matrix = _matrices["Square3x3"];
            var a = new float[matrix.RowCount * matrix.ColumnCount];
            Array.Copy(matrix.Values, a, a.Length);

            var s = new float[matrix.RowCount];
            var u = new float[matrix.RowCount * matrix.RowCount];
            var vt = new float[matrix.ColumnCount * matrix.ColumnCount];

            Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt);

            var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f };
            var x = new float[matrix.ColumnCount * 2];
            Control.LinearAlgebraProvider.SvdSolveFactored(matrix.RowCount, matrix.ColumnCount, s, u, vt, b, 2, x);

            var mx = new DenseMatrix(matrix.ColumnCount, 2, x);
            var mb = matrix * mx;

            AssertHelpers.AlmostEqual(mb[0, 0], b[0], 6);
            AssertHelpers.AlmostEqual(mb[1, 0], b[1], 6);
            AssertHelpers.AlmostEqual(mb[2, 0], b[2], 5);
            AssertHelpers.AlmostEqual(mb[0, 1], b[3], 5);
            AssertHelpers.AlmostEqual(mb[1, 1], b[4], 5);
            AssertHelpers.AlmostEqual(mb[2, 1], b[5], 5);
        }
コード例 #7
0
        public void CanSolveUsingSVDTallMatrixOnFactoredMatrix()
        {
            var matrix = _matrices["Tall3x2"];
            var a = new float[matrix.RowCount * matrix.ColumnCount];
            Array.Copy(matrix.Values, a, a.Length);

            var s = new float[matrix.ColumnCount];
            var u = new float[matrix.RowCount * matrix.RowCount];
            var vt = new float[matrix.ColumnCount * matrix.ColumnCount];

            Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt);

            var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f };
            var x = new float[matrix.ColumnCount * 2];
            Control.LinearAlgebraProvider.SvdSolveFactored(matrix.RowCount, matrix.ColumnCount, s, u, vt, b, 2, x);

            var mb = new DenseMatrix(matrix.RowCount, 2, b);
            var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb;

            AssertHelpers.AlmostEqual(test[0, 0], x[0], 6);
            AssertHelpers.AlmostEqual(test[1, 0], x[1], 6);
            AssertHelpers.AlmostEqual(test[0, 1], x[2], 6);
            AssertHelpers.AlmostEqual(test[1, 1], x[3], 6);
        }
コード例 #8
0
        public void CanSolveUsingThinQRSquareMatrixOnFactoredMatrixWithWorkArray()
        {
            var matrix = _matrices["Square3x3"];
            var a = new float[matrix.RowCount * matrix.ColumnCount];
            Array.Copy(matrix.Values, a, a.Length);

            var tau = new float[matrix.ColumnCount];
            var r = new float[matrix.ColumnCount * matrix.ColumnCount];
            var work = new float[2048];
            Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau, work);

            var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f };
            var x = new float[matrix.ColumnCount * 2];
            Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work, QRMethod.Thin);

            var mx = new DenseMatrix(matrix.ColumnCount, 2, x);
            var mb = matrix * mx;

            AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5);
            AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5);
            AssertHelpers.AlmostEqual(mb[2, 0], b[2], 5);
            AssertHelpers.AlmostEqual(mb[0, 1], b[3], 5);
            AssertHelpers.AlmostEqual(mb[1, 1], b[4], 5);
            AssertHelpers.AlmostEqual(mb[2, 1], b[5], 5);
        }
コード例 #9
0
        public void CanSolveUsingThinQRTallMatrixOnFactoredMatrixWithWorkArray()
        {
            var matrix = _matrices["Tall3x2"];
            var a = new float[matrix.RowCount * matrix.ColumnCount];
            Array.Copy(matrix.Values, a, a.Length);

            var tau = new float[matrix.ColumnCount];
            var r = new float[matrix.ColumnCount * matrix.ColumnCount];
            var work = new float[2048];
            Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau, work);

            var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f };
            var x = new float[matrix.ColumnCount * 2];
            Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work, QRMethod.Thin);

            var mb = new DenseMatrix(matrix.RowCount, 2, b);
            var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb;

            AssertHelpers.AlmostEqual(test[0, 0], x[0], 6);
            AssertHelpers.AlmostEqual(test[1, 0], x[1], 6);
            AssertHelpers.AlmostEqual(test[0, 1], x[2], 6);
            AssertHelpers.AlmostEqual(test[1, 1], x[3], 6);
        }
コード例 #10
0
        public void CanSolveUsingLU()
        {
            var matrix = _matrices["Square3x3"];
            var a = new Complex32[matrix.RowCount * matrix.RowCount];
            Array.Copy(matrix.Values, a, a.Length);

            var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f };
            Control.LinearAlgebraProvider.LUSolve(2, a, matrix.RowCount, b);

            AssertHelpers.AlmostEqual(b[0], -1.477272727272726f, 6);
            AssertHelpers.AlmostEqual(b[1], -4.318181818181815f, 6);
            AssertHelpers.AlmostEqual(b[2], 3.068181818181816f, 6);
            AssertHelpers.AlmostEqual(b[3], -4.204545454545451f, 6);
            AssertHelpers.AlmostEqual(b[4], -12.499999999999989f, 6);
            AssertHelpers.AlmostEqual(b[5], 8.522727272727266f, 6);

            NotModified(matrix.RowCount, matrix.ColumnCount, a, matrix);
        }
コード例 #11
0
        public void CanSolveUsingQRTallMatrixOnFactoredMatrix()
        {
            var matrix = _matrices["Tall3x2"];
            var a = new Complex32[matrix.RowCount * matrix.ColumnCount];
            Array.Copy(matrix.Values, a, a.Length);

            var tau = new Complex32[matrix.ColumnCount];
            var q = new Complex32[matrix.RowCount * matrix.RowCount];
            Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau);

            var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f };
            var x = new Complex32[matrix.ColumnCount * 2];
            Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x);

            var mb = new DenseMatrix(matrix.RowCount, 2, b);
            var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb;

            AssertHelpers.AlmostEqual(test[0, 0], x[0], 6);
            AssertHelpers.AlmostEqual(test[1, 0], x[1], 6);
            AssertHelpers.AlmostEqual(test[0, 1], x[2], 6);
            AssertHelpers.AlmostEqual(test[1, 1], x[3], 6);
        }
コード例 #12
0
        public void CanSolveUsingQRSquareMatrixOnFactoredMatrix()
        {
            var matrix = _matrices["Square3x3"];
            var a = new Complex32[matrix.RowCount * matrix.RowCount];
            Array.Copy(matrix.Values, a, a.Length);

            var tau = new Complex32[matrix.ColumnCount];
            var q = new Complex32[matrix.ColumnCount * matrix.ColumnCount];
            Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau);

            var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f };
            var x = new Complex32[matrix.ColumnCount * 2];
            Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x);

            var mx = new DenseMatrix(matrix.ColumnCount, 2, x);
            var mb = matrix * mx;

            AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5);
            AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5);
            AssertHelpers.AlmostEqual(mb[2, 0], b[2], 5);
            AssertHelpers.AlmostEqual(mb[0, 1], b[3], 5);
            AssertHelpers.AlmostEqual(mb[1, 1], b[4], 5);
            AssertHelpers.AlmostEqual(mb[2, 1], b[5], 5);
        }
コード例 #13
0
            public void CanSolveUsingSVDTallMatrix()
            {
                var matrix = _matrices["Tall3x2"];
                var a = new double[matrix.RowCount * matrix.ColumnCount];
                Array.Copy(matrix.Values, a, a.Length);

                var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 };
                var x = new double[matrix.ColumnCount * 2];
                Control.LinearAlgebraProvider.SvdSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x);

                NotModified(3, 2, a, matrix);

                var mb = new DenseMatrix(matrix.RowCount, 2, b);
                var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb;

                AssertHelpers.AlmostEqual(test[0, 0], x[0], 14);
                AssertHelpers.AlmostEqual(test[1, 0], x[1], 14);
                AssertHelpers.AlmostEqual(test[0, 1], x[2], 14);
                AssertHelpers.AlmostEqual(test[1, 1], x[3], 14);
            }
コード例 #14
0
            public void CanSolveUsingSVDSquareMatrix()
            {
                var matrix = _matrices["Square3x3"];
                var a = new double[matrix.RowCount * matrix.ColumnCount];
                Array.Copy(matrix.Values, a, a.Length);

                var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 };
                var x = new double[matrix.ColumnCount * 2];
                Control.LinearAlgebraProvider.SvdSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x);

                NotModified(3, 3, a, matrix);

                var mx = new DenseMatrix(matrix.ColumnCount, 2, x);
                var mb = matrix * mx;

                AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14);
                AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14);
                AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14);
                AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14);
                AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14);
                AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14);
            }