Browse Source

LA: default to enable the computation of SVD vectors; cosmetics

optimization-1
Christoph Ruegg 13 years ago
parent
commit
57a2916866
  1. 12
      src/Examples/LinearAlgebra/DirectSolvers.cs
  2. 11
      src/Examples/LinearAlgebra/Factorization/Svd.cs
  3. 2
      src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs
  4. 2
      src/Numerics/LinearAlgebra/Complex/Matrix.cs
  5. 2
      src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs
  6. 2
      src/Numerics/LinearAlgebra/Complex32/Matrix.cs
  7. 2
      src/Numerics/LinearAlgebra/Double/DenseMatrix.cs
  8. 2
      src/Numerics/LinearAlgebra/Double/Matrix.cs
  9. 63
      src/Numerics/LinearAlgebra/Matrix.Solve.cs
  10. 2
      src/Numerics/LinearAlgebra/Single/DenseMatrix.cs
  11. 2
      src/Numerics/LinearAlgebra/Single/Matrix.cs
  12. 29
      src/UnitTests/LinearAlgebraTests/Complex/Factorization/SvdTests.cs
  13. 29
      src/UnitTests/LinearAlgebraTests/Complex/Factorization/UserSvdTests.cs
  14. 29
      src/UnitTests/LinearAlgebraTests/Complex32/Factorization/SvdTests.cs
  15. 29
      src/UnitTests/LinearAlgebraTests/Complex32/Factorization/UserSvdTests.cs
  16. 29
      src/UnitTests/LinearAlgebraTests/Double/Factorization/SvdTests.cs
  17. 29
      src/UnitTests/LinearAlgebraTests/Double/Factorization/UserSvdTests.cs
  18. 29
      src/UnitTests/LinearAlgebraTests/Single/Factorization/SvdTests.cs
  19. 29
      src/UnitTests/LinearAlgebraTests/Single/Factorization/UserSvdTests.cs

12
src/Examples/LinearAlgebra/DirectSolvers.cs

@ -64,7 +64,7 @@ namespace Examples.LinearAlgebraExamples
public void Run() public void Run()
{ {
// Format matrix output to console // Format matrix output to console
var formatProvider = (CultureInfo)CultureInfo.InvariantCulture.Clone(); var formatProvider = (CultureInfo) CultureInfo.InvariantCulture.Clone();
formatProvider.TextInfo.ListSeparator = " "; formatProvider.TextInfo.ListSeparator = " ";
// Solve next system of linear equations (Ax=b): // Solve next system of linear equations (Ax=b):
@ -73,13 +73,13 @@ namespace Examples.LinearAlgebraExamples
// 4*x + 1*y + 5*z = 43 // 4*x + 1*y + 5*z = 43
// Create matrix "A" with coefficients // Create matrix "A" with coefficients
var matrixA = DenseMatrix.OfArray(new[,] { { 5.00, 2.00, -4.00 }, { 3.00, -7.00, 6.00 }, { 4.00, 1.00, 5.00 } }); var matrixA = DenseMatrix.OfArray(new[,] {{5.00, 2.00, -4.00}, {3.00, -7.00, 6.00}, {4.00, 1.00, 5.00}});
Console.WriteLine(@"Matrix 'A' with coefficients"); Console.WriteLine(@"Matrix 'A' with coefficients");
Console.WriteLine(matrixA.ToString("#0.00\t", formatProvider)); Console.WriteLine(matrixA.ToString("#0.00\t", formatProvider));
Console.WriteLine(); Console.WriteLine();
// Create vector "b" with the constant terms. // Create vector "b" with the constant terms.
var vectorB = new DenseVector(new[] { -7.0, 38.0, 43.0 }); var vectorB = new DenseVector(new[] {-7.0, 38.0, 43.0});
Console.WriteLine(@"Vector 'b' with the constant terms"); Console.WriteLine(@"Vector 'b' with the constant terms");
Console.WriteLine(vectorB.ToString("#0.00\t", formatProvider)); Console.WriteLine(vectorB.ToString("#0.00\t", formatProvider));
Console.WriteLine(); Console.WriteLine();
@ -97,7 +97,7 @@ namespace Examples.LinearAlgebraExamples
Console.WriteLine(); Console.WriteLine();
// 3. Solve linear equations using SVD decomposition // 3. Solve linear equations using SVD decomposition
matrixA.Svd(true).Solve(vectorB, resultX); matrixA.Svd().Solve(vectorB, resultX);
Console.WriteLine(@"3. Solution using SVD decomposition"); Console.WriteLine(@"3. Solution using SVD decomposition");
Console.WriteLine(resultX.ToString("#0.00\t", formatProvider)); Console.WriteLine(resultX.ToString("#0.00\t", formatProvider));
Console.WriteLine(); Console.WriteLine();
@ -109,7 +109,7 @@ namespace Examples.LinearAlgebraExamples
Console.WriteLine(); Console.WriteLine();
// 5. Verify result. Multiply coefficient matrix "A" by result vector "x" // 5. Verify result. Multiply coefficient matrix "A" by result vector "x"
var reconstructVecorB = matrixA * resultX; var reconstructVecorB = matrixA*resultX;
Console.WriteLine(@"5. Multiply coefficient matrix 'A' by result vector 'x'"); Console.WriteLine(@"5. Multiply coefficient matrix 'A' by result vector 'x'");
Console.WriteLine(reconstructVecorB.ToString("#0.00\t", formatProvider)); Console.WriteLine(reconstructVecorB.ToString("#0.00\t", formatProvider));
Console.WriteLine(); Console.WriteLine();
@ -135,7 +135,7 @@ namespace Examples.LinearAlgebraExamples
Console.WriteLine(); Console.WriteLine();
// 8. Verify result. Multiply new coefficient matrix "A" by result vector "x" // 8. Verify result. Multiply new coefficient matrix "A" by result vector "x"
reconstructVecorB = newMatrixA * resultX; reconstructVecorB = newMatrixA*resultX;
Console.WriteLine(@"8. Multiply new coefficient matrix 'A' by result vector 'x'"); Console.WriteLine(@"8. Multiply new coefficient matrix 'A' by result vector 'x'");
Console.WriteLine(reconstructVecorB.ToString("#0.00\t", formatProvider)); Console.WriteLine(reconstructVecorB.ToString("#0.00\t", formatProvider));
Console.WriteLine(); Console.WriteLine();

11
src/Examples/LinearAlgebra/Factorization/Svd.cs

@ -26,7 +26,6 @@
using System; using System;
using System.Globalization; using System.Globalization;
using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Double; using MathNet.Numerics.LinearAlgebra.Double;
namespace Examples.LinearAlgebra.FactorizationExamples namespace Examples.LinearAlgebra.FactorizationExamples
@ -73,17 +72,17 @@ namespace Examples.LinearAlgebra.FactorizationExamples
public void Run() public void Run()
{ {
// Format matrix output to console // Format matrix output to console
var formatProvider = (CultureInfo)CultureInfo.InvariantCulture.Clone(); var formatProvider = (CultureInfo) CultureInfo.InvariantCulture.Clone();
formatProvider.TextInfo.ListSeparator = " "; formatProvider.TextInfo.ListSeparator = " ";
// Create square matrix // Create square matrix
var matrix = DenseMatrix.OfArray(new[,] { { 4.0, 1.0 }, { 3.0, 2.0 } }); var matrix = DenseMatrix.OfArray(new[,] {{4.0, 1.0}, {3.0, 2.0}});
Console.WriteLine(@"Initial square matrix"); Console.WriteLine(@"Initial square matrix");
Console.WriteLine(matrix.ToString("#0.00\t", formatProvider)); Console.WriteLine(matrix.ToString("#0.00\t", formatProvider));
Console.WriteLine(); Console.WriteLine();
// Perform full SVD decomposition // Perform full SVD decomposition
var svd = matrix.Svd(true); var svd = matrix.Svd();
Console.WriteLine(@"Perform full SVD decomposition"); Console.WriteLine(@"Perform full SVD decomposition");
// 1. Left singular vectors // 1. Left singular vectors
@ -107,7 +106,7 @@ namespace Examples.LinearAlgebra.FactorizationExamples
Console.WriteLine(); Console.WriteLine();
// 5. Multiply U matrix by its transpose // 5. Multiply U matrix by its transpose
var identinty = svd.U * svd.U.Transpose(); var identinty = svd.U*svd.U.Transpose();
Console.WriteLine(@"5. Multiply U matrix by its transpose"); Console.WriteLine(@"5. Multiply U matrix by its transpose");
Console.WriteLine(identinty.ToString("#0.00\t", formatProvider)); Console.WriteLine(identinty.ToString("#0.00\t", formatProvider));
Console.WriteLine(); Console.WriteLine();
@ -119,7 +118,7 @@ namespace Examples.LinearAlgebra.FactorizationExamples
Console.WriteLine(); Console.WriteLine();
// 7. Reconstruct initial matrix: A = U*Σ*VT // 7. Reconstruct initial matrix: A = U*Σ*VT
var reconstruct = svd.U * svd.W * svd.VT; var reconstruct = svd.U*svd.W*svd.VT;
Console.WriteLine(@"7. Reconstruct initial matrix: A = U*S*VT"); Console.WriteLine(@"7. Reconstruct initial matrix: A = U*S*VT");
Console.WriteLine(reconstruct.ToString("#0.00\t", formatProvider)); Console.WriteLine(reconstruct.ToString("#0.00\t", formatProvider));
Console.WriteLine(); Console.WriteLine();

2
src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs

@ -1029,7 +1029,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
return DenseGramSchmidt.Create(this); return DenseGramSchmidt.Create(this);
} }
public override Svd<Complex> Svd(bool computeVectors) public override Svd<Complex> Svd(bool computeVectors = true)
{ {
return DenseSvd.Create(this, computeVectors); return DenseSvd.Create(this, computeVectors);
} }

2
src/Numerics/LinearAlgebra/Complex/Matrix.cs

@ -478,7 +478,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
return UserGramSchmidt.Create(this); return UserGramSchmidt.Create(this);
} }
public override Svd<Complex> Svd(bool computeVectors) public override Svd<Complex> Svd(bool computeVectors = true)
{ {
return UserSvd.Create(this, computeVectors); return UserSvd.Create(this, computeVectors);
} }

2
src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs

@ -1024,7 +1024,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
return DenseGramSchmidt.Create(this); return DenseGramSchmidt.Create(this);
} }
public override Svd<Complex32> Svd(bool computeVectors) public override Svd<Complex32> Svd(bool computeVectors = true)
{ {
return DenseSvd.Create(this, computeVectors); return DenseSvd.Create(this, computeVectors);
} }

2
src/Numerics/LinearAlgebra/Complex32/Matrix.cs

@ -473,7 +473,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
return UserGramSchmidt.Create(this); return UserGramSchmidt.Create(this);
} }
public override Svd<Complex32> Svd(bool computeVectors) public override Svd<Complex32> Svd(bool computeVectors = true)
{ {
return UserSvd.Create(this, computeVectors); return UserSvd.Create(this, computeVectors);
} }

2
src/Numerics/LinearAlgebra/Double/DenseMatrix.cs

@ -1055,7 +1055,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
return DenseGramSchmidt.Create(this); return DenseGramSchmidt.Create(this);
} }
public override Svd<double> Svd(bool computeVectors) public override Svd<double> Svd(bool computeVectors = true)
{ {
return DenseSvd.Create(this, computeVectors); return DenseSvd.Create(this, computeVectors);
} }

2
src/Numerics/LinearAlgebra/Double/Matrix.cs

@ -479,7 +479,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
return UserGramSchmidt.Create(this); return UserGramSchmidt.Create(this);
} }
public override Svd<double> Svd(bool computeVectors) public override Svd<double> Svd(bool computeVectors = true)
{ {
return UserSvd.Create(this, computeVectors); return UserSvd.Create(this, computeVectors);
} }

63
src/Numerics/LinearAlgebra/Matrix.Solve.cs

@ -72,7 +72,7 @@ namespace MathNet.Numerics.LinearAlgebra
/// </summary> /// </summary>
/// <param name="computeVectors">Compute the singular U and VT vectors or not.</param> /// <param name="computeVectors">Compute the singular U and VT vectors or not.</param>
/// <returns>The SVD decomposition object.</returns> /// <returns>The SVD decomposition object.</returns>
public abstract Svd<T> Svd(bool computeVectors); public abstract Svd<T> Svd(bool computeVectors = true);
/// <summary> /// <summary>
/// Computes the EVD decomposition for a matrix. /// Computes the EVD decomposition for a matrix.
@ -214,24 +214,55 @@ namespace MathNet.Numerics.LinearAlgebra
return iterator.Status; return iterator.Status;
} }
/// <summary>
/// Solves the matrix equation Ax = b, where A is the coefficient matrix (this matrix), b is the solution vector and x is the unknown vector.
/// </summary>
/// <param name="input">The solution vector <c>b</c>.</param>
/// <param name="result">The result vector <c>x</c>.</param>
/// <param name="solver">The iterative solver to use.</param>
/// <param name="stopCriteria">Criteria to control when to stop iterating.</param>
/// <param name="preconditioner">The preconditioner to use for approximations.</param>
public IterationStatus TrySolveIterative(Vector<T> input, Vector<T> result, IIterativeSolver<T> solver, IPreconditioner<T> preconditioner, params IIterationStopCriterium<T>[] stopCriteria) public IterationStatus TrySolveIterative(Vector<T> input, Vector<T> result, IIterativeSolver<T> solver, IPreconditioner<T> preconditioner, params IIterationStopCriterium<T>[] stopCriteria)
{ {
var iterator = new Iterator<T>(stopCriteria.Length == 0 ? Builder.IterativeSolverStopCriteria() : stopCriteria); var iterator = new Iterator<T>(stopCriteria.Length == 0 ? Builder.IterativeSolverStopCriteria() : stopCriteria);
return TrySolveIterative(input, result, solver, iterator, preconditioner); return TrySolveIterative(input, result, solver, iterator, preconditioner);
} }
/// <summary>
/// Solves the matrix equation AX = B, where A is the coefficient matrix (this matrix), B is the solution matrix and X is the unknown matrix.
/// </summary>
/// <param name="input">The solution matrix <c>B</c>.</param>
/// <param name="result">The result matrix <c>X</c></param>
/// <param name="solver">The iterative solver to use.</param>
/// <param name="stopCriteria">Criteria to control when to stop iterating.</param>
/// <param name="preconditioner">The preconditioner to use for approximations.</param>
public IterationStatus TrySolveIterative(Matrix<T> input, Matrix<T> result, IIterativeSolver<T> solver, IPreconditioner<T> preconditioner, params IIterationStopCriterium<T>[] stopCriteria) public IterationStatus TrySolveIterative(Matrix<T> input, Matrix<T> result, IIterativeSolver<T> solver, IPreconditioner<T> preconditioner, params IIterationStopCriterium<T>[] stopCriteria)
{ {
var iterator = new Iterator<T>(stopCriteria.Length == 0 ? Builder.IterativeSolverStopCriteria() : stopCriteria); var iterator = new Iterator<T>(stopCriteria.Length == 0 ? Builder.IterativeSolverStopCriteria() : stopCriteria);
return TrySolveIterative(input, result, solver, iterator, preconditioner); return TrySolveIterative(input, result, solver, iterator, preconditioner);
} }
/// <summary>
/// Solves the matrix equation Ax = b, where A is the coefficient matrix (this matrix), b is the solution vector and x is the unknown vector.
/// </summary>
/// <param name="input">The solution vector <c>b</c>.</param>
/// <param name="result">The result vector <c>x</c>.</param>
/// <param name="solver">The iterative solver to use.</param>
/// <param name="stopCriteria">Criteria to control when to stop iterating.</param>
public IterationStatus TrySolveIterative(Vector<T> input, Vector<T> result, IIterativeSolver<T> solver, params IIterationStopCriterium<T>[] stopCriteria) public IterationStatus TrySolveIterative(Vector<T> input, Vector<T> result, IIterativeSolver<T> solver, params IIterationStopCriterium<T>[] stopCriteria)
{ {
var iterator = new Iterator<T>(stopCriteria.Length == 0 ? Builder.IterativeSolverStopCriteria() : stopCriteria); var iterator = new Iterator<T>(stopCriteria.Length == 0 ? Builder.IterativeSolverStopCriteria() : stopCriteria);
return TrySolveIterative(input, result, solver, iterator); return TrySolveIterative(input, result, solver, iterator);
} }
/// <summary>
/// Solves the matrix equation AX = B, where A is the coefficient matrix (this matrix), B is the solution matrix and X is the unknown matrix.
/// </summary>
/// <param name="input">The solution matrix <c>B</c>.</param>
/// <param name="result">The result matrix <c>X</c></param>
/// <param name="solver">The iterative solver to use.</param>
/// <param name="stopCriteria">Criteria to control when to stop iterating.</param>
public IterationStatus TrySolveIterative(Matrix<T> input, Matrix<T> result, IIterativeSolver<T> solver, params IIterationStopCriterium<T>[] stopCriteria) public IterationStatus TrySolveIterative(Matrix<T> input, Matrix<T> result, IIterativeSolver<T> solver, params IIterationStopCriterium<T>[] stopCriteria)
{ {
var iterator = new Iterator<T>(stopCriteria.Length == 0 ? Builder.IterativeSolverStopCriteria() : stopCriteria); var iterator = new Iterator<T>(stopCriteria.Length == 0 ? Builder.IterativeSolverStopCriteria() : stopCriteria);
@ -272,6 +303,14 @@ namespace MathNet.Numerics.LinearAlgebra
return result; return result;
} }
/// <summary>
/// Solves the matrix equation Ax = b, where A is the coefficient matrix (this matrix), b is the solution vector and x is the unknown vector.
/// </summary>
/// <param name="input">The solution vector <c>b</c>.</param>
/// <param name="solver">The iterative solver to use.</param>
/// <param name="stopCriteria">Criteria to control when to stop iterating.</param>
/// <param name="preconditioner">The preconditioner to use for approximations.</param>
/// <returns>The result vector <c>x</c>.</returns>
public Vector<T> SolveIterative(Vector<T> input, IIterativeSolver<T> solver, IPreconditioner<T> preconditioner, params IIterationStopCriterium<T>[] stopCriteria) public Vector<T> SolveIterative(Vector<T> input, IIterativeSolver<T> solver, IPreconditioner<T> preconditioner, params IIterationStopCriterium<T>[] stopCriteria)
{ {
var result = Builder.DenseVector(RowCount); var result = Builder.DenseVector(RowCount);
@ -279,6 +318,14 @@ namespace MathNet.Numerics.LinearAlgebra
return result; return result;
} }
/// <summary>
/// Solves the matrix equation AX = B, where A is the coefficient matrix (this matrix), B is the solution matrix and X is the unknown matrix.
/// </summary>
/// <param name="input">The solution matrix <c>B</c>.</param>
/// <param name="solver">The iterative solver to use.</param>
/// <param name="stopCriteria">Criteria to control when to stop iterating.</param>
/// <param name="preconditioner">The preconditioner to use for approximations.</param>
/// <returns>The result matrix <c>X</c>.</returns>
public Matrix<T> SolveIterative(Matrix<T> input, IIterativeSolver<T> solver, IPreconditioner<T> preconditioner, params IIterationStopCriterium<T>[] stopCriteria) public Matrix<T> SolveIterative(Matrix<T> input, IIterativeSolver<T> solver, IPreconditioner<T> preconditioner, params IIterationStopCriterium<T>[] stopCriteria)
{ {
var result = Builder.DenseMatrix(input.RowCount, input.ColumnCount); var result = Builder.DenseMatrix(input.RowCount, input.ColumnCount);
@ -286,6 +333,13 @@ namespace MathNet.Numerics.LinearAlgebra
return result; return result;
} }
/// <summary>
/// Solves the matrix equation Ax = b, where A is the coefficient matrix (this matrix), b is the solution vector and x is the unknown vector.
/// </summary>
/// <param name="input">The solution vector <c>b</c>.</param>
/// <param name="solver">The iterative solver to use.</param>
/// <param name="stopCriteria">Criteria to control when to stop iterating.</param>
/// <returns>The result vector <c>x</c>.</returns>
public Vector<T> SolveIterative(Vector<T> input, IIterativeSolver<T> solver, params IIterationStopCriterium<T>[] stopCriteria) public Vector<T> SolveIterative(Vector<T> input, IIterativeSolver<T> solver, params IIterationStopCriterium<T>[] stopCriteria)
{ {
var result = Builder.DenseVector(RowCount); var result = Builder.DenseVector(RowCount);
@ -293,6 +347,13 @@ namespace MathNet.Numerics.LinearAlgebra
return result; return result;
} }
/// <summary>
/// Solves the matrix equation AX = B, where A is the coefficient matrix (this matrix), B is the solution matrix and X is the unknown matrix.
/// </summary>
/// <param name="input">The solution matrix <c>B</c>.</param>
/// <param name="solver">The iterative solver to use.</param>
/// <param name="stopCriteria">Criteria to control when to stop iterating.</param>
/// <returns>The result matrix <c>X</c>.</returns>
public Matrix<T> SolveIterative(Matrix<T> input, IIterativeSolver<T> solver, params IIterationStopCriterium<T>[] stopCriteria) public Matrix<T> SolveIterative(Matrix<T> input, IIterativeSolver<T> solver, params IIterationStopCriterium<T>[] stopCriteria)
{ {
var result = Builder.DenseMatrix(input.RowCount, input.ColumnCount); var result = Builder.DenseMatrix(input.RowCount, input.ColumnCount);

2
src/Numerics/LinearAlgebra/Single/DenseMatrix.cs

@ -1055,7 +1055,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
return DenseGramSchmidt.Create(this); return DenseGramSchmidt.Create(this);
} }
public override Svd<float> Svd(bool computeVectors) public override Svd<float> Svd(bool computeVectors = true)
{ {
return DenseSvd.Create(this, computeVectors); return DenseSvd.Create(this, computeVectors);
} }

2
src/Numerics/LinearAlgebra/Single/Matrix.cs

@ -479,7 +479,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
return UserGramSchmidt.Create(this); return UserGramSchmidt.Create(this);
} }
public override Svd<float> Svd(bool computeVectors) public override Svd<float> Svd(bool computeVectors = true)
{ {
return UserSvd.Create(this, computeVectors); return UserSvd.Create(this, computeVectors);
} }

29
src/UnitTests/LinearAlgebraTests/Complex/Factorization/SvdTests.cs

@ -25,7 +25,6 @@
// </copyright> // </copyright>
using System; using System;
using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Complex; using MathNet.Numerics.LinearAlgebra.Complex;
using NUnit.Framework; using NUnit.Framework;
@ -48,7 +47,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
public void CanFactorizeIdentity(int order) public void CanFactorizeIdentity(int order)
{ {
var matrixI = DenseMatrix.Identity(order); var matrixI = DenseMatrix.Identity(order);
var factorSvd = matrixI.Svd(true); var factorSvd = matrixI.Svd();
var u = factorSvd.U; var u = factorSvd.U;
var vt = factorSvd.VT; var vt = factorSvd.VT;
var w = factorSvd.W; var w = factorSvd.W;
@ -85,7 +84,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
public void CanFactorizeRandomMatrix(int row, int column) public void CanFactorizeRandomMatrix(int row, int column)
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var u = factorSvd.U; var u = factorSvd.U;
var vt = factorSvd.VT; var vt = factorSvd.VT;
var w = factorSvd.W; var w = factorSvd.W;
@ -103,7 +102,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
Assert.AreEqual(column, w.ColumnCount); Assert.AreEqual(column, w.ColumnCount);
// Make sure the U*W*VT is the original matrix. // Make sure the U*W*VT is the original matrix.
var matrix = u * w * vt; var matrix = u*w*vt;
for (var i = 0; i < matrix.RowCount; i++) for (var i = 0; i < matrix.RowCount; i++)
{ {
for (var j = 0; j < matrix.ColumnCount; j++) for (var j = 0; j < matrix.ColumnCount; j++)
@ -124,7 +123,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
public void CanCheckRankOfNonSquare(int row, int column) public void CanCheckRankOfNonSquare(int row, int column)
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var mn = Math.Min(row, column); var mn = Math.Min(row, column);
Assert.AreEqual(factorSvd.Rank, mn); Assert.AreEqual(factorSvd.Rank, mn);
@ -143,7 +142,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
public void CanCheckRankSquare(int order) public void CanCheckRankSquare(int order)
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
if (factorSvd.Determinant != 0) if (factorSvd.Determinant != 0)
{ {
@ -175,7 +174,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
matrixA[i + 1, i] = 1; matrixA[i + 1, i] = 1;
} }
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
Assert.AreEqual(factorSvd.Determinant, Complex.Zero); Assert.AreEqual(factorSvd.Determinant, Complex.Zero);
Assert.AreEqual(factorSvd.Rank, order - 1); Assert.AreEqual(factorSvd.Rank, order - 1);
@ -222,14 +221,14 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var vectorb = MatrixLoader.GenerateRandomDenseVector(row); var vectorb = MatrixLoader.GenerateRandomDenseVector(row);
var resultx = factorSvd.Solve(vectorb); var resultx = factorSvd.Solve(vectorb);
Assert.AreEqual(matrixA.ColumnCount, resultx.Count); Assert.AreEqual(matrixA.ColumnCount, resultx.Count);
var matrixBReconstruct = matrixA * resultx; var matrixBReconstruct = matrixA*resultx;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < vectorb.Count; i++) for (var i = 0; i < vectorb.Count; i++)
@ -262,7 +261,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixB = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixX = factorSvd.Solve(matrixB); var matrixX = factorSvd.Solve(matrixB);
@ -273,7 +272,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
// The solution X has the same number of columns as B // The solution X has the same number of columns as B
Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount); Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);
var matrixBReconstruct = matrixA * matrixX; var matrixBReconstruct = matrixA*matrixX;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < matrixB.RowCount; i++) for (var i = 0; i < matrixB.RowCount; i++)
@ -309,13 +308,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var vectorb = MatrixLoader.GenerateRandomDenseVector(row); var vectorb = MatrixLoader.GenerateRandomDenseVector(row);
var vectorbCopy = vectorb.Clone(); var vectorbCopy = vectorb.Clone();
var resultx = new DenseVector(column); var resultx = new DenseVector(column);
factorSvd.Solve(vectorb, resultx); factorSvd.Solve(vectorb, resultx);
var matrixBReconstruct = matrixA * resultx; var matrixBReconstruct = matrixA*resultx;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < vectorb.Count; i++) for (var i = 0; i < vectorb.Count; i++)
@ -354,7 +353,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixB = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixBCopy = matrixB.Clone(); var matrixBCopy = matrixB.Clone();
@ -368,7 +367,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
// The solution X has the same number of columns as B // The solution X has the same number of columns as B
Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount); Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);
var matrixBReconstruct = matrixA * matrixX; var matrixBReconstruct = matrixA*matrixX;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < matrixB.RowCount; i++) for (var i = 0; i < matrixB.RowCount; i++)

29
src/UnitTests/LinearAlgebraTests/Complex/Factorization/UserSvdTests.cs

@ -25,7 +25,6 @@
// </copyright> // </copyright>
using System; using System;
using MathNet.Numerics.LinearAlgebra;
using NUnit.Framework; using NUnit.Framework;
namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
@ -47,7 +46,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
public void CanFactorizeIdentity(int order) public void CanFactorizeIdentity(int order)
{ {
var matrixI = UserDefinedMatrix.Identity(order); var matrixI = UserDefinedMatrix.Identity(order);
var factorSvd = matrixI.Svd(true); var factorSvd = matrixI.Svd();
var u = factorSvd.U; var u = factorSvd.U;
var vt = factorSvd.VT; var vt = factorSvd.VT;
var w = factorSvd.W; var w = factorSvd.W;
@ -84,7 +83,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
public void CanFactorizeRandomMatrix(int row, int column) public void CanFactorizeRandomMatrix(int row, int column)
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var u = factorSvd.U; var u = factorSvd.U;
var vt = factorSvd.VT; var vt = factorSvd.VT;
var w = factorSvd.W; var w = factorSvd.W;
@ -102,7 +101,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
Assert.AreEqual(column, w.ColumnCount); Assert.AreEqual(column, w.ColumnCount);
// Make sure the U*W*VT is the original matrix. // Make sure the U*W*VT is the original matrix.
var matrix = u * w * vt; var matrix = u*w*vt;
for (var i = 0; i < matrix.RowCount; i++) for (var i = 0; i < matrix.RowCount; i++)
{ {
for (var j = 0; j < matrix.ColumnCount; j++) for (var j = 0; j < matrix.ColumnCount; j++)
@ -123,7 +122,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
public void CanCheckRankOfNonSquare(int row, int column) public void CanCheckRankOfNonSquare(int row, int column)
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var mn = Math.Min(row, column); var mn = Math.Min(row, column);
Assert.AreEqual(factorSvd.Rank, mn); Assert.AreEqual(factorSvd.Rank, mn);
@ -142,7 +141,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
public void CanCheckRankSquare(int order) public void CanCheckRankSquare(int order)
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(order, order); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(order, order);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
if (factorSvd.Determinant != 0) if (factorSvd.Determinant != 0)
{ {
@ -174,7 +173,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
matrixA[i + 1, i] = 1; matrixA[i + 1, i] = 1;
} }
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
Assert.AreEqual(factorSvd.Determinant, Complex.Zero); Assert.AreEqual(factorSvd.Determinant, Complex.Zero);
Assert.AreEqual(factorSvd.Rank, order - 1); Assert.AreEqual(factorSvd.Rank, order - 1);
@ -221,14 +220,14 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var vectorb = MatrixLoader.GenerateRandomUserDefinedVector(row); var vectorb = MatrixLoader.GenerateRandomUserDefinedVector(row);
var resultx = factorSvd.Solve(vectorb); var resultx = factorSvd.Solve(vectorb);
Assert.AreEqual(matrixA.ColumnCount, resultx.Count); Assert.AreEqual(matrixA.ColumnCount, resultx.Count);
var matrixBReconstruct = matrixA * resultx; var matrixBReconstruct = matrixA*resultx;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < vectorb.Count; i++) for (var i = 0; i < vectorb.Count; i++)
@ -261,7 +260,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var matrixB = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixB = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixX = factorSvd.Solve(matrixB); var matrixX = factorSvd.Solve(matrixB);
@ -272,7 +271,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
// The solution X has the same number of columns as B // The solution X has the same number of columns as B
Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount); Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);
var matrixBReconstruct = matrixA * matrixX; var matrixBReconstruct = matrixA*matrixX;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < matrixB.RowCount; i++) for (var i = 0; i < matrixB.RowCount; i++)
@ -308,13 +307,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var vectorb = MatrixLoader.GenerateRandomUserDefinedVector(row); var vectorb = MatrixLoader.GenerateRandomUserDefinedVector(row);
var vectorbCopy = vectorb.Clone(); var vectorbCopy = vectorb.Clone();
var resultx = new UserDefinedVector(column); var resultx = new UserDefinedVector(column);
factorSvd.Solve(vectorb, resultx); factorSvd.Solve(vectorb, resultx);
var matrixBReconstruct = matrixA * resultx; var matrixBReconstruct = matrixA*resultx;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < vectorb.Count; i++) for (var i = 0; i < vectorb.Count; i++)
@ -353,7 +352,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var matrixB = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixB = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixBCopy = matrixB.Clone(); var matrixBCopy = matrixB.Clone();
@ -367,7 +366,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
// The solution X has the same number of columns as B // The solution X has the same number of columns as B
Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount); Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);
var matrixBReconstruct = matrixA * matrixX; var matrixBReconstruct = matrixA*matrixX;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < matrixB.RowCount; i++) for (var i = 0; i < matrixB.RowCount; i++)

29
src/UnitTests/LinearAlgebraTests/Complex32/Factorization/SvdTests.cs

@ -25,7 +25,6 @@
// </copyright> // </copyright>
using System; using System;
using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Complex32; using MathNet.Numerics.LinearAlgebra.Complex32;
using NUnit.Framework; using NUnit.Framework;
@ -48,7 +47,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
public void CanFactorizeIdentity(int order) public void CanFactorizeIdentity(int order)
{ {
var matrixI = DenseMatrix.Identity(order); var matrixI = DenseMatrix.Identity(order);
var factorSvd = matrixI.Svd(true); var factorSvd = matrixI.Svd();
var u = factorSvd.U; var u = factorSvd.U;
var vt = factorSvd.VT; var vt = factorSvd.VT;
var w = factorSvd.W; var w = factorSvd.W;
@ -85,7 +84,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
public void CanFactorizeRandomMatrix(int row, int column) public void CanFactorizeRandomMatrix(int row, int column)
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var u = factorSvd.U; var u = factorSvd.U;
var vt = factorSvd.VT; var vt = factorSvd.VT;
var w = factorSvd.W; var w = factorSvd.W;
@ -103,7 +102,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
Assert.AreEqual(column, w.ColumnCount); Assert.AreEqual(column, w.ColumnCount);
// Make sure the U*W*VT is the original matrix. // Make sure the U*W*VT is the original matrix.
var matrix = u * w * vt; var matrix = u*w*vt;
for (var i = 0; i < matrix.RowCount; i++) for (var i = 0; i < matrix.RowCount; i++)
{ {
for (var j = 0; j < matrix.ColumnCount; j++) for (var j = 0; j < matrix.ColumnCount; j++)
@ -125,7 +124,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
public void CanCheckRankOfNonSquare(int row, int column) public void CanCheckRankOfNonSquare(int row, int column)
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var mn = Math.Min(row, column); var mn = Math.Min(row, column);
Assert.AreEqual(factorSvd.Rank, mn); Assert.AreEqual(factorSvd.Rank, mn);
@ -144,7 +143,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
public void CanCheckRankSquare(int order) public void CanCheckRankSquare(int order)
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
if (factorSvd.Determinant != 0) if (factorSvd.Determinant != 0)
{ {
@ -176,7 +175,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
matrixA[i + 1, i] = 1; matrixA[i + 1, i] = 1;
} }
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
Assert.AreEqual(factorSvd.Determinant, Complex32.Zero); Assert.AreEqual(factorSvd.Determinant, Complex32.Zero);
Assert.AreEqual(factorSvd.Rank, order - 1); Assert.AreEqual(factorSvd.Rank, order - 1);
@ -223,14 +222,14 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var vectorb = MatrixLoader.GenerateRandomDenseVector(row); var vectorb = MatrixLoader.GenerateRandomDenseVector(row);
var resultx = factorSvd.Solve(vectorb); var resultx = factorSvd.Solve(vectorb);
Assert.AreEqual(matrixA.ColumnCount, resultx.Count); Assert.AreEqual(matrixA.ColumnCount, resultx.Count);
var matrixBReconstruct = matrixA * resultx; var matrixBReconstruct = matrixA*resultx;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < vectorb.Count; i++) for (var i = 0; i < vectorb.Count; i++)
@ -264,7 +263,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixB = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixX = factorSvd.Solve(matrixB); var matrixX = factorSvd.Solve(matrixB);
@ -275,7 +274,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
// The solution X has the same number of columns as B // The solution X has the same number of columns as B
Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount); Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);
var matrixBReconstruct = matrixA * matrixX; var matrixBReconstruct = matrixA*matrixX;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < matrixB.RowCount; i++) for (var i = 0; i < matrixB.RowCount; i++)
@ -312,13 +311,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var vectorb = MatrixLoader.GenerateRandomDenseVector(row); var vectorb = MatrixLoader.GenerateRandomDenseVector(row);
var vectorbCopy = vectorb.Clone(); var vectorbCopy = vectorb.Clone();
var resultx = new DenseVector(column); var resultx = new DenseVector(column);
factorSvd.Solve(vectorb, resultx); factorSvd.Solve(vectorb, resultx);
var matrixBReconstruct = matrixA * resultx; var matrixBReconstruct = matrixA*resultx;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < vectorb.Count; i++) for (var i = 0; i < vectorb.Count; i++)
@ -358,7 +357,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixB = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixBCopy = matrixB.Clone(); var matrixBCopy = matrixB.Clone();
@ -372,7 +371,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
// The solution X has the same number of columns as B // The solution X has the same number of columns as B
Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount); Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);
var matrixBReconstruct = matrixA * matrixX; var matrixBReconstruct = matrixA*matrixX;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < matrixB.RowCount; i++) for (var i = 0; i < matrixB.RowCount; i++)

29
src/UnitTests/LinearAlgebraTests/Complex32/Factorization/UserSvdTests.cs

@ -25,7 +25,6 @@
// </copyright> // </copyright>
using System; using System;
using MathNet.Numerics.LinearAlgebra;
using NUnit.Framework; using NUnit.Framework;
namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
@ -47,7 +46,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
public void CanFactorizeIdentity(int order) public void CanFactorizeIdentity(int order)
{ {
var matrixI = UserDefinedMatrix.Identity(order); var matrixI = UserDefinedMatrix.Identity(order);
var factorSvd = matrixI.Svd(true); var factorSvd = matrixI.Svd();
var u = factorSvd.U; var u = factorSvd.U;
var vt = factorSvd.VT; var vt = factorSvd.VT;
var w = factorSvd.W; var w = factorSvd.W;
@ -84,7 +83,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
public void CanFactorizeRandomMatrix(int row, int column) public void CanFactorizeRandomMatrix(int row, int column)
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var u = factorSvd.U; var u = factorSvd.U;
var vt = factorSvd.VT; var vt = factorSvd.VT;
var w = factorSvd.W; var w = factorSvd.W;
@ -102,7 +101,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
Assert.AreEqual(column, w.ColumnCount); Assert.AreEqual(column, w.ColumnCount);
// Make sure the U*W*VT is the original matrix. // Make sure the U*W*VT is the original matrix.
var matrix = u * w * vt; var matrix = u*w*vt;
for (var i = 0; i < matrix.RowCount; i++) for (var i = 0; i < matrix.RowCount; i++)
{ {
for (var j = 0; j < matrix.ColumnCount; j++) for (var j = 0; j < matrix.ColumnCount; j++)
@ -124,7 +123,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
public void CanCheckRankOfNonSquare(int row, int column) public void CanCheckRankOfNonSquare(int row, int column)
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var mn = Math.Min(row, column); var mn = Math.Min(row, column);
Assert.AreEqual(factorSvd.Rank, mn); Assert.AreEqual(factorSvd.Rank, mn);
@ -143,7 +142,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
public void CanCheckRankSquare(int order) public void CanCheckRankSquare(int order)
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(order, order); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(order, order);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
if (factorSvd.Determinant != 0) if (factorSvd.Determinant != 0)
{ {
@ -175,7 +174,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
matrixA[i + 1, i] = 1; matrixA[i + 1, i] = 1;
} }
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
Assert.AreEqual(factorSvd.Determinant, Complex32.Zero); Assert.AreEqual(factorSvd.Determinant, Complex32.Zero);
Assert.AreEqual(factorSvd.Rank, order - 1); Assert.AreEqual(factorSvd.Rank, order - 1);
@ -222,14 +221,14 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var vectorb = MatrixLoader.GenerateRandomUserDefinedVector(row); var vectorb = MatrixLoader.GenerateRandomUserDefinedVector(row);
var resultx = factorSvd.Solve(vectorb); var resultx = factorSvd.Solve(vectorb);
Assert.AreEqual(matrixA.ColumnCount, resultx.Count); Assert.AreEqual(matrixA.ColumnCount, resultx.Count);
var matrixBReconstruct = matrixA * resultx; var matrixBReconstruct = matrixA*resultx;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < vectorb.Count; i++) for (var i = 0; i < vectorb.Count; i++)
@ -263,7 +262,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var matrixB = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixB = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixX = factorSvd.Solve(matrixB); var matrixX = factorSvd.Solve(matrixB);
@ -274,7 +273,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
// The solution X has the same number of columns as B // The solution X has the same number of columns as B
Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount); Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);
var matrixBReconstruct = matrixA * matrixX; var matrixBReconstruct = matrixA*matrixX;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < matrixB.RowCount; i++) for (var i = 0; i < matrixB.RowCount; i++)
@ -311,13 +310,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var vectorb = MatrixLoader.GenerateRandomUserDefinedVector(row); var vectorb = MatrixLoader.GenerateRandomUserDefinedVector(row);
var vectorbCopy = vectorb.Clone(); var vectorbCopy = vectorb.Clone();
var resultx = new UserDefinedVector(column); var resultx = new UserDefinedVector(column);
factorSvd.Solve(vectorb, resultx); factorSvd.Solve(vectorb, resultx);
var matrixBReconstruct = matrixA * resultx; var matrixBReconstruct = matrixA*resultx;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < vectorb.Count; i++) for (var i = 0; i < vectorb.Count; i++)
@ -357,7 +356,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var matrixB = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixB = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixBCopy = matrixB.Clone(); var matrixBCopy = matrixB.Clone();
@ -371,7 +370,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
// The solution X has the same number of columns as B // The solution X has the same number of columns as B
Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount); Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);
var matrixBReconstruct = matrixA * matrixX; var matrixBReconstruct = matrixA*matrixX;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < matrixB.RowCount; i++) for (var i = 0; i < matrixB.RowCount; i++)

29
src/UnitTests/LinearAlgebraTests/Double/Factorization/SvdTests.cs

@ -25,7 +25,6 @@
// </copyright> // </copyright>
using System; using System;
using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Double; using MathNet.Numerics.LinearAlgebra.Double;
using NUnit.Framework; using NUnit.Framework;
@ -46,7 +45,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
public void CanFactorizeIdentity(int order) public void CanFactorizeIdentity(int order)
{ {
var matrixI = DenseMatrix.Identity(order); var matrixI = DenseMatrix.Identity(order);
var factorSvd = matrixI.Svd(true); var factorSvd = matrixI.Svd();
var u = factorSvd.U; var u = factorSvd.U;
var vt = factorSvd.VT; var vt = factorSvd.VT;
var w = factorSvd.W; var w = factorSvd.W;
@ -83,7 +82,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
public void CanFactorizeRandomMatrix(int row, int column) public void CanFactorizeRandomMatrix(int row, int column)
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var u = factorSvd.U; var u = factorSvd.U;
var vt = factorSvd.VT; var vt = factorSvd.VT;
var w = factorSvd.W; var w = factorSvd.W;
@ -101,7 +100,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
Assert.AreEqual(column, w.ColumnCount); Assert.AreEqual(column, w.ColumnCount);
// Make sure the U*W*VT is the original matrix. // Make sure the U*W*VT is the original matrix.
var matrix = u * w * vt; var matrix = u*w*vt;
for (var i = 0; i < matrix.RowCount; i++) for (var i = 0; i < matrix.RowCount; i++)
{ {
for (var j = 0; j < matrix.ColumnCount; j++) for (var j = 0; j < matrix.ColumnCount; j++)
@ -122,7 +121,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
public void CanCheckRankOfNonSquare(int row, int column) public void CanCheckRankOfNonSquare(int row, int column)
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var mn = Math.Min(row, column); var mn = Math.Min(row, column);
Assert.AreEqual(factorSvd.Rank, mn); Assert.AreEqual(factorSvd.Rank, mn);
@ -141,7 +140,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
public void CanCheckRankSquare(int order) public void CanCheckRankSquare(int order)
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
if (factorSvd.Determinant != 0) if (factorSvd.Determinant != 0)
{ {
@ -173,7 +172,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
matrixA[i + 1, i] = 1; matrixA[i + 1, i] = 1;
} }
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
Assert.AreEqual(factorSvd.Determinant, 0); Assert.AreEqual(factorSvd.Determinant, 0);
Assert.AreEqual(factorSvd.Rank, order - 1); Assert.AreEqual(factorSvd.Rank, order - 1);
@ -220,14 +219,14 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var vectorb = MatrixLoader.GenerateRandomDenseVector(row); var vectorb = MatrixLoader.GenerateRandomDenseVector(row);
var resultx = factorSvd.Solve(vectorb); var resultx = factorSvd.Solve(vectorb);
Assert.AreEqual(matrixA.ColumnCount, resultx.Count); Assert.AreEqual(matrixA.ColumnCount, resultx.Count);
var matrixBReconstruct = matrixA * resultx; var matrixBReconstruct = matrixA*resultx;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < vectorb.Count; i++) for (var i = 0; i < vectorb.Count; i++)
@ -260,7 +259,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixB = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixX = factorSvd.Solve(matrixB); var matrixX = factorSvd.Solve(matrixB);
@ -271,7 +270,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
// The solution X has the same number of columns as B // The solution X has the same number of columns as B
Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount); Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);
var matrixBReconstruct = matrixA * matrixX; var matrixBReconstruct = matrixA*matrixX;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < matrixB.RowCount; i++) for (var i = 0; i < matrixB.RowCount; i++)
@ -307,13 +306,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var vectorb = MatrixLoader.GenerateRandomDenseVector(row); var vectorb = MatrixLoader.GenerateRandomDenseVector(row);
var vectorbCopy = vectorb.Clone(); var vectorbCopy = vectorb.Clone();
var resultx = new DenseVector(column); var resultx = new DenseVector(column);
factorSvd.Solve(vectorb, resultx); factorSvd.Solve(vectorb, resultx);
var matrixBReconstruct = matrixA * resultx; var matrixBReconstruct = matrixA*resultx;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < vectorb.Count; i++) for (var i = 0; i < vectorb.Count; i++)
@ -352,7 +351,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixB = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixBCopy = matrixB.Clone(); var matrixBCopy = matrixB.Clone();
@ -366,7 +365,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
// The solution X has the same number of columns as B // The solution X has the same number of columns as B
Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount); Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);
var matrixBReconstruct = matrixA * matrixX; var matrixBReconstruct = matrixA*matrixX;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < matrixB.RowCount; i++) for (var i = 0; i < matrixB.RowCount; i++)

29
src/UnitTests/LinearAlgebraTests/Double/Factorization/UserSvdTests.cs

@ -25,7 +25,6 @@
// </copyright> // </copyright>
using System; using System;
using MathNet.Numerics.LinearAlgebra;
using NUnit.Framework; using NUnit.Framework;
namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
@ -45,7 +44,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
public void CanFactorizeIdentity(int order) public void CanFactorizeIdentity(int order)
{ {
var matrixI = UserDefinedMatrix.Identity(order); var matrixI = UserDefinedMatrix.Identity(order);
var factorSvd = matrixI.Svd(true); var factorSvd = matrixI.Svd();
var u = factorSvd.U; var u = factorSvd.U;
var vt = factorSvd.VT; var vt = factorSvd.VT;
var w = factorSvd.W; var w = factorSvd.W;
@ -82,7 +81,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
public void CanFactorizeRandomMatrix(int row, int column) public void CanFactorizeRandomMatrix(int row, int column)
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var u = factorSvd.U; var u = factorSvd.U;
var vt = factorSvd.VT; var vt = factorSvd.VT;
var w = factorSvd.W; var w = factorSvd.W;
@ -100,7 +99,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
Assert.AreEqual(column, w.ColumnCount); Assert.AreEqual(column, w.ColumnCount);
// Make sure the U*W*VT is the original matrix. // Make sure the U*W*VT is the original matrix.
var matrix = u * w * vt; var matrix = u*w*vt;
for (var i = 0; i < matrix.RowCount; i++) for (var i = 0; i < matrix.RowCount; i++)
{ {
for (var j = 0; j < matrix.ColumnCount; j++) for (var j = 0; j < matrix.ColumnCount; j++)
@ -121,7 +120,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
public void CanCheckRankOfNonSquare(int row, int column) public void CanCheckRankOfNonSquare(int row, int column)
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var mn = Math.Min(row, column); var mn = Math.Min(row, column);
Assert.AreEqual(factorSvd.Rank, mn); Assert.AreEqual(factorSvd.Rank, mn);
@ -140,7 +139,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
public void CanCheckRankSquare(int order) public void CanCheckRankSquare(int order)
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(order, order); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(order, order);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
if (factorSvd.Determinant != 0) if (factorSvd.Determinant != 0)
{ {
@ -172,7 +171,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
matrixA[i + 1, i] = 1; matrixA[i + 1, i] = 1;
} }
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
Assert.AreEqual(factorSvd.Determinant, 0); Assert.AreEqual(factorSvd.Determinant, 0);
Assert.AreEqual(factorSvd.Rank, order - 1); Assert.AreEqual(factorSvd.Rank, order - 1);
@ -219,14 +218,14 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var vectorb = MatrixLoader.GenerateRandomUserDefinedVector(row); var vectorb = MatrixLoader.GenerateRandomUserDefinedVector(row);
var resultx = factorSvd.Solve(vectorb); var resultx = factorSvd.Solve(vectorb);
Assert.AreEqual(matrixA.ColumnCount, resultx.Count); Assert.AreEqual(matrixA.ColumnCount, resultx.Count);
var matrixBReconstruct = matrixA * resultx; var matrixBReconstruct = matrixA*resultx;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < vectorb.Count; i++) for (var i = 0; i < vectorb.Count; i++)
@ -259,7 +258,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var matrixB = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixB = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixX = factorSvd.Solve(matrixB); var matrixX = factorSvd.Solve(matrixB);
@ -270,7 +269,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
// The solution X has the same number of columns as B // The solution X has the same number of columns as B
Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount); Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);
var matrixBReconstruct = matrixA * matrixX; var matrixBReconstruct = matrixA*matrixX;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < matrixB.RowCount; i++) for (var i = 0; i < matrixB.RowCount; i++)
@ -306,13 +305,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var vectorb = MatrixLoader.GenerateRandomUserDefinedVector(row); var vectorb = MatrixLoader.GenerateRandomUserDefinedVector(row);
var vectorbCopy = vectorb.Clone(); var vectorbCopy = vectorb.Clone();
var resultx = new UserDefinedVector(column); var resultx = new UserDefinedVector(column);
factorSvd.Solve(vectorb, resultx); factorSvd.Solve(vectorb, resultx);
var matrixBReconstruct = matrixA * resultx; var matrixBReconstruct = matrixA*resultx;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < vectorb.Count; i++) for (var i = 0; i < vectorb.Count; i++)
@ -351,7 +350,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var matrixB = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixB = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixBCopy = matrixB.Clone(); var matrixBCopy = matrixB.Clone();
@ -365,7 +364,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double.Factorization
// The solution X has the same number of columns as B // The solution X has the same number of columns as B
Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount); Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);
var matrixBReconstruct = matrixA * matrixX; var matrixBReconstruct = matrixA*matrixX;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < matrixB.RowCount; i++) for (var i = 0; i < matrixB.RowCount; i++)

29
src/UnitTests/LinearAlgebraTests/Single/Factorization/SvdTests.cs

@ -25,7 +25,6 @@
// </copyright> // </copyright>
using System; using System;
using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Single; using MathNet.Numerics.LinearAlgebra.Single;
using NUnit.Framework; using NUnit.Framework;
@ -46,7 +45,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
public void CanFactorizeIdentity(int order) public void CanFactorizeIdentity(int order)
{ {
var matrixI = DenseMatrix.Identity(order); var matrixI = DenseMatrix.Identity(order);
var factorSvd = matrixI.Svd(true); var factorSvd = matrixI.Svd();
var u = factorSvd.U; var u = factorSvd.U;
var vt = factorSvd.VT; var vt = factorSvd.VT;
var w = factorSvd.W; var w = factorSvd.W;
@ -83,7 +82,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
public void CanFactorizeRandomMatrix(int row, int column) public void CanFactorizeRandomMatrix(int row, int column)
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var u = factorSvd.U; var u = factorSvd.U;
var vt = factorSvd.VT; var vt = factorSvd.VT;
var w = factorSvd.W; var w = factorSvd.W;
@ -101,7 +100,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
Assert.AreEqual(column, w.ColumnCount); Assert.AreEqual(column, w.ColumnCount);
// Make sure the U*W*VT is the original matrix. // Make sure the U*W*VT is the original matrix.
var matrix = u * w * vt; var matrix = u*w*vt;
for (var i = 0; i < matrix.RowCount; i++) for (var i = 0; i < matrix.RowCount; i++)
{ {
for (var j = 0; j < matrix.ColumnCount; j++) for (var j = 0; j < matrix.ColumnCount; j++)
@ -122,7 +121,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
public void CanCheckRankOfNonSquare(int row, int column) public void CanCheckRankOfNonSquare(int row, int column)
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var mn = Math.Min(row, column); var mn = Math.Min(row, column);
Assert.AreEqual(factorSvd.Rank, mn); Assert.AreEqual(factorSvd.Rank, mn);
@ -141,7 +140,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
public void CanCheckRankSquare(int order) public void CanCheckRankSquare(int order)
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(order, order);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
if (factorSvd.Determinant != 0) if (factorSvd.Determinant != 0)
{ {
@ -173,7 +172,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
matrixA[i + 1, i] = 1; matrixA[i + 1, i] = 1;
} }
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
Assert.AreEqual(factorSvd.Determinant, 0); Assert.AreEqual(factorSvd.Determinant, 0);
Assert.AreEqual(factorSvd.Rank, order - 1); Assert.AreEqual(factorSvd.Rank, order - 1);
@ -220,14 +219,14 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var vectorb = MatrixLoader.GenerateRandomDenseVector(row); var vectorb = MatrixLoader.GenerateRandomDenseVector(row);
var resultx = factorSvd.Solve(vectorb); var resultx = factorSvd.Solve(vectorb);
Assert.AreEqual(matrixA.ColumnCount, resultx.Count); Assert.AreEqual(matrixA.ColumnCount, resultx.Count);
var matrixBReconstruct = matrixA * resultx; var matrixBReconstruct = matrixA*resultx;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < vectorb.Count; i++) for (var i = 0; i < vectorb.Count; i++)
@ -260,7 +259,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixB = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixX = factorSvd.Solve(matrixB); var matrixX = factorSvd.Solve(matrixB);
@ -271,7 +270,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
// The solution X has the same number of columns as B // The solution X has the same number of columns as B
Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount); Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);
var matrixBReconstruct = matrixA * matrixX; var matrixBReconstruct = matrixA*matrixX;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < matrixB.RowCount; i++) for (var i = 0; i < matrixB.RowCount; i++)
@ -307,13 +306,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var vectorb = MatrixLoader.GenerateRandomDenseVector(row); var vectorb = MatrixLoader.GenerateRandomDenseVector(row);
var vectorbCopy = vectorb.Clone(); var vectorbCopy = vectorb.Clone();
var resultx = new DenseVector(column); var resultx = new DenseVector(column);
factorSvd.Solve(vectorb, resultx); factorSvd.Solve(vectorb, resultx);
var matrixBReconstruct = matrixA * resultx; var matrixBReconstruct = matrixA*resultx;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < vectorb.Count; i++) for (var i = 0; i < vectorb.Count; i++)
@ -352,7 +351,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var matrixB = MatrixLoader.GenerateRandomDenseMatrix(row, column); var matrixB = MatrixLoader.GenerateRandomDenseMatrix(row, column);
var matrixBCopy = matrixB.Clone(); var matrixBCopy = matrixB.Clone();
@ -366,7 +365,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
// The solution X has the same number of columns as B // The solution X has the same number of columns as B
Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount); Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);
var matrixBReconstruct = matrixA * matrixX; var matrixBReconstruct = matrixA*matrixX;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < matrixB.RowCount; i++) for (var i = 0; i < matrixB.RowCount; i++)

29
src/UnitTests/LinearAlgebraTests/Single/Factorization/UserSvdTests.cs

@ -25,7 +25,6 @@
// </copyright> // </copyright>
using System; using System;
using MathNet.Numerics.LinearAlgebra;
using NUnit.Framework; using NUnit.Framework;
namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
@ -45,7 +44,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
public void CanFactorizeIdentity(int order) public void CanFactorizeIdentity(int order)
{ {
var matrixI = UserDefinedMatrix.Identity(order); var matrixI = UserDefinedMatrix.Identity(order);
var factorSvd = matrixI.Svd(true); var factorSvd = matrixI.Svd();
var u = factorSvd.U; var u = factorSvd.U;
var vt = factorSvd.VT; var vt = factorSvd.VT;
var w = factorSvd.W; var w = factorSvd.W;
@ -82,7 +81,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
public void CanFactorizeRandomMatrix(int row, int column) public void CanFactorizeRandomMatrix(int row, int column)
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var u = factorSvd.U; var u = factorSvd.U;
var vt = factorSvd.VT; var vt = factorSvd.VT;
var w = factorSvd.W; var w = factorSvd.W;
@ -100,7 +99,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
Assert.AreEqual(column, w.ColumnCount); Assert.AreEqual(column, w.ColumnCount);
// Make sure the U*W*VT is the original matrix. // Make sure the U*W*VT is the original matrix.
var matrix = u * w * vt; var matrix = u*w*vt;
for (var i = 0; i < matrix.RowCount; i++) for (var i = 0; i < matrix.RowCount; i++)
{ {
for (var j = 0; j < matrix.ColumnCount; j++) for (var j = 0; j < matrix.ColumnCount; j++)
@ -121,7 +120,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
public void CanCheckRankOfNonSquare(int row, int column) public void CanCheckRankOfNonSquare(int row, int column)
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var mn = Math.Min(row, column); var mn = Math.Min(row, column);
Assert.AreEqual(factorSvd.Rank, mn); Assert.AreEqual(factorSvd.Rank, mn);
@ -140,7 +139,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
public void CanCheckRankSquare(int order) public void CanCheckRankSquare(int order)
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(order, order); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(order, order);
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
if (factorSvd.Determinant != 0) if (factorSvd.Determinant != 0)
{ {
@ -172,7 +171,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
matrixA[i + 1, i] = 1; matrixA[i + 1, i] = 1;
} }
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
Assert.AreEqual(factorSvd.Determinant, 0); Assert.AreEqual(factorSvd.Determinant, 0);
Assert.AreEqual(factorSvd.Rank, order - 1); Assert.AreEqual(factorSvd.Rank, order - 1);
@ -219,14 +218,14 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var vectorb = MatrixLoader.GenerateRandomUserDefinedVector(row); var vectorb = MatrixLoader.GenerateRandomUserDefinedVector(row);
var resultx = factorSvd.Solve(vectorb); var resultx = factorSvd.Solve(vectorb);
Assert.AreEqual(matrixA.ColumnCount, resultx.Count); Assert.AreEqual(matrixA.ColumnCount, resultx.Count);
var matrixBReconstruct = matrixA * resultx; var matrixBReconstruct = matrixA*resultx;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < vectorb.Count; i++) for (var i = 0; i < vectorb.Count; i++)
@ -259,7 +258,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var matrixB = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixB = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixX = factorSvd.Solve(matrixB); var matrixX = factorSvd.Solve(matrixB);
@ -270,7 +269,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
// The solution X has the same number of columns as B // The solution X has the same number of columns as B
Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount); Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);
var matrixBReconstruct = matrixA * matrixX; var matrixBReconstruct = matrixA*matrixX;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < matrixB.RowCount; i++) for (var i = 0; i < matrixB.RowCount; i++)
@ -306,13 +305,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var vectorb = MatrixLoader.GenerateRandomUserDefinedVector(row); var vectorb = MatrixLoader.GenerateRandomUserDefinedVector(row);
var vectorbCopy = vectorb.Clone(); var vectorbCopy = vectorb.Clone();
var resultx = new UserDefinedVector(column); var resultx = new UserDefinedVector(column);
factorSvd.Solve(vectorb, resultx); factorSvd.Solve(vectorb, resultx);
var matrixBReconstruct = matrixA * resultx; var matrixBReconstruct = matrixA*resultx;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < vectorb.Count; i++) for (var i = 0; i < vectorb.Count; i++)
@ -351,7 +350,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
{ {
var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixA = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixACopy = matrixA.Clone(); var matrixACopy = matrixA.Clone();
var factorSvd = matrixA.Svd(true); var factorSvd = matrixA.Svd();
var matrixB = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column); var matrixB = MatrixLoader.GenerateRandomUserDefinedMatrix(row, column);
var matrixBCopy = matrixB.Clone(); var matrixBCopy = matrixB.Clone();
@ -365,7 +364,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single.Factorization
// The solution X has the same number of columns as B // The solution X has the same number of columns as B
Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount); Assert.AreEqual(matrixB.ColumnCount, matrixX.ColumnCount);
var matrixBReconstruct = matrixA * matrixX; var matrixBReconstruct = matrixA*matrixX;
// Check the reconstruction. // Check the reconstruction.
for (var i = 0; i < matrixB.RowCount; i++) for (var i = 0; i < matrixB.RowCount; i++)

Loading…
Cancel
Save