public void CanFactorizeRandomMatrixUsingThinQR(int row, int column)
        {
            var matrixA  = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
            var factorQR = matrixA.QR(QRMethod.Thin);
            var q        = factorQR.Q;
            var r        = factorQR.R;

            // Make sure the R has the right dimensions.
            Assert.AreEqual(column, r.RowCount);
            Assert.AreEqual(column, r.ColumnCount);

            // Make sure the Q has the right dimensions.
            Assert.AreEqual(row, q.RowCount);
            Assert.AreEqual(column, q.ColumnCount);

            // Make sure the R factor is upper triangular.
            for (var i = 0; i < r.RowCount; i++)
            {
                for (var j = 0; j < r.ColumnCount; j++)
                {
                    if (i > j)
                    {
                        Assert.AreEqual(0.0, r[i, j]);
                    }
                }
            }

            // Make sure the Q*R is the original matrix.
            var matrixQfromR = q * r;

            for (var i = 0; i < matrixQfromR.RowCount; i++)
            {
                for (var j = 0; j < matrixQfromR.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixA[i, j], matrixQfromR[i, j], 1.0e-4);
                }
            }
        }
예제 #2
0
        public void CanFactorizeRandomMatrix([Values(1, 2, 5, 10, 50, 100)] int row, [Values(1, 2, 5, 6, 48, 98)] int column)
        {
            var matrixA           = MatrixLoader.GenerateRandomDenseMatrix(row, column);
            var factorGramSchmidt = matrixA.GramSchmidt();
            var q = factorGramSchmidt.Q;
            var r = factorGramSchmidt.R;

            // Make sure the Q has the right dimensions.
            Assert.AreEqual(row, q.RowCount);
            Assert.AreEqual(column, q.ColumnCount);

            // Make sure the R has the right dimensions.
            Assert.AreEqual(column, r.RowCount);
            Assert.AreEqual(column, r.ColumnCount);

            // Make sure the R factor is upper triangular.
            for (var i = 0; i < r.RowCount; i++)
            {
                for (var j = 0; j < r.ColumnCount; j++)
                {
                    if (i > j)
                    {
                        Assert.AreEqual(0.0, r[i, j]);
                    }
                }
            }

            // Make sure the Q*R is the original matrix.
            var matrixQfromR = q * r;

            for (var i = 0; i < matrixQfromR.RowCount; i++)
            {
                for (var j = 0; j < matrixQfromR.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixA[i, j], matrixQfromR[i, j], 1e-4);
                }
            }
        }
예제 #3
0
        public void CanSolveForRandomMatrixAndSymmetricMatrix(int order)
        {
            var matrixA = MatrixLoader.GenerateRandomPositiveDefiniteHermitianDenseMatrix(order);

            MatrixHelpers.ForceConjugateSymmetric(matrixA);
            var matrixACopy = matrixA.Clone();
            var factorEvd   = matrixA.Evd();

            var matrixB = MatrixLoader.GenerateRandomDenseMatrix(order, order);
            var matrixX = factorEvd.Solve(matrixB);

            // The solution X row dimension is equal to the column dimension of A
            Assert.AreEqual(matrixA.ColumnCount, matrixX.RowCount);

            // The solution X has the same number of columns as B
            Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);

            var matrixBReconstruct = matrixA * matrixX;

            // Check the reconstruction.
            for (var i = 0; i < matrixB.RowCount; i++)
            {
                for (var j = 0; j < matrixB.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixB[i, j].Real, matrixBReconstruct[i, j].Real, 1e-2f);
                    Assert.AreEqual(matrixB[i, j].Imaginary, matrixBReconstruct[i, j].Imaginary, 1e-2f);
                }
            }

            // Make sure A didn't change.
            for (var i = 0; i < matrixA.RowCount; i++)
            {
                for (var j = 0; j < matrixA.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixACopy[i, j], matrixA[i, j]);
                }
            }
        }
예제 #4
0
        public void CanFactorizeRandomMatrix(int row, int column)
        {
            var matrixA  = MatrixLoader.GenerateRandomDenseMatrix(row, column);
            var factorQR = matrixA.QR();
            var q        = factorQR.Q;
            var r        = factorQR.R;

            // Make sure the R has the right dimensions.
            Assert.AreEqual(row, r.RowCount);
            Assert.AreEqual(column, r.ColumnCount);

            // Make sure the Q has the right dimensions.
            Assert.AreEqual(row, q.RowCount);
            Assert.AreEqual(row, q.ColumnCount);

            // Make sure the R factor is upper triangular.
            for (var i = 0; i < r.RowCount; i++)
            {
                for (var j = 0; j < r.ColumnCount; j++)
                {
                    if (i > j)
                    {
                        Assert.AreEqual(Complex.Zero, r[i, j]);
                    }
                }
            }

            // Make sure the Q*R is the original matrix.
            var matrixQfromR = q * r;

            for (var i = 0; i < matrixQfromR.RowCount; i++)
            {
                for (var j = 0; j < matrixQfromR.ColumnCount; j++)
                {
                    AssertHelpers.AlmostEqual(matrixA[i, j], matrixQfromR[i, j], 9);
                }
            }
        }
예제 #5
0
        public void CanFactorizeRandomMatrix(int order)
        {
            var matrixA   = MatrixLoader.GenerateRandomDenseMatrix(order, order);
            var factorEvd = matrixA.Evd();

            Assert.AreEqual(order, factorEvd.EigenVectors().RowCount);
            Assert.AreEqual(order, factorEvd.EigenVectors().ColumnCount);

            Assert.AreEqual(order, factorEvd.D().RowCount);
            Assert.AreEqual(order, factorEvd.D().ColumnCount);

            // Make sure the A*V = λ*V
            var matrixAv = matrixA * factorEvd.EigenVectors();
            var matrixLv = factorEvd.EigenVectors() * factorEvd.D();

            for (var i = 0; i < matrixAv.RowCount; i++)
            {
                for (var j = 0; j < matrixAv.ColumnCount; j++)
                {
                    Assert.AreApproximatelyEqual(matrixAv[i, j], matrixLv[i, j], 1.0e-10);
                }
            }
        }
예제 #6
0
        public void CanSolveForRandomVector(int order)
        {
            var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
            var vectorb = MatrixLoader.GenerateRandomDenseVector(order);

            var monitor = new Iterator <double>(
                new IterationCountStopCriterium <double>(1000),
                new ResidualStopCriterium <double>(1e-10));

            var solver = new BiCgStab();

            var resultx = matrixA.SolveIterative(vectorb, solver, monitor);

            Assert.AreEqual(matrixA.ColumnCount, resultx.Count);

            var matrixBReconstruct = matrixA * resultx;

            // Check the reconstruction.
            for (var i = 0; i < order; i++)
            {
                Assert.AreEqual(vectorb[i], matrixBReconstruct[i], 1e-7);
            }
        }
예제 #7
0
        public void CanFactorizeRandomSymmetricMatrix(int order)
        {
            var matrixA   = MatrixLoader.GenerateRandomPositiveDefiniteHermitianDenseMatrix(order);
            var factorEvd = matrixA.Evd();

            Assert.AreEqual(order, factorEvd.EigenVectors().RowCount);
            Assert.AreEqual(order, factorEvd.EigenVectors().ColumnCount);

            Assert.AreEqual(order, factorEvd.D().RowCount);
            Assert.AreEqual(order, factorEvd.D().ColumnCount);

            // Make sure the A = V*λ*VT
            var matrix = factorEvd.EigenVectors() * factorEvd.D() * factorEvd.EigenVectors().ConjugateTranspose();

            for (var i = 0; i < matrix.RowCount; i++)
            {
                for (var j = 0; j < matrix.ColumnCount; j++)
                {
                    Assert.AreApproximatelyEqual(matrix[i, j].Real, matrixA[i, j].Real, 1e-3f);
                    Assert.AreApproximatelyEqual(matrix[i, j].Imaginary, matrixA[i, j].Imaginary, 1e-3f);
                }
            }
        }
예제 #8
0
        public void CanSolveForRandomVector(int order)
        {
            var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
            var vectorb = MatrixLoader.GenerateRandomDenseVector(order);

            var monitor = new Iterator(new IIterationStopCriterium<double>[]
                                       {
                                           new IterationCountStopCriterium(1000),
                                           new ResidualStopCriterium(1e-10),
                                       });
            var solver = new MlkBiCgStab(monitor);

            var resultx = solver.Solve(matrixA, vectorb);
            Assert.AreEqual(matrixA.ColumnCount, resultx.Count);

            var bReconstruct = matrixA * resultx;

            // Check the reconstruction.
            for (var i = 0; i < order; i++)
            {
                Assert.AreApproximatelyEqual(vectorb[i], bReconstruct[i], 1e-7);
            }
        }
예제 #9
0
        public void CanFactorizeRandomMatrix([Values(1, 2, 5, 10, 50, 100)] int order)
        {
            var matrixA   = MatrixLoader.GenerateRandomUserDefinedMatrix(order, order);
            var factorEvd = matrixA.Evd();

            Assert.AreEqual(order, factorEvd.EigenVectors().RowCount);
            Assert.AreEqual(order, factorEvd.EigenVectors().ColumnCount);

            Assert.AreEqual(order, factorEvd.D().RowCount);
            Assert.AreEqual(order, factorEvd.D().ColumnCount);

            // Make sure the A*V = λ*V
            var matrixAv = matrixA * factorEvd.EigenVectors();
            var matrixLv = factorEvd.EigenVectors() * factorEvd.D();

            for (var i = 0; i < matrixAv.RowCount; i++)
            {
                for (var j = 0; j < matrixAv.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixAv[i, j], matrixLv[i, j], 1e-3);
                }
            }
        }
예제 #10
0
        public void CanSolveForRandomVectorWhenResultVectorGiven(int order)
        {
            var matrixA     = MatrixLoader.GenerateRandomPositiveDefiniteHermitianDenseMatrix(order);
            var matrixACopy = matrixA.Clone();
            var chol        = matrixA.Cholesky();
            var matrixB     = MatrixLoader.GenerateRandomDenseVector(order);
            var matrixBCopy = matrixB.Clone();
            var x           = new DenseVector(order);

            chol.Solve(matrixB, x);

            Assert.AreEqual(matrixB.Count, x.Count);

            var matrixBReconstruct = matrixA * x;

            // Check the reconstruction.
            for (var i = 0; i < order; i++)
            {
                Assert.AreEqual(matrixB[i].Real, matrixBReconstruct[i].Real, 1e-3f);
                Assert.AreEqual(matrixB[i].Imaginary, matrixBReconstruct[i].Imaginary, 1e-3f);
            }

            // Make sure A didn't change.
            for (var i = 0; i < matrixA.RowCount; i++)
            {
                for (var j = 0; j < matrixA.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixACopy[i, j], matrixA[i, j]);
                }
            }

            // Make sure b didn't change.
            for (var i = 0; i < order; i++)
            {
                Assert.AreEqual(matrixBCopy[i], matrixB[i]);
            }
        }
예제 #11
0
        public void CanSolveForRandomVector([Values(4)] int order)
        {
            for (var iteration = 5; iteration > 3; iteration--)
            {
                var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
                var vectorb = MatrixLoader.GenerateRandomDenseVector(order);

                var monitor = new Iterator(new IIterationStopCriterium[]
                {
                    new IterationCountStopCriterium(1000),
                    new ResidualStopCriterium((float)Math.Pow(1.0 / 10.0, iteration)),
                });
                var solver = new GpBiCg(monitor);

                var resultx = solver.Solve(matrixA, vectorb);

                if (!(monitor.Status is CalculationConverged))
                {
                    // Solution was not found, try again downgrading convergence boundary
                    continue;
                }

                Assert.AreEqual(matrixA.ColumnCount, resultx.Count);
                var matrixBReconstruct = matrixA * resultx;

                // Check the reconstruction.
                for (var i = 0; i < order; i++)
                {
                    Assert.AreEqual(vectorb[i].Real, matrixBReconstruct[i].Real, (float)Math.Pow(1.0 / 10.0, iteration - 3));
                    Assert.AreEqual(vectorb[i].Imaginary, matrixBReconstruct[i].Imaginary, (float)Math.Pow(1.0 / 10.0, iteration - 3));
                }

                return;
            }

            Assert.Fail("Solution was not found in 3 tries");
        }
예제 #12
0
        public void CanSolveForRandomVectorAndSymmetricMatrixWhenResultVectorGiven(int order)
        {
            var matrixA = MatrixLoader.GenerateRandomPositiveDefiniteHermitianDenseMatrix(order);

            MatrixHelpers.ForceConjugateSymmetric(matrixA);
            var matrixACopy = matrixA.Clone();
            var factorEvd   = matrixA.Evd();
            var vectorb     = MatrixLoader.GenerateRandomDenseVector(order);
            var vectorbCopy = vectorb.Clone();
            var resultx     = new DenseVector(order);

            factorEvd.Solve(vectorb, resultx);

            var matrixBReconstruct = matrixA * resultx;

            // Check the reconstruction.
            for (var i = 0; i < vectorb.Count; i++)
            {
                Assert.AreEqual(vectorb[i].Real, matrixBReconstruct[i].Real, 1e-3f);
                Assert.AreEqual(vectorb[i].Imaginary, matrixBReconstruct[i].Imaginary, 1e-3f);
            }

            // Make sure A didn't change.
            for (var i = 0; i < matrixA.RowCount; i++)
            {
                for (var j = 0; j < matrixA.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixACopy[i, j], matrixA[i, j]);
                }
            }

            // Make sure b didn't change.
            for (var i = 0; i < vectorb.Count; i++)
            {
                Assert.AreEqual(vectorbCopy[i], vectorb[i]);
            }
        }
예제 #13
0
        public void CanSolveForRandomVectorWhenResultVectorGiven(int order)
        {
            var matrixA           = MatrixLoader.GenerateRandomUserDefinedMatrix(order, order);
            var matrixACopy       = matrixA.Clone();
            var factorGramSchmidt = matrixA.GramSchmidt();
            var vectorb           = MatrixLoader.GenerateRandomUserDefinedVector(order);
            var vectorbCopy       = vectorb.Clone();
            var resultx           = new UserDefinedVector(order);

            factorGramSchmidt.Solve(vectorb, resultx);

            Assert.AreEqual(vectorb.Count, resultx.Count);

            var bReconstruct = matrixA * resultx;

            // Check the reconstruction.
            for (var i = 0; i < vectorb.Count; i++)
            {
                Assert.AreApproximatelyEqual(vectorb[i].Real, bReconstruct[i].Real, 1.0e-9);
                Assert.AreApproximatelyEqual(vectorb[i].Imaginary, bReconstruct[i].Imaginary, 1.0e-9);
            }

            // Make sure A didn't change.
            for (var i = 0; i < matrixA.RowCount; i++)
            {
                for (var j = 0; j < matrixA.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixACopy[i, j], matrixA[i, j]);
                }
            }

            // Make sure b didn't change.
            for (var i = 0; i < vectorb.Count; i++)
            {
                Assert.AreEqual(vectorbCopy[i], vectorb[i]);
            }
        }
예제 #14
0
        public void CanSolveForRandomVectorWhenResultVectorGiven(int order)
        {
            var matrixA     = MatrixLoader.GenerateRandomPositiveDefiniteHermitianUserDefinedMatrix(order);
            var matrixACopy = matrixA.Clone();
            var chol        = matrixA.Cholesky();
            var b           = MatrixLoader.GenerateRandomUserDefinedVector(order);
            var bCopy       = b.Clone();
            var x           = new UserDefinedVector(order);

            chol.Solve(b, x);

            Assert.AreEqual(b.Count, x.Count);

            var bReconstruct = matrixA * x;

            // Check the reconstruction.
            for (var i = 0; i < order; i++)
            {
                Assert.AreApproximatelyEqual(b[i].Real, bReconstruct[i].Real, 1.0e-9);
                Assert.AreApproximatelyEqual(b[i].Imaginary, bReconstruct[i].Imaginary, 1.0e-9);
            }

            // Make sure A didn't change.
            for (var i = 0; i < matrixA.RowCount; i++)
            {
                for (var j = 0; j < matrixA.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixACopy[i, j], matrixA[i, j]);
                }
            }

            // Make sure b didn't change.
            for (var i = 0; i < order; i++)
            {
                Assert.AreEqual(bCopy[i], b[i]);
            }
        }
예제 #15
0
        public void CanSolveForRandomVector(int order)
        {
            // Due to datatype "float" it can happen that solution will not converge for specific random matrix
            // That's why we will do 4 tries and downgrade stop criterium each time
            for (var iteration = 6; iteration > 3; iteration--)
            {
                var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
                var vectorb = MatrixLoader.GenerateRandomDenseVector(order);

                var monitor = new Iterator(new IIterationStopCriterium[]
                {
                    new IterationCountStopCriterium(MaximumIterations),
                    new ResidualStopCriterium((float)Math.Pow(1.0 / 10.0, iteration)),
                });
                var solver  = new MlkBiCgStab(monitor);
                var resultx = solver.Solve(matrixA, vectorb);

                if (!(monitor.Status is CalculationConverged))
                {
                    // Solution was not found, try again downgrading convergence boundary
                    continue;
                }

                Assert.AreEqual(matrixA.ColumnCount, resultx.Count);
                var matrixBReconstruct = matrixA * resultx;

                // Check the reconstruction.
                for (var i = 0; i < order; i++)
                {
                    Assert.AreEqual(vectorb[i], matrixBReconstruct[i], (float)Math.Pow(1.0 / 10.0, iteration - 3));
                }

                return;
            }

            Assert.Fail("Solution was not found in 3 tries");
        }
예제 #16
0
        public void CanSolveForRandomVectorWhenResultVectorGiven(int order)
        {
            var matrixA     = MatrixLoader.GenerateRandomDenseMatrix(order, order);
            var matrixACopy = matrixA.Clone();
            var factorQR    = matrixA.QR();
            var vectorb     = MatrixLoader.GenerateRandomDenseVector(order);
            var vectorbCopy = vectorb.Clone();
            var resultx     = new DenseVector(order);

            factorQR.Solve(vectorb, resultx);

            Assert.AreEqual(vectorb.Count, resultx.Count);

            var matrixBReconstruct = matrixA * resultx;

            // Check the reconstruction.
            for (var i = 0; i < vectorb.Count; i++)
            {
                Assert.AreEqual(vectorb[i].Real, matrixBReconstruct[i].Real, 1e-3f);
                Assert.AreEqual(vectorb[i].Imaginary, matrixBReconstruct[i].Imaginary, 1e-3f);
            }

            // Make sure A didn't change.
            for (var i = 0; i < matrixA.RowCount; i++)
            {
                for (var j = 0; j < matrixA.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixACopy[i, j], matrixA[i, j]);
                }
            }

            // Make sure b didn't change.
            for (var i = 0; i < vectorb.Count; i++)
            {
                Assert.AreEqual(vectorbCopy[i], vectorb[i]);
            }
        }
예제 #17
0
        public void CanSolveForRandomMatrix(int row, int column)
        {
            var matrixA     = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
            var matrixACopy = matrixA.Clone();
            var factorSvd   = matrixA.Svd();

            var matrixB = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
            var matrixX = factorSvd.Solve(matrixB);

            // The solution X row dimension is equal to the column dimension of A
            Assert.AreEqual(matrixA.ColumnCount, matrixX.RowCount);

            // The solution X has the same number of columns as B
            Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);

            var matrixBReconstruct = matrixA * matrixX;

            // Check the reconstruction.
            for (var i = 0; i < matrixB.RowCount; i++)
            {
                for (var j = 0; j < matrixB.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixB[i, j].Real, matrixBReconstruct[i, j].Real, 1e-3f);
                    Assert.AreEqual(matrixB[i, j].Imaginary, matrixBReconstruct[i, j].Imaginary, 1e-3f);
                }
            }

            // Make sure A didn't change.
            for (var i = 0; i < matrixA.RowCount; i++)
            {
                for (var j = 0; j < matrixA.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixACopy[i, j], matrixA[i, j]);
                }
            }
        }
예제 #18
0
        public void CanSolveForRandomMatrixUsingThinQR(int order)
        {
            var matrixA     = MatrixLoader.GenerateRandomDenseMatrix(order, order);
            var matrixACopy = matrixA.Clone();
            var factorQR    = matrixA.QR(QRMethod.Thin);

            var matrixB = MatrixLoader.GenerateRandomDenseMatrix(order, order);
            var matrixX = factorQR.Solve(matrixB);

            // The solution X row dimension is equal to the column dimension of A
            Assert.AreEqual(matrixA.ColumnCount, matrixX.RowCount);

            // The solution X has the same number of columns as B
            Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);

            var matrixBReconstruct = matrixA * matrixX;

            // Check the reconstruction.
            for (var i = 0; i < matrixB.RowCount; i++)
            {
                for (var j = 0; j < matrixB.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixB[i, j].Real, matrixBReconstruct[i, j].Real, 1e-3);
                    Assert.AreEqual(matrixB[i, j].Imaginary, matrixBReconstruct[i, j].Imaginary, 1e-3);
                }
            }

            // Make sure A didn't change.
            for (var i = 0; i < matrixA.RowCount; i++)
            {
                for (var j = 0; j < matrixA.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixACopy[i, j], matrixA[i, j]);
                }
            }
        }
예제 #19
0
        public void CanSolveForRandomVectorWhenResultVectorGiven([Values(1, 2, 5, 10, 50, 100)] int order)
        {
            var matrixA     = MatrixLoader.GenerateRandomPositiveDefiniteUserDefinedMatrix(order);
            var matrixACopy = matrixA.Clone();
            var chol        = matrixA.Cholesky();
            var b           = MatrixLoader.GenerateRandomUserDefinedVector(order);
            var matrixBCopy = b.Clone();
            var x           = new UserDefinedVector(order);

            chol.Solve(b, x);

            Assert.AreEqual(b.Count, x.Count);

            var matrixBReconstruct = matrixA * x;

            // Check the reconstruction.
            for (var i = 0; i < order; i++)
            {
                Assert.AreEqual(b[i], matrixBReconstruct[i], 1e-3);
            }

            // Make sure A didn't change.
            for (var i = 0; i < matrixA.RowCount; i++)
            {
                for (var j = 0; j < matrixA.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixACopy[i, j], matrixA[i, j]);
                }
            }

            // Make sure b didn't change.
            for (var i = 0; i < order; i++)
            {
                Assert.AreEqual(matrixBCopy[i], b[i]);
            }
        }
예제 #20
0
        public void CanFactorizeRandomMatrix(int row, int column)
        {
            var matrixA           = MatrixLoader.GenerateRandomDenseMatrix(row, column);
            var factorGramSchmidt = matrixA.GramSchmidt();

            // Make sure the Q has the right dimensions.
            Assert.AreEqual(row, factorGramSchmidt.Q.RowCount);
            Assert.AreEqual(column, factorGramSchmidt.Q.ColumnCount);

            // Make sure the R has the right dimensions.
            Assert.AreEqual(column, factorGramSchmidt.R.RowCount);
            Assert.AreEqual(column, factorGramSchmidt.R.ColumnCount);

            // Make sure the R factor is upper triangular.
            for (var i = 0; i < factorGramSchmidt.R.RowCount; i++)
            {
                for (var j = 0; j < factorGramSchmidt.R.ColumnCount; j++)
                {
                    if (i > j)
                    {
                        Assert.AreEqual(0.0, factorGramSchmidt.R[i, j]);
                    }
                }
            }

            // Make sure the Q*R is the original matrix.
            var matrixQfromR = factorGramSchmidt.Q * factorGramSchmidt.R;

            for (var i = 0; i < matrixQfromR.RowCount; i++)
            {
                for (var j = 0; j < matrixQfromR.ColumnCount; j++)
                {
                    Assert.AreApproximatelyEqual(matrixA[i, j], matrixQfromR[i, j], 10e-5f);
                }
            }
        }
예제 #21
0
        public void CanFactorizeRandomMatrix([Values(1, 2, 5, 10, 50, 100)] int row, [Values(1, 2, 5, 6, 48, 98)] int column)
        {
            var matrixA  = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
            var factorQR = matrixA.QR();

            // Make sure the R has the right dimensions.
            Assert.AreEqual(row, factorQR.R.RowCount);
            Assert.AreEqual(column, factorQR.R.ColumnCount);

            // Make sure the Q has the right dimensions.
            Assert.AreEqual(row, factorQR.Q.RowCount);
            Assert.AreEqual(row, factorQR.Q.ColumnCount);

            // Make sure the R factor is upper triangular.
            for (var i = 0; i < factorQR.R.RowCount; i++)
            {
                for (var j = 0; j < factorQR.R.ColumnCount; j++)
                {
                    if (i > j)
                    {
                        Assert.AreEqual(0.0, factorQR.R[i, j]);
                    }
                }
            }

            // Make sure the Q*R is the original matrix.
            var matrixQfromR = factorQR.Q * factorQR.R;

            for (var i = 0; i < matrixQfromR.RowCount; i++)
            {
                for (var j = 0; j < matrixQfromR.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixA[i, j], matrixQfromR[i, j], 1e-4);
                }
            }
        }
예제 #22
0
파일: TFQMRTest.cs 프로젝트: wibble82/mmbot
        public void CanSolveForRandomVector([Values(4, 8, 10)] int order)
        {
            var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
            var vectorb = MatrixLoader.GenerateRandomDenseVector(order);

            var monitor = new Iterator(new IIterationStopCriterium[]
            {
                new IterationCountStopCriterium(1000),
                new ResidualStopCriterium(1e-10),
            });
            var solver = new TFQMR(monitor);

            var resultx = solver.Solve(matrixA, vectorb);

            Assert.AreEqual(matrixA.ColumnCount, resultx.Count);

            var matrixBReconstruct = matrixA * resultx;

            // Check the reconstruction.
            for (var i = 0; i < order; i++)
            {
                Assert.AreEqual(vectorb[i], matrixBReconstruct[i], 1e-7);
            }
        }
예제 #23
0
파일: EvdTests.cs 프로젝트: wibble82/mmbot
        public void CanFactorizeRandomSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order)
        {
            var matrixA      = MatrixLoader.GenerateRandomPositiveDefiniteHermitianDenseMatrix(order);
            var factorEvd    = matrixA.Evd();
            var eigenVectors = factorEvd.EigenVectors();
            var d            = factorEvd.D();

            Assert.AreEqual(order, eigenVectors.RowCount);
            Assert.AreEqual(order, eigenVectors.ColumnCount);

            Assert.AreEqual(order, d.RowCount);
            Assert.AreEqual(order, d.ColumnCount);

            // Make sure the A = V*λ*VT
            var matrix = eigenVectors * d * eigenVectors.ConjugateTranspose();

            for (var i = 0; i < matrix.RowCount; i++)
            {
                for (var j = 0; j < matrix.ColumnCount; j++)
                {
                    AssertHelpers.AlmostEqual(matrix[i, j], matrixA[i, j], 3);
                }
            }
        }
예제 #24
0
        public void CanSolveForRandomVectorWhenResultVectorGivenUsingThinQR(int order)
        {
            var matrixA     = MatrixLoader.GenerateRandomUserDefinedMatrix(order, order);
            var matrixACopy = matrixA.Clone();
            var factorQR    = matrixA.QR(QRMethod.Thin);
            var vectorb     = MatrixLoader.GenerateRandomUserDefinedVector(order);
            var vectorbCopy = vectorb.Clone();
            var resultx     = new UserDefinedVector(order);

            factorQR.Solve(vectorb, resultx);

            Assert.AreEqual(vectorb.Count, resultx.Count);

            var matrixBReconstruct = matrixA * resultx;

            // Check the reconstruction.
            for (var i = 0; i < vectorb.Count; i++)
            {
                Assert.AreEqual(vectorb[i], matrixBReconstruct[i], 1e-4);
            }

            // Make sure A didn't change.
            for (var i = 0; i < matrixA.RowCount; i++)
            {
                for (var j = 0; j < matrixA.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixACopy[i, j], matrixA[i, j]);
                }
            }

            // Make sure b didn't change.
            for (var i = 0; i < vectorb.Count; i++)
            {
                Assert.AreEqual(vectorbCopy[i], vectorb[i]);
            }
        }
예제 #25
0
        public void CanSolveForRandomVector(int order)
        {
            for (var iteration = 5; iteration > 3; iteration--)
            {
                var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
                var vectorb = MatrixLoader.GenerateRandomDenseVector(order);

                var monitor = new Iterator <Complex32>(
                    new IterationCountStopCriterium <Complex32>(1000),
                    new ResidualStopCriterium <Complex32>(Math.Pow(1.0 / 10.0, iteration)));

                var solver = new TFQMR();

                var resultx = matrixA.SolveIterative(vectorb, solver, monitor);

                if (monitor.Status != IterationStatus.Converged)
                {
                    // Solution was not found, try again downgrading convergence boundary
                    continue;
                }

                Assert.AreEqual(matrixA.ColumnCount, resultx.Count);
                var matrixBReconstruct = matrixA * resultx;

                // Check the reconstruction.
                for (var i = 0; i < order; i++)
                {
                    Assert.AreEqual(vectorb[i].Real, matrixBReconstruct[i].Real, (float)Math.Pow(1.0 / 10.0, iteration - 3));
                    Assert.AreEqual(vectorb[i].Imaginary, matrixBReconstruct[i].Imaginary, (float)Math.Pow(1.0 / 10.0, iteration - 3));
                }

                return;
            }

            Assert.Fail("Solution was not found in 3 tries");
        }
예제 #26
0
        public void CanSolveForRandomVectorWhenResultVectorGiven([Values(1, 2, 5, 10, 50, 100)] int order)
        {
            var matrixA           = MatrixLoader.GenerateRandomDenseMatrix(order, order);
            var matrixACopy       = matrixA.Clone();
            var factorGramSchmidt = matrixA.GramSchmidt();
            var vectorb           = MatrixLoader.GenerateRandomDenseVector(order);
            var vectorbCopy       = vectorb.Clone();
            var resultx           = new DenseVector(order);

            factorGramSchmidt.Solve(vectorb, resultx);

            Assert.AreEqual(vectorb.Count, resultx.Count);

            var matrixBReconstruct = matrixA * resultx;

            // Check the reconstruction.
            for (var i = 0; i < vectorb.Count; i++)
            {
                AssertHelpers.AlmostEqual(vectorb[i], matrixBReconstruct[i], 9);
            }

            // Make sure A didn't change.
            for (var i = 0; i < matrixA.RowCount; i++)
            {
                for (var j = 0; j < matrixA.ColumnCount; j++)
                {
                    Assert.AreEqual(matrixACopy[i, j], matrixA[i, j]);
                }
            }

            // Make sure b didn't change.
            for (var i = 0; i < vectorb.Count; i++)
            {
                Assert.AreEqual(vectorbCopy[i], vectorb[i]);
            }
        }
예제 #27
0
        public void CanFactorizeRandomMatrix([Values(1, 2, 5, 10, 50, 100)] int order)
        {
            var matrixA      = MatrixLoader.GenerateRandomDenseMatrix(order, order);
            var factorEvd    = matrixA.Evd();
            var eigenVectors = factorEvd.EigenVectors();

            Assert.AreEqual(order, eigenVectors.RowCount);
            Assert.AreEqual(order, eigenVectors.ColumnCount);

            Assert.AreEqual(order, factorEvd.D().RowCount);
            Assert.AreEqual(order, factorEvd.D().ColumnCount);

            // Make sure the A*V = λ*V
            var matrixAv = matrixA * eigenVectors;
            var matrixLv = eigenVectors * factorEvd.D();

            for (var i = 0; i < matrixAv.RowCount; i++)
            {
                for (var j = 0; j < matrixAv.ColumnCount; j++)
                {
                    AssertHelpers.AlmostEqual(matrixAv[i, j], matrixLv[i, j], 7);
                }
            }
        }
예제 #28
0
        public void CanFactorizeRandomSymmetricMatrix(int order)
        {
            var matrixA      = MatrixLoader.GenerateRandomPositiveDefiniteUserDefinedMatrix(order);
            var factorEvd    = matrixA.Evd();
            var eigenVectors = factorEvd.EigenVectors();
            var d            = factorEvd.D();

            Assert.AreEqual(order, eigenVectors.RowCount);
            Assert.AreEqual(order, eigenVectors.ColumnCount);

            Assert.AreEqual(order, d.RowCount);
            Assert.AreEqual(order, d.ColumnCount);

            // Make sure the A = V*λ*VT
            var matrix = eigenVectors * d * eigenVectors.Transpose();

            for (var i = 0; i < matrix.RowCount; i++)
            {
                for (var j = 0; j < matrix.ColumnCount; j++)
                {
                    Assert.AreEqual(matrix[i, j], matrixA[i, j], 1.0e-10);
                }
            }
        }
예제 #29
0
 public void FailSampleStatic(int rowsOfM, int columnsOfM, int rowsOfV, int columnsOfV, int rowsOfK, int columnsOfK)
 {
     Assert.Throws <ArgumentOutOfRangeException>(() => MatrixNormal.Sample(new Random(), MatrixLoader.GenerateRandomDenseMatrix(rowsOfM, columnsOfM), MatrixLoader.GenerateRandomDenseMatrix(rowsOfV, columnsOfV), MatrixLoader.GenerateRandomDenseMatrix(rowsOfK, columnsOfK)));
 }
예제 #30
0
 public void CanSampleStatic(int n, int p)
 {
     MatrixNormal.Sample(new Random(), MatrixLoader.GenerateRandomDenseMatrix(n, p), MatrixLoader.GenerateRandomPositiveDefiniteDenseMatrix(n), MatrixLoader.GenerateRandomPositiveDefiniteDenseMatrix(p));
 }