From d7124278af509ece62b719e29da4cdf66af8adb1 Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Thu, 29 May 2014 13:42:20 +0200 Subject: [PATCH] LA: fix IsConjugateSymmetric to ensure diagonal is real --- src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs | 13 +++++++++++-- .../LinearAlgebra/Complex/DiagonalMatrix.cs | 8 ++++++++ src/Numerics/LinearAlgebra/Complex/Matrix.cs | 8 ++++++++ src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs | 9 +++++++++ .../LinearAlgebra/Complex32/DiagonalMatrix.cs | 8 ++++++++ src/Numerics/LinearAlgebra/Complex32/Matrix.cs | 8 ++++++++ 6 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs b/src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs index b8e7afc5..f1cd2171 100644 --- a/src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs @@ -669,7 +669,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex } return; } - + base.DoMultiply(other, result); } @@ -804,7 +804,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex denseResult.Values); return; } - + base.DoTransposeThisAndMultiply(rightSide, result); } @@ -1263,6 +1263,15 @@ namespace MathNet.Numerics.LinearAlgebra.Complex return false; } + int stride = RowCount + 1; + for (var k = 0; k < _values.Length; k += stride) + { + if (!_values[k].IsReal()) + { + return false; + } + } + for (var j = 0; j < ColumnCount; j++) { var index = j * RowCount; diff --git a/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs index 8e1a6e0a..04fb7f65 100644 --- a/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs @@ -1018,6 +1018,14 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// public override sealed bool IsConjugateSymmetric() { + for (var k = 0; k < _data.Length; k ++) + { + if (!_data[k].IsReal()) + { + return false; + } + } + return true; } } diff --git a/src/Numerics/LinearAlgebra/Complex/Matrix.cs b/src/Numerics/LinearAlgebra/Complex/Matrix.cs index 83695eb4..2c508211 100644 --- a/src/Numerics/LinearAlgebra/Complex/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Complex/Matrix.cs @@ -671,6 +671,14 @@ namespace MathNet.Numerics.LinearAlgebra.Complex return false; } + for (var k = 0; k < RowCount; k++) + { + if (!At(k, k).IsReal()) + { + return false; + } + } + for (var row = 0; row < RowCount; row++) { for (var column = row + 1; column < ColumnCount; column++) diff --git a/src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs b/src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs index a756020e..fd6a295f 100644 --- a/src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs @@ -1260,6 +1260,15 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 return false; } + int stride = RowCount + 1; + for (var k = 0; k < _values.Length; k += stride) + { + if (!_values[k].IsReal()) + { + return false; + } + } + for (var j = 0; j < ColumnCount; j++) { var index = j * RowCount; diff --git a/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs index 55f422cd..7a25a5d6 100644 --- a/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs @@ -1012,6 +1012,14 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// public override sealed bool IsConjugateSymmetric() { + for (var k = 0; k < _data.Length; k++) + { + if (!_data[k].IsReal()) + { + return false; + } + } + return true; } } diff --git a/src/Numerics/LinearAlgebra/Complex32/Matrix.cs b/src/Numerics/LinearAlgebra/Complex32/Matrix.cs index e8dded99..79451d43 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Matrix.cs @@ -665,6 +665,14 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 return false; } + for (var k = 0; k < RowCount; k++) + { + if (!At(k, k).IsReal()) + { + return false; + } + } + for (var row = 0; row < RowCount; row++) { for (var column = row + 1; column < ColumnCount; column++)