Browse Source

LA: the proper term for being conjugate symmetric is 'Hermitian'

provider
Christoph Ruegg 12 years ago
parent
commit
e50de5b606
  1. 11
      docs/content/Matrix.fsx
  2. 3
      src/FSharp/LinearAlgebra.Matrix.fs
  3. 4
      src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs
  4. 4
      src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs
  5. 4
      src/Numerics/LinearAlgebra/Complex/Factorization/DenseEvd.cs
  6. 4
      src/Numerics/LinearAlgebra/Complex/Factorization/UserEvd.cs
  7. 4
      src/Numerics/LinearAlgebra/Complex/Matrix.cs
  8. 4
      src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs
  9. 4
      src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs
  10. 4
      src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs
  11. 4
      src/Numerics/LinearAlgebra/Complex32/Factorization/DenseEvd.cs
  12. 4
      src/Numerics/LinearAlgebra/Complex32/Factorization/UserEvd.cs
  13. 4
      src/Numerics/LinearAlgebra/Complex32/Matrix.cs
  14. 4
      src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs
  15. 2
      src/Numerics/LinearAlgebra/Double/Factorization/DenseEvd.cs
  16. 2
      src/Numerics/LinearAlgebra/Double/Factorization/UserEvd.cs
  17. 4
      src/Numerics/LinearAlgebra/Double/Matrix.cs
  18. 11
      src/Numerics/LinearAlgebra/Matrix.cs
  19. 7
      src/Numerics/LinearAlgebra/Options.cs
  20. 2
      src/Numerics/LinearAlgebra/Single/Factorization/DenseEvd.cs
  21. 2
      src/Numerics/LinearAlgebra/Single/Factorization/UserEvd.cs
  22. 4
      src/Numerics/LinearAlgebra/Single/Matrix.cs
  23. 10
      src/UnitTests/LinearAlgebraTests/Complex/Factorization/EvdTests.cs
  24. 8
      src/UnitTests/LinearAlgebraTests/Complex/Factorization/UserEvdTests.cs
  25. 10
      src/UnitTests/LinearAlgebraTests/Complex32/Factorization/EvdTests.cs
  26. 8
      src/UnitTests/LinearAlgebraTests/Complex32/Factorization/UserEvdTests.cs
  27. 6
      src/UnitTests/LinearAlgebraTests/MatrixHelpers.cs

11
docs/content/Matrix.fsx

@ -35,7 +35,7 @@ spatial problems, geography and geometry have quite different usage patterns and
to linear algebra. All places where Math.NET Numerics can be used have a strong to linear algebra. All places where Math.NET Numerics can be used have a strong
programming language with their own data structures. For example, if you have a collection of vectors, programming language with their own data structures. For example, if you have a collection of vectors,
consider to store them in a list or array of vectors, not in a matrix (unless you need matrix operations, of course). consider to store them in a list or array of vectors, not in a matrix (unless you need matrix operations, of course).
Storage Layout Storage Layout
-------------- --------------
@ -224,8 +224,8 @@ let m = matrix [[ 1.0; 4.0; 7.0 ]
let v = vector [ 10.0; 20.0; 30.0 ] let v = vector [ 10.0; 20.0; 30.0 ]
let v2 = m * v let v' = m * v
let m2 = m + 2.0*m let m' = m + 2.0*m
(** (**
### Arithmetic Instance Methods ### Arithmetic Instance Methods
@ -265,7 +265,7 @@ that are more efficient:
X.TransposeThisAndMultiply(X).Inverse() * X.TransposeThisAndMultiply(y) X.TransposeThisAndMultiply(X).Inverse() * X.TransposeThisAndMultiply(y)
Of course in practice you would not use the matrix inverse but a decomposition: Of course in practice you would not use the matrix inverse but a decomposition:
[lang=csharp] [lang=csharp]
X.TransposeThisAndMultiply(X).Cholesky().Solve(X.TransposeThisAndMultiply(y)) X.TransposeThisAndMultiply(X).Cholesky().Solve(X.TransposeThisAndMultiply(y))
@ -333,7 +333,8 @@ Trace and Determinant
For a square matrix, the trace of a matrix is the sum of the elements on the main diagonal, For a square matrix, the trace of a matrix is the sum of the elements on the main diagonal,
which is equal to the sum of all its eigenvalues with multiplicities. Similarly, the determinant which is equal to the sum of all its eigenvalues with multiplicities. Similarly, the determinant
of a square matrix is the product of all its eigenvalues with multiplicities. of a square matrix is the product of all its eigenvalues with multiplicities.
If the determinant is not zero, the matrix is invertible and the linear equation system it A matrix is said to be *singular* if its determinant is zero and *non-singular* otherwise.
In the latter case the matrix is invertible and the linear equation system it
represents has a single unique solution. represents has a single unique solution.
[lang=csharp] [lang=csharp]

3
src/FSharp/LinearAlgebra.Matrix.fs

@ -353,7 +353,8 @@ module Matrix =
let inline nullity (A: #Matrix<_>) = A.Nullity() let inline nullity (A: #Matrix<_>) = A.Nullity()
let inline kernel (A: #Matrix<_>) = A.Kernel() let inline kernel (A: #Matrix<_>) = A.Kernel()
let inline range (A: #Matrix<_>) = A.Range() let inline range (A: #Matrix<_>) = A.Range()
let inline symmetric (A: #Matrix<_>) = A.IsSymmetric let inline symmetric (A: #Matrix<_>) = A.IsSymmetric()
let inline hermitian (A: #Matrix<_>) = A.IsHermitian()
let inline cholesky (A: #Matrix<_>) = A.Cholesky() let inline cholesky (A: #Matrix<_>) = A.Cholesky()
let inline lu (A: #Matrix<_>) = A.LU() let inline lu (A: #Matrix<_>) = A.LU()

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

@ -1254,9 +1254,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
} }
/// <summary> /// <summary>
/// Evaluates whether this matrix is conjugate symmetric. /// Evaluates whether this matrix is hermitian (conjugate symmetric).
/// </summary> /// </summary>
public override bool IsConjugateSymmetric() public override bool IsHermitian()
{ {
if (RowCount != ColumnCount) if (RowCount != ColumnCount)
{ {

4
src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs

@ -1014,9 +1014,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
} }
/// <summary> /// <summary>
/// Evaluates whether this matrix is conjugate symmetric. /// Evaluates whether this matrix is hermitian (conjugate symmetric).
/// </summary> /// </summary>
public override sealed bool IsConjugateSymmetric() public override sealed bool IsHermitian()
{ {
for (var k = 0; k < _data.Length; k ++) for (var k = 0; k < _data.Length; k ++)
{ {

4
src/Numerics/LinearAlgebra/Complex/Factorization/DenseEvd.cs

@ -82,14 +82,14 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Factorization
bool isSymmetric; bool isSymmetric;
switch (symmetricity) switch (symmetricity)
{ {
case Symmetricity.ConjugateSymmetric: case Symmetricity.Hermitian:
isSymmetric = true; isSymmetric = true;
break; break;
case Symmetricity.Asymmetric: case Symmetricity.Asymmetric:
isSymmetric = false; isSymmetric = false;
break; break;
default: default:
isSymmetric = matrix.IsConjugateSymmetric(); isSymmetric = matrix.IsHermitian();
break; break;
} }

4
src/Numerics/LinearAlgebra/Complex/Factorization/UserEvd.cs

@ -82,14 +82,14 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Factorization
bool isSymmetric; bool isSymmetric;
switch (symmetricity) switch (symmetricity)
{ {
case Symmetricity.ConjugateSymmetric: case Symmetricity.Hermitian:
isSymmetric = true; isSymmetric = true;
break; break;
case Symmetricity.Asymmetric: case Symmetricity.Asymmetric:
isSymmetric = false; isSymmetric = false;
break; break;
default: default:
isSymmetric = matrix.IsConjugateSymmetric(); isSymmetric = matrix.IsHermitian();
break; break;
} }

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

@ -709,9 +709,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
} }
/// <summary> /// <summary>
/// Evaluates whether this matrix is conjugate symmetric. /// Evaluates whether this matrix is hermitian (conjugate symmetric).
/// </summary> /// </summary>
public override bool IsConjugateSymmetric() public override bool IsHermitian()
{ {
if (RowCount != ColumnCount) if (RowCount != ColumnCount)
{ {

4
src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs

@ -1246,9 +1246,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
} }
/// <summary> /// <summary>
/// Evaluates whether this matrix is conjugate symmetric. /// Evaluates whether this matrix is hermitian (conjugate symmetric).
/// </summary> /// </summary>
public override bool IsConjugateSymmetric() public override bool IsHermitian()
{ {
if (RowCount != ColumnCount) if (RowCount != ColumnCount)
{ {

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

@ -1251,9 +1251,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
} }
/// <summary> /// <summary>
/// Evaluates whether this matrix is conjugate symmetric. /// Evaluates whether this matrix is hermitian (conjugate symmetric).
/// </summary> /// </summary>
public override bool IsConjugateSymmetric() public override bool IsHermitian()
{ {
if (RowCount != ColumnCount) if (RowCount != ColumnCount)
{ {

4
src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs

@ -1008,9 +1008,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
} }
/// <summary> /// <summary>
/// Evaluates whether this matrix is conjugate symmetric. /// Evaluates whether this matrix is hermitian (conjugate symmetric).
/// </summary> /// </summary>
public override sealed bool IsConjugateSymmetric() public override sealed bool IsHermitian()
{ {
for (var k = 0; k < _data.Length; k++) for (var k = 0; k < _data.Length; k++)
{ {

4
src/Numerics/LinearAlgebra/Complex32/Factorization/DenseEvd.cs

@ -83,14 +83,14 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Factorization
bool isSymmetric; bool isSymmetric;
switch (symmetricity) switch (symmetricity)
{ {
case Symmetricity.ConjugateSymmetric: case Symmetricity.Hermitian:
isSymmetric = true; isSymmetric = true;
break; break;
case Symmetricity.Asymmetric: case Symmetricity.Asymmetric:
isSymmetric = false; isSymmetric = false;
break; break;
default: default:
isSymmetric = matrix.IsConjugateSymmetric(); isSymmetric = matrix.IsHermitian();
break; break;
} }

4
src/Numerics/LinearAlgebra/Complex32/Factorization/UserEvd.cs

@ -81,14 +81,14 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Factorization
bool isSymmetric; bool isSymmetric;
switch (symmetricity) switch (symmetricity)
{ {
case Symmetricity.ConjugateSymmetric: case Symmetricity.Hermitian:
isSymmetric = true; isSymmetric = true;
break; break;
case Symmetricity.Asymmetric: case Symmetricity.Asymmetric:
isSymmetric = false; isSymmetric = false;
break; break;
default: default:
isSymmetric = matrix.IsConjugateSymmetric(); isSymmetric = matrix.IsHermitian();
break; break;
} }

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

@ -704,9 +704,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
} }
/// <summary> /// <summary>
/// Evaluates whether this matrix is conjugate symmetric. /// Evaluates whether this matrix is hermitian (conjugate symmetric).
/// </summary> /// </summary>
public override bool IsConjugateSymmetric() public override bool IsHermitian()
{ {
if (RowCount != ColumnCount) if (RowCount != ColumnCount)
{ {

4
src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs

@ -1240,9 +1240,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
} }
/// <summary> /// <summary>
/// Evaluates whether this matrix is conjugate symmetric. /// Evaluates whether this matrix is hermitian (conjugate symmetric).
/// </summary> /// </summary>
public override bool IsConjugateSymmetric() public override bool IsHermitian()
{ {
if (RowCount != ColumnCount) if (RowCount != ColumnCount)
{ {

2
src/Numerics/LinearAlgebra/Double/Factorization/DenseEvd.cs

@ -83,7 +83,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Factorization
switch (symmetricity) switch (symmetricity)
{ {
case Symmetricity.Symmetric: case Symmetricity.Symmetric:
case Symmetricity.ConjugateSymmetric: case Symmetricity.Hermitian:
isSymmetric = true; isSymmetric = true;
break; break;
case Symmetricity.Asymmetric: case Symmetricity.Asymmetric:

2
src/Numerics/LinearAlgebra/Double/Factorization/UserEvd.cs

@ -83,7 +83,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Factorization
switch (symmetricity) switch (symmetricity)
{ {
case Symmetricity.Symmetric: case Symmetricity.Symmetric:
case Symmetricity.ConjugateSymmetric: case Symmetricity.Hermitian:
isSymmetric = true; isSymmetric = true;
break; break;
case Symmetricity.Asymmetric: case Symmetricity.Asymmetric:

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

@ -705,9 +705,9 @@ namespace MathNet.Numerics.LinearAlgebra.Double
} }
/// <summary> /// <summary>
/// Evaluates whether this matrix is conjugate symmetric. /// Evaluates whether this matrix is hermitian (conjugate symmetric).
/// </summary> /// </summary>
public override sealed bool IsConjugateSymmetric() public override sealed bool IsHermitian()
{ {
return IsSymmetric(); return IsSymmetric();
} }

11
src/Numerics/LinearAlgebra/Matrix.cs

@ -1307,10 +1307,19 @@ namespace MathNet.Numerics.LinearAlgebra
return true; return true;
} }
/// <summary>
/// Evaluates whether this matrix is hermitian (conjugate symmetric).
/// </summary>
public abstract bool IsHermitian();
/// <summary> /// <summary>
/// Evaluates whether this matrix is conjugate symmetric. /// Evaluates whether this matrix is conjugate symmetric.
/// </summary> /// </summary>
public abstract bool IsConjugateSymmetric(); [Obsolete("Use IsHermitian instead. Will be removed in v4.")]
public bool IsConjugateSymmetric()
{
return IsHermitian();
}
/// <summary> /// <summary>
/// Returns this matrix as a multidimensional array. /// Returns this matrix as a multidimensional array.

7
src/Numerics/LinearAlgebra/Options.cs

@ -28,6 +28,8 @@
// OTHER DEALINGS IN THE SOFTWARE. // OTHER DEALINGS IN THE SOFTWARE.
// </copyright> // </copyright>
using System;
namespace MathNet.Numerics.LinearAlgebra namespace MathNet.Numerics.LinearAlgebra
{ {
public enum ExistingData public enum ExistingData
@ -72,8 +74,11 @@ namespace MathNet.Numerics.LinearAlgebra
Symmetric = 1, Symmetric = 1,
/// <summary> /// <summary>
/// A matrix is complex conjugate symmetric. /// A matrix is hermitian (conjugate symmetric).
/// </summary> /// </summary>
Hermitian = 2,
[Obsolete("Use Hermitian instead. Will be removed in v4.")]
ConjugateSymmetric = 2, ConjugateSymmetric = 2,
/// <summary> /// <summary>

2
src/Numerics/LinearAlgebra/Single/Factorization/DenseEvd.cs

@ -83,7 +83,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Factorization
switch (symmetricity) switch (symmetricity)
{ {
case Symmetricity.Symmetric: case Symmetricity.Symmetric:
case Symmetricity.ConjugateSymmetric: case Symmetricity.Hermitian:
isSymmetric = true; isSymmetric = true;
break; break;
case Symmetricity.Asymmetric: case Symmetricity.Asymmetric:

2
src/Numerics/LinearAlgebra/Single/Factorization/UserEvd.cs

@ -82,7 +82,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Factorization
switch (symmetricity) switch (symmetricity)
{ {
case Symmetricity.Symmetric: case Symmetricity.Symmetric:
case Symmetricity.ConjugateSymmetric: case Symmetricity.Hermitian:
isSymmetric = true; isSymmetric = true;
break; break;
case Symmetricity.Asymmetric: case Symmetricity.Asymmetric:

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

@ -704,9 +704,9 @@ namespace MathNet.Numerics.LinearAlgebra.Single
} }
/// <summary> /// <summary>
/// Evaluates whether this matrix is conjugate symmetric. /// Evaluates whether this matrix is hermitian (conjugate symmetric).
/// </summary> /// </summary>
public override sealed bool IsConjugateSymmetric() public override sealed bool IsHermitian()
{ {
return IsSymmetric(); return IsSymmetric();
} }

10
src/UnitTests/LinearAlgebraTests/Complex/Factorization/EvdTests.cs

@ -90,7 +90,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
public void CanFactorizeRandomSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order) public void CanFactorizeRandomSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order)
{ {
var A = Matrix<Complex>.Build.RandomPositiveDefinite(order, 1); var A = Matrix<Complex>.Build.RandomPositiveDefinite(order, 1);
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var factorEvd = A.Evd(); var factorEvd = A.Evd();
var V = factorEvd.EigenVectors; var V = factorEvd.EigenVectors;
var λ = factorEvd.D; var λ = factorEvd.D;
@ -149,7 +149,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
public void CanSolveForRandomVectorAndSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order) public void CanSolveForRandomVectorAndSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order)
{ {
var A = Matrix<Complex>.Build.RandomPositiveDefinite(order, 1); var A = Matrix<Complex>.Build.RandomPositiveDefinite(order, 1);
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var ACopy = A.Clone(); var ACopy = A.Clone();
var evd = A.Evd(); var evd = A.Evd();
@ -177,7 +177,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
{ {
var A = Matrix<Complex>.Build.RandomPositiveDefinite(order, 1); var A = Matrix<Complex>.Build.RandomPositiveDefinite(order, 1);
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var ACopy = A.Clone(); var ACopy = A.Clone();
var evd = A.Evd(); var evd = A.Evd();
@ -210,7 +210,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
public void CanSolveForRandomVectorAndSymmetricMatrixWhenResultVectorGiven([Values(1, 2, 5, 10, 50, 100)] int order) public void CanSolveForRandomVectorAndSymmetricMatrixWhenResultVectorGiven([Values(1, 2, 5, 10, 50, 100)] int order)
{ {
var A = Matrix<Complex>.Build.RandomPositiveDefinite(order, 1); var A = Matrix<Complex>.Build.RandomPositiveDefinite(order, 1);
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var ACopy = A.Clone(); var ACopy = A.Clone();
var evd = A.Evd(); var evd = A.Evd();
@ -238,7 +238,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
public void CanSolveForRandomMatrixAndSymmetricMatrixWhenResultMatrixGiven([Values(1, 2, 5, 10, 50, 100)] int order) public void CanSolveForRandomMatrixAndSymmetricMatrixWhenResultMatrixGiven([Values(1, 2, 5, 10, 50, 100)] int order)
{ {
var A = Matrix<Complex>.Build.RandomPositiveDefinite(order, 1); var A = Matrix<Complex>.Build.RandomPositiveDefinite(order, 1);
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var ACopy = A.Clone(); var ACopy = A.Clone();
var evd = A.Evd(); var evd = A.Evd();

8
src/UnitTests/LinearAlgebraTests/Complex/Factorization/UserEvdTests.cs

@ -202,7 +202,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
public void CanSolveForRandomVectorAndSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order) public void CanSolveForRandomVectorAndSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order)
{ {
var A = new UserDefinedMatrix(Matrix<Complex>.Build.RandomPositiveDefinite(order, 1).ToArray()); var A = new UserDefinedMatrix(Matrix<Complex>.Build.RandomPositiveDefinite(order, 1).ToArray());
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var ACopy = A.Clone(); var ACopy = A.Clone();
var evd = A.Evd(); var evd = A.Evd();
@ -229,7 +229,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
public void CanSolveForRandomMatrixAndSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order) public void CanSolveForRandomMatrixAndSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order)
{ {
var A = new UserDefinedMatrix(Matrix<Complex>.Build.RandomPositiveDefinite(order, 1).ToArray()); var A = new UserDefinedMatrix(Matrix<Complex>.Build.RandomPositiveDefinite(order, 1).ToArray());
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var ACopy = A.Clone(); var ACopy = A.Clone();
var evd = A.Evd(); var evd = A.Evd();
@ -262,7 +262,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
public void CanSolveForRandomVectorAndSymmetricMatrixWhenResultVectorGiven([Values(1, 2, 5, 10, 50, 100)] int order) public void CanSolveForRandomVectorAndSymmetricMatrixWhenResultVectorGiven([Values(1, 2, 5, 10, 50, 100)] int order)
{ {
var A = new UserDefinedMatrix(Matrix<Complex>.Build.RandomPositiveDefinite(order, 1).ToArray()); var A = new UserDefinedMatrix(Matrix<Complex>.Build.RandomPositiveDefinite(order, 1).ToArray());
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var ACopy = A.Clone(); var ACopy = A.Clone();
var evd = A.Evd(); var evd = A.Evd();
@ -290,7 +290,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.Factorization
public void CanSolveForRandomMatrixAndSymmetricMatrixWhenResultMatrixGiven([Values(1, 2, 5, 10, 50, 100)] int order) public void CanSolveForRandomMatrixAndSymmetricMatrixWhenResultMatrixGiven([Values(1, 2, 5, 10, 50, 100)] int order)
{ {
var A = new UserDefinedMatrix(Matrix<Complex>.Build.RandomPositiveDefinite(order, 1).ToArray()); var A = new UserDefinedMatrix(Matrix<Complex>.Build.RandomPositiveDefinite(order, 1).ToArray());
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var ACopy = A.Clone(); var ACopy = A.Clone();
var evd = A.Evd(); var evd = A.Evd();

10
src/UnitTests/LinearAlgebraTests/Complex32/Factorization/EvdTests.cs

@ -91,7 +91,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
public void CanFactorizeRandomSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order) public void CanFactorizeRandomSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order)
{ {
var A = Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1); var A = Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1);
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var factorEvd = A.Evd(); var factorEvd = A.Evd();
var V = factorEvd.EigenVectors; var V = factorEvd.EigenVectors;
var λ = factorEvd.D; var λ = factorEvd.D;
@ -150,7 +150,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
public void CanSolveForRandomVectorAndSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order) public void CanSolveForRandomVectorAndSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order)
{ {
var A = Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1); var A = Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1);
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var ACopy = A.Clone(); var ACopy = A.Clone();
var evd = A.Evd(); var evd = A.Evd();
@ -177,7 +177,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
public void CanSolveForRandomMatrixAndSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order) public void CanSolveForRandomMatrixAndSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order)
{ {
var A = Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1); var A = Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1);
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var ACopy = A.Clone(); var ACopy = A.Clone();
var evd = A.Evd(); var evd = A.Evd();
@ -210,7 +210,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
public void CanSolveForRandomVectorAndSymmetricMatrixWhenResultVectorGiven([Values(1, 2, 5, 10, 50, 100)] int order) public void CanSolveForRandomVectorAndSymmetricMatrixWhenResultVectorGiven([Values(1, 2, 5, 10, 50, 100)] int order)
{ {
var A = Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1); var A = Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1);
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var ACopy = A.Clone(); var ACopy = A.Clone();
var evd = A.Evd(); var evd = A.Evd();
@ -238,7 +238,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
public void CanSolveForRandomMatrixAndSymmetricMatrixWhenResultMatrixGiven([Values(1, 2, 5, 10, 50, 100)] int order) public void CanSolveForRandomMatrixAndSymmetricMatrixWhenResultMatrixGiven([Values(1, 2, 5, 10, 50, 100)] int order)
{ {
var A = Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1); var A = Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1);
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var ACopy = A.Clone(); var ACopy = A.Clone();
var evd = A.Evd(); var evd = A.Evd();

8
src/UnitTests/LinearAlgebraTests/Complex32/Factorization/UserEvdTests.cs

@ -201,7 +201,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
public void CanSolveForRandomVectorAndSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order) public void CanSolveForRandomVectorAndSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order)
{ {
var A = new UserDefinedMatrix(Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1).ToArray()); var A = new UserDefinedMatrix(Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1).ToArray());
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var ACopy = A.Clone(); var ACopy = A.Clone();
var evd = A.Evd(); var evd = A.Evd();
@ -228,7 +228,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
public void CanSolveForRandomMatrixAndSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order) public void CanSolveForRandomMatrixAndSymmetricMatrix([Values(1, 2, 5, 10, 50, 100)] int order)
{ {
var A = new UserDefinedMatrix(Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1).ToArray()); var A = new UserDefinedMatrix(Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1).ToArray());
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var ACopy = A.Clone(); var ACopy = A.Clone();
var evd = A.Evd(); var evd = A.Evd();
@ -261,7 +261,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
public void CanSolveForRandomVectorAndSymmetricMatrixWhenResultVectorGiven([Values(1, 2, 5, 10, 50, 100)] int order) public void CanSolveForRandomVectorAndSymmetricMatrixWhenResultVectorGiven([Values(1, 2, 5, 10, 50, 100)] int order)
{ {
var A = new UserDefinedMatrix(Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1).ToArray()); var A = new UserDefinedMatrix(Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1).ToArray());
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var ACopy = A.Clone(); var ACopy = A.Clone();
var evd = A.Evd(); var evd = A.Evd();
@ -289,7 +289,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.Factorization
public void CanSolveForRandomMatrixAndSymmetricMatrixWhenResultMatrixGiven([Values(1, 2, 5, 10, 50, 100)] int order) public void CanSolveForRandomMatrixAndSymmetricMatrixWhenResultMatrixGiven([Values(1, 2, 5, 10, 50, 100)] int order)
{ {
var A = new UserDefinedMatrix(Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1).ToArray()); var A = new UserDefinedMatrix(Matrix<Complex32>.Build.RandomPositiveDefinite(order, 1).ToArray());
MatrixHelpers.ForceConjugateSymmetric(A); MatrixHelpers.ForceHermitian(A);
var ACopy = A.Clone(); var ACopy = A.Clone();
var evd = A.Evd(); var evd = A.Evd();

6
src/UnitTests/LinearAlgebraTests/MatrixHelpers.cs

@ -61,11 +61,11 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests
} }
/// <summary> /// <summary>
/// Forces a matrix elements to conjugate symmetric. Copies the conjugate of the values /// Forces a matrix elements to hermitian (conjugate symmetric). Copies the conjugate of the values
/// from the lower triangle to the upper triangle. /// from the lower triangle to the upper triangle.
/// </summary> /// </summary>
/// <param name="matrix">The matrix to make conjugate symmetric.</param> /// <param name="matrix">The matrix to make conjugate symmetric.</param>
static public void ForceConjugateSymmetric(Matrix<Complex64> matrix) static public void ForceHermitian(Matrix<Complex64> matrix)
{ {
if (matrix.RowCount != matrix.ColumnCount) if (matrix.RowCount != matrix.ColumnCount)
{ {
@ -85,7 +85,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests
/// from the lower triangle to the upper triangle. /// from the lower triangle to the upper triangle.
/// </summary> /// </summary>
/// <param name="matrix">The matrix to make conjugate symmetric.</param> /// <param name="matrix">The matrix to make conjugate symmetric.</param>
public static void ForceConjugateSymmetric(Matrix<Numerics.Complex32> matrix) public static void ForceHermitian(Matrix<Numerics.Complex32> matrix)
{ {
if (matrix.RowCount != matrix.ColumnCount) if (matrix.RowCount != matrix.ColumnCount)
{ {

Loading…
Cancel
Save