diff --git a/data/Matlab/complex.mat b/data/Matlab/complex.mat new file mode 100644 index 00000000..18b85bb8 Binary files /dev/null and b/data/Matlab/complex.mat differ diff --git a/data/Matlab/matrices.txt b/data/Matlab/matrices.txt index 72829177..91d7dc97 100644 --- a/data/Matlab/matrices.txt +++ b/data/Matlab/matrices.txt @@ -12,4 +12,14 @@ collection.mat contains: * a vector w A.mat contains: -* a matrix A \ No newline at end of file +* a matrix A + +complex.mat contains: +* dense, complex matrix a +* dense, complex matrix b +* dense, complex matrix c + +sparse_complex.mat contains: +* sparse, complex matrix sa +* sparse, complex matrix sb +* sparse, complex matrix sc diff --git a/data/Matlab/sparse_complex.mat b/data/Matlab/sparse_complex.mat new file mode 100644 index 00000000..b1fe2d19 Binary files /dev/null and b/data/Matlab/sparse_complex.mat differ diff --git a/src/MathNet.Numerics.5.1.ReSharper b/src/MathNet.Numerics.5.1.ReSharper index 108ae5fe..1b3673de 100644 --- a/src/MathNet.Numerics.5.1.ReSharper +++ b/src/MathNet.Numerics.5.1.ReSharper @@ -18,7 +18,8 @@ Xorshift Matlab Matlab Matlab -Endian +Endian +indices diff --git a/src/Numerics/LinearAlgebra/IO/Matlab/MatlabParser.cs b/src/Numerics/LinearAlgebra/IO/Matlab/MatlabParser.cs index 7e4b6010..302e2f7a 100644 --- a/src/Numerics/LinearAlgebra/IO/Matlab/MatlabParser.cs +++ b/src/Numerics/LinearAlgebra/IO/Matlab/MatlabParser.cs @@ -1017,6 +1017,9 @@ namespace MathNet.Numerics.LinearAlgebra.IO.Matlab if (isComplex) { + // skip header + reader.ReadBytes(8); + switch (type) { case DataType.Int8: @@ -1244,6 +1247,9 @@ namespace MathNet.Numerics.LinearAlgebra.IO.Matlab if (isComplex) { + // skip header + reader.ReadBytes(8); + switch (type) { case DataType.Int8: diff --git a/src/UnitTests/LinearAlgebraTests/Complex/IO/MatlabReaderTests.cs b/src/UnitTests/LinearAlgebraTests/Complex/IO/MatlabReaderTests.cs index d401fc78..5b03e108 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/IO/MatlabReaderTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/IO/MatlabReaderTests.cs @@ -1,13 +1,52 @@  namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex.IO { - using LinearAlgebra.Double; - using LinearAlgebra.Double.IO; + using System; + using System.Diagnostics; + using LinearAlgebra.Complex; + using LinearAlgebra.Complex.IO; using MbUnit.Framework; [TestFixture] public class MatlabMatrixReaderTest { + + [Test] + public void CanReadComplexAllMatrices() + { + var dmr = new MatlabMatrixReader("./data/Matlab/complex.mat"); + var matrices = dmr.ReadMatrices(); + Assert.AreEqual(3, matrices.Length); + foreach (var matrix in matrices) + { + Assert.AreEqual(typeof(DenseMatrix), matrix.GetType()); + } + + var a = matrices[0]; + + Assert.AreEqual(100, a.RowCount); + Assert.AreEqual(100, a.ColumnCount); + AssertHelpers.AlmostEqual(27.232498979698409, a.L2Norm(), 15); + } + + [Test] + public void CanReadSparseComplexAllMatrices() + { + var dmr = new MatlabMatrixReader("./data/Matlab/sparse_complex.mat"); + var matrices = dmr.ReadMatrices(); + Assert.AreEqual(3, matrices.Length); + foreach (var matrix in matrices) + { + Assert.AreEqual(typeof(SparseMatrix), matrix.GetType()); + } + + var a = matrices[0]; + + Assert.AreEqual(100, a.RowCount); + Assert.AreEqual(100, a.ColumnCount); + AssertHelpers.AlmostEqual(13.223654390985379, a.L2Norm(), 15); + } + [Test] public void CanReadNonComplexAllMatrices() { diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/IO/MatlabReaderTests.cs b/src/UnitTests/LinearAlgebraTests/Complex32/IO/MatlabReaderTests.cs index 47504e3b..626e11e2 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/IO/MatlabReaderTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/IO/MatlabReaderTests.cs @@ -1,13 +1,50 @@  namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.IO { - using LinearAlgebra.Double; - using LinearAlgebra.Double.IO; + using LinearAlgebra.Complex32; + using LinearAlgebra.Complex32.IO; using MbUnit.Framework; [TestFixture] public class MatlabMatrixReaderTest { + + [Test] + public void CanReadComplexAllMatrices() + { + var dmr = new MatlabMatrixReader("./data/Matlab/complex.mat"); + var matrices = dmr.ReadMatrices(); + Assert.AreEqual(3, matrices.Length); + foreach (var matrix in matrices) + { + Assert.AreEqual(typeof(DenseMatrix), matrix.GetType()); + } + + var a = matrices[0]; + + Assert.AreEqual(100, a.RowCount); + Assert.AreEqual(100, a.ColumnCount); + AssertHelpers.AlmostEqual(27.232498979698409, a.L2Norm(), 6); + } + + [Test] + public void CanReadSparseComplexAllMatrices() + { + var dmr = new MatlabMatrixReader("./data/Matlab/sparse_complex.mat"); + var matrices = dmr.ReadMatrices(); + Assert.AreEqual(3, matrices.Length); + foreach (var matrix in matrices) + { + Assert.AreEqual(typeof(SparseMatrix), matrix.GetType()); + } + + var a = matrices[0]; + + Assert.AreEqual(100, a.RowCount); + Assert.AreEqual(100, a.ColumnCount); + AssertHelpers.AlmostEqual(13.223654390985379, a.L2Norm(), 7); + } + [Test] public void CanReadNonComplexAllMatrices() { @@ -28,7 +65,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.IO Assert.AreEqual(100, matrix.RowCount); Assert.AreEqual(100, matrix.ColumnCount); Assert.AreEqual(typeof(DenseMatrix), matrix.GetType()); - AssertHelpers.AlmostEqual(100.108979553704, matrix.FrobeniusNorm(), 13); + AssertHelpers.AlmostEqual(100.108979553704, matrix.FrobeniusNorm(), 6); } @@ -52,7 +89,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.IO Assert.AreEqual(1, matrices.Length); Assert.AreEqual(100, matrices[0].RowCount); Assert.AreEqual(100, matrices[0].ColumnCount); - AssertHelpers.AlmostEqual(100.431635988639, matrices[0].FrobeniusNorm(), 13); + AssertHelpers.AlmostEqual(100.431635988639, matrices[0].FrobeniusNorm(), 6); Assert.AreEqual(typeof(DenseMatrix), matrices[0].GetType()); } @@ -64,7 +101,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32.IO Assert.AreEqual(100, matrix.RowCount); Assert.AreEqual(100, matrix.ColumnCount); Assert.AreEqual(typeof(SparseMatrix), matrix.GetType()); - AssertHelpers.AlmostEqual(17.6385090630805, matrix.FrobeniusNorm(), 12); + AssertHelpers.AlmostEqual(17.6385090630805, matrix.FrobeniusNorm(), 6); } } } diff --git a/src/UnitTests/UnitTests.csproj b/src/UnitTests/UnitTests.csproj index 40aca2c6..fb8e9e98 100644 --- a/src/UnitTests/UnitTests.csproj +++ b/src/UnitTests/UnitTests.csproj @@ -376,6 +376,10 @@ data\Matlab\collection.mat PreserveNewest + + data\Matlab\complex.mat + Always + data\Matlab\sparse-large.mat PreserveNewest @@ -384,6 +388,10 @@ data\Matlab\sparse-small.mat PreserveNewest + + data\Matlab\sparse_complex.mat + Always + data\Matlab\v.mat PreserveNewest