public void CanSolveForVectorWithTallRandomMatrix()
        {
            var matrixA     = MatrixLoader.GenerateRandomDenseMatrix(20, 10);
            var matrixACopy = matrixA.Clone();
            var factorQR    = matrixA.GramSchmidt();

            var vectorB = MatrixLoader.GenerateRandomDenseVector(20);
            var vectorX = factorQR.Solve(vectorB);

            // The solution x dimension is equal to the column dimension of A
            Assert.AreEqual(matrixA.ColumnCount, vectorX.Count);

            var test = (matrixA.Transpose() * matrixA).Inverse() * matrixA.Transpose() * vectorB;

            for (var i = 0; i < vectorX.Count; i++)
            {
                AssertHelpers.AlmostEqualAbsolute(test[i], vectorX[i], 12);
            }

            // 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]);
                }
            }
        }
        public void CanSolveForMatrixWithTallRandomMatrix()
        {
            var matrixA     = MatrixLoader.GenerateRandomDenseMatrix(20, 10);
            var matrixACopy = matrixA.Clone();
            var factorQR    = matrixA.GramSchmidt();

            var matrixB = MatrixLoader.GenerateRandomDenseMatrix(20, 5);
            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 test = (matrixA.Transpose() * matrixA).Inverse() * matrixA.Transpose() * matrixB;

            for (var i = 0; i < matrixX.RowCount; i++)
            {
                for (var j = 0; j < matrixX.ColumnCount; j++)
                {
                    AssertHelpers.AlmostEqualAbsolute(test[i, j], matrixX[i, j], 12);
                }
            }

            // 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]);
                }
            }
        }