private static void TestSystemSolution(LinearAlgebraProviderChoice providers)
        {
            TestSettings.RunMultiproviderTest(providers, delegate()
            {
                // invertible
                var A1            = TriangularUpper.CreateFromArray(UpperInvertible10by10.Matrix);
                var b1            = Vector.CreateFromArray(UpperInvertible10by10.Rhs);
                var x1Expected    = Vector.CreateFromArray(UpperInvertible10by10.Lhs);
                Vector x1Computed = A1.SolveLinearSystem(b1);
                comparer.AssertEqual(x1Expected, x1Computed);

                // singular
                var A2            = TriangularUpper.CreateFromArray(UpperSingular10by10.Matrix);
                var b2            = Vector.CreateFromArray(UpperSingular10by10.Rhs);
                var x2Expected    = Vector.CreateFromArray(UpperSingular10by10.Lhs);
                Vector x2Computed = A2.SolveLinearSystem(b2);
                Assert.False(comparer.AreEqual(x2Expected, x2Computed));

                // invertible - solve transposed (forward substitution)
                Matrix A3         = Matrix.CreateFromArray(UpperInvertible10by10.Matrix).Invert().Transpose();
                Vector x3Expected = A3 * b1;
                Vector x3Computed = A1.SolveLinearSystem(b1, true);
                comparer.AssertEqual(x3Expected, x3Computed);
            });
        }
        private static void TestClear()
        {
            var zero   = Matrix.CreateZero(UpperSingular10by10.Order, UpperSingular10by10.Order);
            var matrix = TriangularUpper.CreateFromArray(UpperSingular10by10.Matrix);

            matrix.Clear();
            comparer.AssertEqual(zero, matrix);
        }
 /// <summary>
 /// Explicitly creates the upper triangular matrix R1, which consists of the first n rows of the matrix R that resulted
 /// from the factorization: A =  Q * R = [Q1, Q2] * [R1; 0] (Matlab notation) = Q1 * R1,
 /// where A is m-by-n, Q is m-by-m, R is m-by-n, Q1 is m-by-n and R1 is (n-by-n).
 /// This method is safe to use as the factorization data are copied (if necessary). However, it is inefficient if the
 /// generated matrix is only used once.
 /// </summary>
 public TriangularUpper GetEconomyFactorR()
 {
     if (NumRows < NumColumns)
     {
         throw new NotImplementedException("For now, the number of rows must be >= the number of columns");
     }
     double[] r = Conversions.RectColMajorToSquarePackedUpperColMajor(NumRows, NumColumns, reflectorsAndR);
     return(TriangularUpper.CreateFromArray(NumColumns, r, false));
 }
        private static void TestGetRow()
        {
            var matrix = TriangularUpper.CreateFromArray(UpperInvertible10by10.Matrix);

            for (int i = 0; i < UpperInvertible10by10.Order; ++i)
            {
                Vector rowExpected = DenseStrategies.GetRow(matrix, i);
                Vector rowComputed = matrix.GetRow(i);
                comparer.AssertEqual(rowExpected, rowComputed);
            }
        }
        private static void TestGetColumn()
        {
            var matrix = TriangularUpper.CreateFromArray(UpperInvertible10by10.Matrix);

            for (int j = 0; j < UpperInvertible10by10.Order; ++j)
            {
                Vector colExpected = DenseStrategies.GetColumn(matrix, j);
                Vector colComputed = matrix.GetColumn(j);
                comparer.AssertEqual(colExpected, colComputed);
            }
        }
        private static void TestArrayCopy()
        {
            // invertible
            var A1 = TriangularUpper.CreateFromArray(UpperInvertible10by10.Matrix);

            comparer.AssertEqual(UpperInvertible10by10.Matrix, A1.CopyToArray2D());

            // singular
            var A2 = TriangularUpper.CreateFromArray(UpperSingular10by10.Matrix);

            comparer.AssertEqual(UpperSingular10by10.Matrix, A2.CopyToArray2D());
        }
        private static void TestFactorization()
        {
            //TestSettings.RunMultiproviderTest(providers, delegate () {
            //
            var skyline = SkylineMatrix.CreateFromArrays(SparsePosDef10by10.Order, SparsePosDef10by10.SkylineValues,
                                                         SparsePosDef10by10.SkylineDiagOffsets, true, true);
            var             expectedU     = Matrix.CreateFromArray(SparsePosDef10by10.CholeskyU);
            CholeskySkyline factorization = skyline.FactorCholesky(false);
            TriangularUpper computedU     = factorization.GetFactorU();

            comparer.AssertEqual(expectedU, computedU);
            //});
        }
        private static void TestMatrixVectorMultiplicationIntoResult(LinearAlgebraProviderChoice providers)
        {
            // The result vectors will first be set to some non zero values to make sure that the result overwrites
            // them instead of being added to them.

            TestSettings.RunMultiproviderTest(providers, delegate()
            {
                var A            = TriangularUpper.CreateFromArray(UpperInvertible10by10.Matrix);
                var x            = Vector.CreateFromArray(UpperInvertible10by10.Lhs);
                var bExpected    = Vector.CreateFromArray(UpperInvertible10by10.Rhs);
                Vector bComputed = Vector.CreateWithValue(A.NumRows, 1.0);
                A.MultiplyIntoResult(x, bComputed, false);
                comparer.AssertEqual(bExpected, bComputed);
            });
        }
        private static void TestTransposition()
        {
            // invertible
            var             A1 = TriangularLower.CreateFromArray(LowerInvertible10by10.Matrix);
            var             A1TransposeExpected = MatrixOperations.Transpose(LowerInvertible10by10.Matrix);
            TriangularUpper A1TransposeComputed = A1.Transpose(false);

            comparer.AssertEqual(A1TransposeExpected, A1TransposeComputed.CopyToArray2D());

            // singular
            var             A2 = TriangularLower.CreateFromArray(LowerSingular10by10.Matrix);
            var             A2TransposeExpected = MatrixOperations.Transpose(LowerSingular10by10.Matrix);
            TriangularUpper A2TransposeComputed = A2.Transpose(false);

            comparer.AssertEqual(A2TransposeExpected, A2TransposeComputed.CopyToArray2D());
        }
        private static void TestFactorization(LinearAlgebraProviderChoice providers)
        {
            TestSettings.RunMultiproviderTest(providers, delegate()
            {
                // positive definite
                var A1         = SymmetricMatrix.CreateFromArray(SymmPosDef10by10.Matrix);
                var expectedU1 = Matrix.CreateFromArray(SymmPosDef10by10.FactorU);
                CholeskyPacked factorization1 = A1.FactorCholesky();
                TriangularUpper computedU1    = factorization1.GetFactorU();
                comparer.AssertEqual(expectedU1, computedU1);

                // singular
                var A2 = SymmetricMatrix.CreateFromArray(SquareSingular10by10.Matrix);
                Assert.Throws <IndefiniteMatrixException>(() => A2.FactorCholesky());
            });
        }
        /// <summary>
        /// Explicitly creates the upper triangular matrix U that resulted from the Cholesky factorization: A = transpose(U) * U,
        /// where A and U are n-by-n.
        /// This method is safe to use as the factorization data are copied (if necessary). However, it is inefficient if the
        /// generated matrix is only used once.
        /// </summary>
        public TriangularUpper GetFactorU()
        {
            // The factorization A = transpose(u) * D * u, u = unit upper triangular is stored. Thus U = sqrt(D) * u.
            // Since D is diagonal, we need to scale each column j of u by sqrt(D[j,j]).
            var upper = TriangularUpper.CreateZero(Order);

            for (int j = 0; j < Order; ++j)
            {
                int colheight = diagOffsets[j + 1] - diagOffsets[j] - 1;
                for (int t = 0; t < colheight + 1; ++t)
                {
                    int i = j - t;
                    upper[i, j] = values[diagOffsets[j] + t];
                }
            }
            return(upper);
        }
        private static void TestEconomyFactorsQ1R1(LinearAlgebraProviderChoice providers)
        {
            TestSettings.RunMultiproviderTest(providers, delegate()
            {
                int m             = RectangularFullRank10by5.NumRows;
                int n             = RectangularFullRank10by5.NumCols;
                var A             = Matrix.CreateFromArray(RectangularFullRank10by5.Matrix);
                Matrix expectedQ1 = Matrix.CreateFromArray(RectangularFullRank10by5.QRFactorQ).GetSubmatrix(0, m, 0, n);
                Matrix expectedR1 = Matrix.CreateFromArray(RectangularFullRank10by5.QRqrFactorR).GetSubmatrix(0, n, 0, n);

                QRFactorization factorization = A.FactorQR();
                Matrix computedQ1             = factorization.GetEconomyFactorQ();
                TriangularUpper computedR1    = factorization.GetEconomyFactorR();

                comparer.AssertEqual(expectedQ1, computedQ1);
                comparer.AssertEqual(expectedR1, computedR1);
            });
        }
Esempio n. 13
0
        /// <summary>
        /// Copies the upper triangular matrix U and diagonal matrix D that resulted from the Cholesky factorization:
        /// A = transpose(U) * D * U to a new <see cref="TriangularUpper"/> matrix.
        /// </summary>
        public (Vector diagonal, TriangularUpper upper) GetFactorsDU() //TODO: not sure if this is ever needed.
        {
            double[] diag  = new double[Order];
            var      upper = TriangularUpper.CreateZero(Order);

            for (int j = 0; j < Order; ++j)
            {
                int diagOffset = diagOffsets[j];
                int colTop     = j - diagOffsets[j + 1] + diagOffset + 1;
                diag[j]     = values[diagOffset];
                upper[j, j] = 1.0;
                for (int i = j - 1; i >= colTop; --i)
                {
                    int offset = diagOffset + j - i;
                    upper[i, j] = values[offset];
                }
            }
            return(Vector.CreateFromArray(diag, false), upper);
        }
        private static void TestMatrixVectorMultiplication(LinearAlgebraProviderChoice providers)
        {
            TestSettings.RunMultiproviderTest(providers, delegate()
            {
                // invertible
                var A1            = TriangularUpper.CreateFromArray(UpperInvertible10by10.Matrix);
                var x1            = Vector.CreateFromArray(UpperInvertible10by10.Lhs);
                var b1Expected    = Vector.CreateFromArray(UpperInvertible10by10.Rhs);
                Vector b1Computed = A1.Multiply(x1);
                comparer.AssertEqual(b1Expected, b1Computed);

                // singular
                var A2            = TriangularUpper.CreateFromArray(UpperSingular10by10.Matrix);
                var x2            = Vector.CreateFromArray(UpperSingular10by10.Lhs);
                var b2Expected    = Vector.CreateFromArray(UpperSingular10by10.Rhs);
                Vector b2Computed = A2.Multiply(x1);
                comparer.AssertEqual(b2Expected, b2Computed);
            });
        }
Esempio n. 15
0
 /// <summary>
 /// Explicitly creates the upper triangular matrix U that resulted from the Cholesky factorization: A = transpose(U) * U,
 /// where A and U are n-by-n.
 /// This method is safe to use as the factorization data are copied (if necessary). However, it is inefficient if the
 /// generated matrix is only used once.
 /// </summary>
 public TriangularUpper GetFactorU()
 {
     CheckOverwritten();
     return(TriangularUpper.CreateFromArray(Order, data, true));
 }