diff --git a/src/Numerics.Tests/LinearAlgebraTests/Complex/MatrixTests.Arithmetic.cs b/src/Numerics.Tests/LinearAlgebraTests/Complex/MatrixTests.Arithmetic.cs index 42e76d72..e0d253d1 100644 --- a/src/Numerics.Tests/LinearAlgebraTests/Complex/MatrixTests.Arithmetic.cs +++ b/src/Numerics.Tests/LinearAlgebraTests/Complex/MatrixTests.Arithmetic.cs @@ -819,6 +819,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex Assert.That(() => matrix.Negate(target), Throws.ArgumentException); } + /// + /// Can compute Moore-Penrose Pseudo-Inverse. + /// + [TestCase("Square3x3")] + [TestCase("Wide2x3")] + [TestCase("Tall3x2")] + public virtual void CanComputePseudoInverse(string name) + { + var matrix = TestMatrices[name]; + var inverse = matrix.PseudoInverse(); + // Testing for Moore–Penrose conditions 1: A*A^+*A = A + AssertHelpers.AlmostEqual(matrix, matrix * inverse * matrix, 12); + } + /// /// Can calculate Kronecker product. /// diff --git a/src/Numerics.Tests/LinearAlgebraTests/Complex32/MatrixTests.Arithmetic.cs b/src/Numerics.Tests/LinearAlgebraTests/Complex32/MatrixTests.Arithmetic.cs index d48c3da4..51e1f335 100644 --- a/src/Numerics.Tests/LinearAlgebraTests/Complex32/MatrixTests.Arithmetic.cs +++ b/src/Numerics.Tests/LinearAlgebraTests/Complex32/MatrixTests.Arithmetic.cs @@ -820,6 +820,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32 Assert.That(() => matrix.Negate(target), Throws.ArgumentException); } + /// + /// Can compute Moore-Penrose Pseudo-Inverse. + /// + [TestCase("Square3x3")] + [TestCase("Wide2x3")] + [TestCase("Tall3x2")] + public virtual void CanComputePseudoInverse(string name) + { + var matrix = TestMatrices[name]; + var inverse = matrix.PseudoInverse(); + // Testing for Moore–Penrose conditions 1: A*A^+*A = A + AssertHelpers.AlmostEqual(matrix, matrix * inverse * matrix, 5); + } + /// /// Can calculate Kronecker product. /// diff --git a/src/Numerics.Tests/LinearAlgebraTests/Double/MatrixTests.Arithmetic.cs b/src/Numerics.Tests/LinearAlgebraTests/Double/MatrixTests.Arithmetic.cs index 94e64420..4b0703fe 100644 --- a/src/Numerics.Tests/LinearAlgebraTests/Double/MatrixTests.Arithmetic.cs +++ b/src/Numerics.Tests/LinearAlgebraTests/Double/MatrixTests.Arithmetic.cs @@ -813,6 +813,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double Assert.That(() => matrix.Negate(target), Throws.ArgumentException); } + /// + /// Can compute Moore-Penrose Pseudo-Inverse. + /// + [TestCase("Square3x3")] + [TestCase("Wide2x3")] + [TestCase("Tall3x2")] + public virtual void CanComputePseudoInverse(string name) + { + var matrix = TestMatrices[name]; + var inverse = matrix.PseudoInverse(); + // Testing for Moore–Penrose conditions 1: A*A^+*A = A + AssertHelpers.AlmostEqual(matrix, matrix * inverse * matrix, 12); + } + /// /// Can calculate Kronecker product. /// diff --git a/src/Numerics.Tests/LinearAlgebraTests/Single/MatrixTests.Arithmetic.cs b/src/Numerics.Tests/LinearAlgebraTests/Single/MatrixTests.Arithmetic.cs index a5302682..9f609905 100644 --- a/src/Numerics.Tests/LinearAlgebraTests/Single/MatrixTests.Arithmetic.cs +++ b/src/Numerics.Tests/LinearAlgebraTests/Single/MatrixTests.Arithmetic.cs @@ -808,6 +808,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single Assert.That(() => matrix.Negate(target), Throws.ArgumentException); } + /// + /// Can compute Moore-Penrose Pseudo-Inverse. + /// + [TestCase("Square3x3")] + [TestCase("Wide2x3")] + [TestCase("Tall3x2")] + public virtual void CanComputePseudoInverse(string name) + { + var matrix = TestMatrices[name]; + var inverse = matrix.PseudoInverse(); + // Testing for Moore–Penrose conditions 1: A*A^+*A = A + AssertHelpers.AlmostEqual(matrix, matrix * inverse * matrix, 5); + } + /// /// Can calculate Kronecker product. ///