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