From 0fd379dffeda37dca2cbf3481043cbc868f49942 Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Sat, 4 Aug 2012 15:12:38 +0200 Subject: [PATCH] Tests: replace matrix structural tests with theory (part 4) - Triangle, Diagonal --- .../Complex/DiagonalMatrixTests.cs | 88 --- .../Complex/MatrixStructureTheory.cs | 5 + .../LinearAlgebraTests/Complex/MatrixTests.cs | 676 ------------------ .../Complex32/DiagonalMatrixTests.cs | 88 --- .../Complex32/MatrixStructureTheory.cs | 5 + .../Complex32/MatrixTests.cs | 676 ------------------ .../Double/DiagonalMatrixTests.cs | 88 --- .../Double/MatrixStructureTheory.cs | 5 + .../LinearAlgebraTests/Double/MatrixTests.cs | 640 ----------------- .../MatrixStructureTheory.cs | 404 ++++++++++- .../Single/DiagonalMatrixTests.cs | 88 --- .../Single/MatrixStructureTheory.cs | 5 + .../LinearAlgebraTests/Single/MatrixTests.cs | 640 ----------------- 13 files changed, 401 insertions(+), 3007 deletions(-) diff --git a/src/UnitTests/LinearAlgebraTests/Complex/DiagonalMatrixTests.cs b/src/UnitTests/LinearAlgebraTests/Complex/DiagonalMatrixTests.cs index 1dd1bb40..6d731846 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/DiagonalMatrixTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/DiagonalMatrixTests.cs @@ -320,94 +320,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex } } - /// - /// Can set a column with an array. - /// - /// Matrix name. - /// Column array. - public override void CanSetColumnWithArray(string name, double[] column) - { - try - { - // Pass all invoke to base - base.CanSetColumnWithArray(name, column); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - - /// - /// Can set a column with a vector. - /// - /// Matrix name. - /// Column values. - public override void CanSetColumnWithVector(string name, double[] column) - { - try - { - // Pass all invoke to base - base.CanSetColumnWithVector(name, column); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - - /// - /// Can set a row with an array. - /// - /// Matrix name. - /// Row values. - public override void CanSetRowWithArray(string name, double[] row) - { - try - { - // Pass all invoke to base - base.CanSetRowWithArray(name, row); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - - /// - /// Can set a row with a vector. - /// - /// Matrix name. - /// Row index. - public override void CanSetRowWithVector(string name, double[] row) - { - try - { - // Pass all invoke to base - base.CanSetRowWithVector(name, row); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - /// /// Can set a submatrix. /// diff --git a/src/UnitTests/LinearAlgebraTests/Complex/MatrixStructureTheory.cs b/src/UnitTests/LinearAlgebraTests/Complex/MatrixStructureTheory.cs index 6fd65dc7..4efee412 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/MatrixStructureTheory.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/MatrixStructureTheory.cs @@ -46,5 +46,10 @@ { return new DenseVector(size); } + + protected override Complex Zero + { + get { return Complex.Zero; } + } } } \ No newline at end of file diff --git a/src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.cs b/src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.cs index 8c5e5066..4b0e85f4 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.cs @@ -36,350 +36,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex /// public abstract partial class MatrixTests : MatrixLoader { - /// - /// Can set a row. - /// - /// Row index. - /// Matrix name. - [TestCase(0, "Singular3x3")] - [TestCase(1, "Square3x3")] - [TestCase(2, "Square3x3")] - public void CanSetRow(int rowIndex, string name) - { - var matrix = TestMatrices[name].Clone(); - matrix.SetRow(rowIndex, CreateVector(matrix.ColumnCount)); - - for (var i = 0; i < matrix.RowCount; i++) - { - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(i == rowIndex ? Complex.Zero : TestMatrices[name][i, j], matrix[i, j]); - } - } - } - - /// - /// Can set a column. - /// - /// Column index. - /// Matrix name. - [TestCase(0, "Singular3x3")] - [TestCase(1, "Square3x3")] - [TestCase(2, "Square3x3")] - public void CanSetColumn(int colIndex, string name) - { - var matrix = TestMatrices[name].Clone(); - matrix.SetColumn(colIndex, CreateVector(matrix.ColumnCount)); - - for (var i = 0; i < matrix.RowCount; i++) - { - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(j == colIndex ? Complex.Zero : TestMatrices[name][i, j], matrix[i, j]); - } - } - } - - /// - /// Get an upper triangle matrix. - /// - /// Matrix name. - [TestCase("Singular3x3")] - [TestCase("Square3x3")] - [TestCase("Square4x4")] - [TestCase("Tall3x2")] - [TestCase("Wide2x3")] - public void CanUpperTriangle(string name) - { - var data = TestMatrices[name]; - var upper = data.UpperTriangle(); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i <= j ? data[i, j] : Complex.Zero, upper[i, j]); - } - } - } - - /// - /// Get an upper triangle matrix into a result matrix. - /// - /// Matrix name. - [TestCase("Singular3x3")] - [TestCase("Square3x3")] - [TestCase("Square4x4")] - [TestCase("Tall3x2")] - [TestCase("Wide2x3")] - public void CanUpperTriangleIntoResult(string name) - { - var data = TestMatrices[name]; - var result = CreateMatrix(data.RowCount, data.ColumnCount); - data.UpperTriangle(result); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i <= j ? data[i, j] : Complex.Zero, result[i, j]); - } - } - } - - /// - /// Get an upper triangle matrix into null result matrix throws ArgumentNullException. - /// - [Test] - public void UpperTriangleIntoResultNullThrowsArgumentNullException() - { - var data = TestMatrices["Square3x3"]; - Matrix result = null; - Assert.Throws(() => data.UpperTriangle(result)); - } - - /// - /// Get an upper triangle into a result matrix with unequal rows throws ArgumentException. - /// - [Test] - public void UpperTriangleIntoResultWithUnEqualRowsThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var result = CreateMatrix(data.RowCount + 1, data.ColumnCount); - Assert.Throws(() => data.UpperTriangle(result)); - } - - /// - /// Get an upper triangle into a result matrix with unequal columns throws ArgumentException. - /// - [Test] - public void UpperTriangleIntoResultWithUnEqualColumnsThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var result = CreateMatrix(data.RowCount, data.ColumnCount + 1); - Assert.Throws(() => data.UpperTriangle(result)); - } - - /// - /// Get a lower triangle matrix. - /// - /// Matrix name. - [TestCase("Singular3x3")] - [TestCase("Square3x3")] - [TestCase("Square4x4")] - [TestCase("Tall3x2")] - [TestCase("Wide2x3")] - public void CanLowerTriangle(string name) - { - var data = TestMatrices[name]; - var lower = data.LowerTriangle(); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i >= j ? data[i, j] : Complex.Zero, lower[i, j]); - } - } - } - - /// - /// Get a lower triangle matrix into a result matrix. - /// - /// Matrix name. - [TestCase("Singular3x3")] - [TestCase("Square3x3")] - [TestCase("Square4x4")] - [TestCase("Tall3x2")] - [TestCase("Wide2x3")] - public void CanLowerTriangleIntoResult(string name) - { - var data = TestMatrices[name]; - var result = CreateMatrix(data.RowCount, data.ColumnCount); - data.LowerTriangle(result); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i >= j ? data[i, j] : Complex.Zero, result[i, j]); - } - } - } - - /// - /// Get a lower triangle matrix into null result matrix throws ArgumentNullException. - /// - [Test] - public void LowerTriangleIntoResultNullThrowsArgumentNullException() - { - var data = TestMatrices["Square3x3"]; - Matrix result = null; - Assert.Throws(() => data.LowerTriangle(result)); - } - - /// - /// Get a lower triangle into a result matrix with unequal rows throws ArgumentException. - /// - [Test] - public void LowerTriangleIntoResultWithUnEqualRowsThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var result = CreateMatrix(data.RowCount + 1, data.ColumnCount); - Assert.Throws(() => data.LowerTriangle(result)); - } - - /// - /// Get a lower triangle into a result matrix with unequal columns throws ArgumentException. - /// - [Test] - public void LowerTriangleIntoResultWithUnEqualColumnsThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var result = CreateMatrix(data.RowCount, data.ColumnCount + 1); - Assert.Throws(() => data.LowerTriangle(result)); - } - - /// - /// Get a strictly lower triangle. - /// - [Test] - public void CanStrictlyLowerTriangle() - { - foreach (var data in TestMatrices.Values) - { - var lower = data.StrictlyLowerTriangle(); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i > j ? data[i, j] : Complex.Zero, lower[i, j]); - } - } - } - } - - /// - /// Get a strictly lower triangle into a result matrix. - /// - [Test] - public void CanStrictlyLowerTriangleIntoResult() - { - foreach (var data in TestMatrices.Values) - { - var lower = CreateMatrix(data.RowCount, data.ColumnCount); - data.StrictlyLowerTriangle(lower); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i > j ? data[i, j] : Complex.Zero, lower[i, j]); - } - } - } - } - - /// - /// Get a strictly lower triangle with null parameter throws ArgumentNullException. - /// - [Test] - public void StrictlyLowerTriangleWithNullParameterThrowsArgumentNullException() - { - var data = TestMatrices["Square3x3"]; - Matrix lower = null; - Assert.Throws(() => data.StrictlyLowerTriangle(lower)); - } - - /// - /// Get a strictly lower triangle into result with unequal column number throws ArgumentException. - /// - [Test] - public void StrictlyLowerTriangleIntoResultWithUnequalColumnNumberThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var lower = CreateMatrix(data.RowCount, data.ColumnCount + 1); - Assert.Throws(() => data.StrictlyLowerTriangle(lower)); - } - - /// - /// Get a strictly lower triangle into result with unequal row number throws ArgumentException. - /// - [Test] - public void StrictlyLowerTriangleIntoResultWithUnequalRowNumberThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var lower = CreateMatrix(data.RowCount + 1, data.ColumnCount); - Assert.Throws(() => data.StrictlyLowerTriangle(lower)); - } - - /// - /// Get a strictly upper triangle. - /// - [Test] - public void CanStrictlyUpperTriangle() - { - foreach (var data in TestMatrices.Values) - { - var lower = data.StrictlyUpperTriangle(); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i < j ? data[i, j] : Complex.Zero, lower[i, j]); - } - } - } - } - - /// - /// Get a strictly upper triangle into a result matrix. - /// - [Test] - public void CanStrictlyUpperTriangleIntoResult() - { - foreach (var data in TestMatrices.Values) - { - var lower = CreateMatrix(data.RowCount, data.ColumnCount); - data.StrictlyUpperTriangle(lower); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i < j ? data[i, j] : Complex.Zero, lower[i, j]); - } - } - } - } - - /// - /// Get a strictly upper triangle with null parameter throws ArgumentNullException. - /// - [Test] - public void StrictlyUpperTriangleWithNullParameterThrowsArgumentNullException() - { - var data = TestMatrices["Square3x3"]; - Matrix lower = null; - Assert.Throws(() => data.StrictlyUpperTriangle(lower)); - } - - /// - /// Get a strictly upper triangle into a result matrix with unequal column number throws ArgumentException. - /// - [Test] - public void StrictlyUpperTriangleIntoResultWithUnequalColumnNumberThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var lower = CreateMatrix(data.RowCount, data.ColumnCount + 1); - Assert.Throws(() => data.StrictlyUpperTriangle(lower)); - } - - /// - /// Get a strictly upper triangle into a result matrix with unequal row number throws ArgumentException. - /// - [Test] - public void StrictlyUpperTriangleIntoResultWithUnequalRowNumberThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var lower = CreateMatrix(data.RowCount + 1, data.ColumnCount); - Assert.Throws(() => data.StrictlyUpperTriangle(lower)); - } - /// /// Can transpose a matrix. /// @@ -432,129 +88,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex } } - /// - /// Can set a column with an array. - /// - /// Matrix name. - /// Column real values array. - [TestCase("Singular3x3", new double[] { 1, 2, 3 })] - [TestCase("Square3x3", new double[] { 1, 2, 3 })] - [TestCase("Tall3x2", new double[] { 1, 2, 3 })] - [TestCase("Wide2x3", new double[] { 1, 2 })] - public virtual void CanSetColumnWithArray(string name, double[] real) - { - var column = new Complex[real.Length]; - for (var i = 0; i < real.Length; i++) - { - column[i] = new Complex(real[i], 1); - } - - var matrix = TestMatrices[name]; - for (var i = 0; i < matrix.ColumnCount; i++) - { - matrix.SetColumn(i, column); - for (var j = 0; j < matrix.RowCount; j++) - { - Assert.AreEqual(matrix[j, i], column[j]); - } - } - } - - /// - /// Set a column with null array throws ArgumentNullException. - /// - [Test] - public virtual void SetColumnWithNullArrayThrowsArgumentNullException() - { - Complex[] vec = null; - Assert.Throws(() => TestMatrices["Singular3x3"].SetColumn(1, vec)); - } - - /// - /// Set a column with unequal array length throws ArgumentException. - /// - [Test] - public virtual void SetColumnWithArrayUnequalLengthThrowsArgumentException() - { - var array = new Complex[] { 1, 2, 3, 4, 5 }; - Assert.Throws(() => TestMatrices["Singular3x3"].SetColumn(1, array)); - } - - /// - /// Set a column array with invalid column index throws ArgumentOutOfRangeException. - /// - [Test] - public void SetColumnWithArrayWithInvalidColumnIndexThrowsArgumentOutOfRangeException() - { - var matrix = TestMatrices["Square3x3"]; - Complex[] column = { 1, 2, 3 }; - Assert.Throws(() => matrix.SetColumn(matrix.ColumnCount + 1, column)); - Assert.Throws(() => matrix.SetColumn(-1, column)); - } - - /// - /// Can set a column with a vector. - /// - /// Matrix name. - /// Column real values. - [TestCase("Singular3x3", new double[] { 1, 2, 3 })] - [TestCase("Square3x3", new double[] { 1, 2, 3 })] - [TestCase("Tall3x2", new double[] { 1, 2, 3 })] - [TestCase("Wide2x3", new double[] { 1, 2 })] - public virtual void CanSetColumnWithVector(string name, double[] real) - { - var column = new Complex[real.Length]; - for (var i = 0; i < real.Length; i++) - { - column[i] = new Complex(real[i], 1); - } - - var matrix = TestMatrices[name]; - var columnVector = CreateVector(column); - for (var i = 0; i < matrix.ColumnCount; i++) - { - matrix.SetColumn(i, column); - for (var j = 0; j < matrix.RowCount; j++) - { - Assert.AreEqual(matrix[j, i], columnVector[j]); - } - } - } - - /// - /// Set a column with vector with wrong length throws ArgumentException. - /// - [Test] - public virtual void SetColumnWithVectorWithUnequalLengthThrowsArgumentException() - { - var matrix = TestMatrices["Singular3x3"]; - var columnVector = CreateVector(new Complex[] { 1, 2, 3, 4, 5 }); - Assert.Throws(() => matrix.SetColumn(1, columnVector)); - } - - /// - /// Set a column with null vector throw ArgumentNullException. - /// - [Test] - public void SetColumnWithNullVectorThrowsArgumentNullException() - { - var matrix = TestMatrices["Square3x3"]; - Vector columnVector = null; - Assert.Throws(() => matrix.SetColumn(1, columnVector)); - } - - /// - /// Set column vector with invalid column index throws ArgumentOutOfRangeException. - /// - [Test] - public void SetColumnWithVectorWithInvalidColumnIndexThrowsArgumentOutOfRangeException() - { - var matrix = TestMatrices["Square3x3"]; - var column = CreateVector(new Complex[] { 1, 2, 3 }); - Assert.Throws(() => matrix.SetColumn(-1, column)); - Assert.Throws(() => matrix.SetColumn(matrix.ColumnCount + 1, column)); - } - /// /// Can insert a column. /// @@ -615,118 +148,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex Assert.Throws(() => matrix.InsertColumn(0, column)); } - /// - /// Can set a row with an array. - /// - /// Matrix name. - /// Row index. - [TestCase("Singular3x3", new double[] { 1, 2, 3 })] - [TestCase("Square3x3", new double[] { 1, 2, 3 })] - [TestCase("Tall3x2", new double[] { 1, 2 })] - [TestCase("Wide2x3", new double[] { 1, 2, 3 })] - public virtual void CanSetRowWithArray(string name, double[] real) - { - var row = new Complex[real.Length]; - for (var i = 0; i < real.Length; i++) - { - row[i] = new Complex(real[i], 1); - } - - var matrix = TestMatrices[name]; - for (var i = 0; i < matrix.RowCount; i++) - { - matrix.SetRow(i, row); - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(matrix[i, j], row[j]); - } - } - } - - /// - /// Set a row with null array throws ArgumentNullException. - /// - [Test] - public virtual void SetRowWithNullArrayThrowsArgumentNullException() - { - Complex[] arr = null; - Assert.Throws(() => TestMatrices["Square3x3"].SetRow(1, arr)); - } - - /// - /// Set a row with an array with invalid row index throws ArgumentOutOfRangeException. - /// - [Test] - public void SetRowWithArrayWithInvalidRowIndexThrowsArgumentOutOfRangeException() - { - var matrix = TestMatrices["Square3x3"]; - Complex[] row = { 1, 2, 3 }; - Assert.Throws(() => matrix.SetRow(-1, row)); - Assert.Throws(() => matrix.SetRow(matrix.RowCount + 1, row)); - } - - /// - /// Can set a row with a vector. - /// - /// Matrix name. - /// Row real values. - [TestCase("Singular3x3", new double[] { 1, 2, 3 })] - [TestCase("Square3x3", new double[] { 1, 2, 3 })] - [TestCase("Tall3x2", new double[] { 1, 2 })] - [TestCase("Wide2x3", new double[] { 1, 2, 3 })] - public virtual void CanSetRowWithVector(string name, double[] real) - { - var row = new Complex[real.Length]; - for (var i = 0; i < real.Length; i++) - { - row[i] = new Complex(real[i], 1); - } - - var matrix = TestMatrices[name]; - var rowVector = CreateVector(row); - for (var i = 0; i < matrix.RowCount; i++) - { - matrix.SetRow(i, row); - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(matrix[i, j], rowVector[j]); - } - } - } - - /// - /// Set a row with a vector of unequal length throws ArgumentException. - /// - [Test] - public virtual void SetRowWithVectorWithUnequalLengthThrowsArgumentException() - { - var vec = CreateVector(new Complex[] { 1, 2, 3, 4, 5 }); - Assert.Throws(() => TestMatrices["Square3x3"].SetRow(1, vec)); - } - - /// - /// Set a row with a null vector throws ArgumentNullException. - /// - [Test] - public void SetRowWithNullVectorThrowsArgumentNullException() - { - var matrix = TestMatrices["Square3x3"]; - Vector rowVector = null; - Assert.Throws(() => matrix.SetRow(1, rowVector)); - } - - /// - /// Set a row with a vector with invalid row index throws ArgumentOutOfRangeException. - /// - [Test] - public void SetRowWithVectorWithInvalidRowIndexThrowsArgumentOutOfRangeException() - { - var matrix = TestMatrices["Square3x3"]; - var row = CreateVector(new Complex[] { 1, 2, 3 }); - Assert.Throws(() => matrix.SetRow(-1, row)); - Assert.Throws(() => matrix.SetRow(matrix.RowCount + 1, row)); - } - /// /// Can set a submatrix. /// @@ -809,103 +230,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex Assert.Throws(() => TestMatrices["Square3x3"].SetSubMatrix(0, 2, 0, 2, subMatrix)); } - /// - /// Can set a diagonal vector. - /// - /// Matrix name. - /// Diagonal real values. - [TestCase("Square3x3", new double[] { 1, 2, 3 })] - [TestCase("Wide2x3", new double[] { 1, 2 })] - [TestCase("Tall3x2", new double[] { 1, 2 })] - public void CanSetDiagonalVector(string name, double[] real) - { - var diagonal = new Complex[real.Length]; - for (var i = 0; i < real.Length; i++) - { - diagonal[i] = new Complex(real[i], 1); - } - - var matrix = TestMatrices[name]; - var vector = CreateVector(diagonal); - matrix.SetDiagonal(vector); - - var min = Math.Min(matrix.ColumnCount, matrix.RowCount); - Assert.AreEqual(diagonal.Length, min); - - for (var i = 0; i < vector.Count; i++) - { - Assert.AreEqual(vector[i], matrix[i, i]); - } - } - - /// - /// Set a diagonal vector with unequal length throws ArgumentException. - /// - [Test] - public void SetDiagonalVectorWithUnequalLengthThrowsArgumentException() - { - var vector = CreateVector(new Complex[] { 1, 2, 3 }); - Assert.Throws(() => TestMatrices["Wide2x3"].SetDiagonal(vector)); - } - - /// - /// Set a diagonal with null vector throws ArgumentNullException. - /// - [Test] - public void SetDiagonalWithNullVectorThrowsArgumentNullException() - { - Vector vector = null; - Assert.Throws(() => TestMatrices["Square3x3"].SetDiagonal(vector)); - } - - /// - /// Can set a diagonal array. - /// - /// Matrix name. - /// Diagonal real values. - [TestCase("Square3x3", new double[] { 1, 2, 3 })] - [TestCase("Wide2x3", new double[] { 1, 2 })] - [TestCase("Tall3x2", new double[] { 1, 2 })] - public void CanSetDiagonalArray(string name, double[] real) - { - var diagonal = new Complex[real.Length]; - for (var i = 0; i < real.Length; i++) - { - diagonal[i] = new Complex(real[i], 1); - } - - var matrix = TestMatrices[name]; - matrix.SetDiagonal(diagonal); - - var min = Math.Min(matrix.ColumnCount, matrix.RowCount); - Assert.AreEqual(diagonal.Length, min); - - for (var i = 0; i < diagonal.Length; i++) - { - Assert.AreEqual(diagonal[i], matrix[i, i]); - } - } - - /// - /// Set a diagonal array with unequal length throws ArgumentException. - /// - [Test] - public void SetDiagonalArrayWithUnequalLengthThrowsArgumentException() - { - var array = new Complex[] { 1, 2, 3 }; - Assert.Throws(() => TestMatrices["Wide2x3"].SetDiagonal(array)); - } - - /// - /// Set a diagonal with null array throws ArgumentNullException. - /// - [Test] - public void SetDiagonalWithNullArrayThrowsArgumentNullException() - { - Complex[] array = null; - Assert.Throws(() => TestMatrices["Square3x3"].SetDiagonal(array)); - } - /// /// Can insert a row. /// diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/DiagonalMatrixTests.cs b/src/UnitTests/LinearAlgebraTests/Complex32/DiagonalMatrixTests.cs index 72d9bcd6..ac7d9189 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/DiagonalMatrixTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/DiagonalMatrixTests.cs @@ -320,94 +320,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32 } } - /// - /// Can set a column with an array. - /// - /// Matrix name. - /// Column array. - public override void CanSetColumnWithArray(string name, float[] column) - { - try - { - // Pass all invoke to base - base.CanSetColumnWithArray(name, column); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - - /// - /// Can set a column with a vector. - /// - /// Matrix name. - /// Column values. - public override void CanSetColumnWithVector(string name, float[] column) - { - try - { - // Pass all invoke to base - base.CanSetColumnWithVector(name, column); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - - /// - /// Can set a row with an array. - /// - /// Matrix name. - /// Row values. - public override void CanSetRowWithArray(string name, float[] row) - { - try - { - // Pass all invoke to base - base.CanSetRowWithArray(name, row); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - - /// - /// Can set a row with a vector. - /// - /// Matrix name. - /// Row index. - public override void CanSetRowWithVector(string name, float[] row) - { - try - { - // Pass all invoke to base - base.CanSetRowWithVector(name, row); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - /// /// Can set a submatrix. /// diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/MatrixStructureTheory.cs b/src/UnitTests/LinearAlgebraTests/Complex32/MatrixStructureTheory.cs index 7d29f516..1fe04b4c 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/MatrixStructureTheory.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/MatrixStructureTheory.cs @@ -46,5 +46,10 @@ { return new DenseVector(size); } + + protected override Complex32 Zero + { + get { return Complex32.Zero; } + } } } \ No newline at end of file diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.cs b/src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.cs index 1769589d..07f2c72d 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.cs @@ -36,350 +36,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32 /// public abstract partial class MatrixTests : MatrixLoader { - /// - /// Can set a row. - /// - /// Row index. - /// Matrix name. - [TestCase(0, "Singular3x3")] - [TestCase(1, "Square3x3")] - [TestCase(2, "Square3x3")] - public void CanSetRow(int rowIndex, string name) - { - var matrix = TestMatrices[name].Clone(); - matrix.SetRow(rowIndex, CreateVector(matrix.ColumnCount)); - - for (var i = 0; i < matrix.RowCount; i++) - { - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(i == rowIndex ? Complex32.Zero : TestMatrices[name][i, j], matrix[i, j]); - } - } - } - - /// - /// Can set a column. - /// - /// Column index. - /// Matrix name. - [TestCase(0, "Singular3x3")] - [TestCase(1, "Square3x3")] - [TestCase(2, "Square3x3")] - public void CanSetColumn(int colIndex, string name) - { - var matrix = TestMatrices[name].Clone(); - matrix.SetColumn(colIndex, CreateVector(matrix.ColumnCount)); - - for (var i = 0; i < matrix.RowCount; i++) - { - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(j == colIndex ? Complex32.Zero : TestMatrices[name][i, j], matrix[i, j]); - } - } - } - - /// - /// Get an upper triangle matrix. - /// - /// Matrix name. - [TestCase("Singular3x3")] - [TestCase("Square3x3")] - [TestCase("Square4x4")] - [TestCase("Tall3x2")] - [TestCase("Wide2x3")] - public void CanUpperTriangle(string name) - { - var data = TestMatrices[name]; - var upper = data.UpperTriangle(); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i <= j ? data[i, j] : Complex32.Zero, upper[i, j]); - } - } - } - - /// - /// Get an upper triangle matrix into a result matrix. - /// - /// Matrix name. - [TestCase("Singular3x3")] - [TestCase("Square3x3")] - [TestCase("Square4x4")] - [TestCase("Tall3x2")] - [TestCase("Wide2x3")] - public void CanUpperTriangleIntoResult(string name) - { - var data = TestMatrices[name]; - var result = CreateMatrix(data.RowCount, data.ColumnCount); - data.UpperTriangle(result); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i <= j ? data[i, j] : Complex32.Zero, result[i, j]); - } - } - } - - /// - /// Get an upper triangle matrix into null result matrix throws ArgumentNullException. - /// - [Test] - public void UpperTriangleIntoResultNullThrowsArgumentNullException() - { - var data = TestMatrices["Square3x3"]; - Matrix result = null; - Assert.Throws(() => data.UpperTriangle(result)); - } - - /// - /// Get an upper triangle into a result matrix with unequal rows throws ArgumentException. - /// - [Test] - public void UpperTriangleIntoResultWithUnEqualRowsThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var result = CreateMatrix(data.RowCount + 1, data.ColumnCount); - Assert.Throws(() => data.UpperTriangle(result)); - } - - /// - /// Get an upper triangle into a result matrix with unequal columns throws ArgumentException. - /// - [Test] - public void UpperTriangleIntoResultWithUnEqualColumnsThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var result = CreateMatrix(data.RowCount, data.ColumnCount + 1); - Assert.Throws(() => data.UpperTriangle(result)); - } - - /// - /// Get a lower triangle matrix. - /// - /// Matrix name. - [TestCase("Singular3x3")] - [TestCase("Square3x3")] - [TestCase("Square4x4")] - [TestCase("Tall3x2")] - [TestCase("Wide2x3")] - public void CanLowerTriangle(string name) - { - var data = TestMatrices[name]; - var lower = data.LowerTriangle(); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i >= j ? data[i, j] : Complex32.Zero, lower[i, j]); - } - } - } - - /// - /// Get a lower triangle matrix into a result matrix. - /// - /// Matrix name. - [TestCase("Singular3x3")] - [TestCase("Square3x3")] - [TestCase("Square4x4")] - [TestCase("Tall3x2")] - [TestCase("Wide2x3")] - public void CanLowerTriangleIntoResult(string name) - { - var data = TestMatrices[name]; - var result = CreateMatrix(data.RowCount, data.ColumnCount); - data.LowerTriangle(result); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i >= j ? data[i, j] : Complex32.Zero, result[i, j]); - } - } - } - - /// - /// Get a lower triangle matrix into null result matrix throws ArgumentNullException. - /// - [Test] - public void LowerTriangleIntoResultNullThrowsArgumentNullException() - { - var data = TestMatrices["Square3x3"]; - Matrix result = null; - Assert.Throws(() => data.LowerTriangle(result)); - } - - /// - /// Get a lower triangle into a result matrix with unequal rows throws ArgumentException. - /// - [Test] - public void LowerTriangleIntoResultWithUnEqualRowsThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var result = CreateMatrix(data.RowCount + 1, data.ColumnCount); - Assert.Throws(() => data.LowerTriangle(result)); - } - - /// - /// Get a lower triangle into a result matrix with unequal columns throws ArgumentException. - /// - [Test] - public void LowerTriangleIntoResultWithUnEqualColumnsThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var result = CreateMatrix(data.RowCount, data.ColumnCount + 1); - Assert.Throws(() => data.LowerTriangle(result)); - } - - /// - /// Get a strictly lower triangle. - /// - [Test] - public void CanStrictlyLowerTriangle() - { - foreach (var data in TestMatrices.Values) - { - var lower = data.StrictlyLowerTriangle(); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i > j ? data[i, j] : Complex32.Zero, lower[i, j]); - } - } - } - } - - /// - /// Get a strictly lower triangle into a result matrix. - /// - [Test] - public void CanStrictlyLowerTriangleIntoResult() - { - foreach (var data in TestMatrices.Values) - { - var lower = CreateMatrix(data.RowCount, data.ColumnCount); - data.StrictlyLowerTriangle(lower); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i > j ? data[i, j] : Complex32.Zero, lower[i, j]); - } - } - } - } - - /// - /// Get a strictly lower triangle with null parameter throws ArgumentNullException. - /// - [Test] - public void StrictlyLowerTriangleWithNullParameterThrowsArgumentNullException() - { - var data = TestMatrices["Square3x3"]; - Matrix lower = null; - Assert.Throws(() => data.StrictlyLowerTriangle(lower)); - } - - /// - /// Get a strictly lower triangle into result with unequal column number throws ArgumentException. - /// - [Test] - public void StrictlyLowerTriangleIntoResultWithUnequalColumnNumberThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var lower = CreateMatrix(data.RowCount, data.ColumnCount + 1); - Assert.Throws(() => data.StrictlyLowerTriangle(lower)); - } - - /// - /// Get a strictly lower triangle into result with unequal row number throws ArgumentException. - /// - [Test] - public void StrictlyLowerTriangleIntoResultWithUnequalRowNumberThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var lower = CreateMatrix(data.RowCount + 1, data.ColumnCount); - Assert.Throws(() => data.StrictlyLowerTriangle(lower)); - } - - /// - /// Get a strictly upper triangle. - /// - [Test] - public void CanStrictlyUpperTriangle() - { - foreach (var data in TestMatrices.Values) - { - var lower = data.StrictlyUpperTriangle(); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i < j ? data[i, j] : Complex32.Zero, lower[i, j]); - } - } - } - } - - /// - /// Get a strictly upper triangle into a result matrix. - /// - [Test] - public void CanStrictlyUpperTriangleIntoResult() - { - foreach (var data in TestMatrices.Values) - { - var lower = CreateMatrix(data.RowCount, data.ColumnCount); - data.StrictlyUpperTriangle(lower); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i < j ? data[i, j] : Complex32.Zero, lower[i, j]); - } - } - } - } - - /// - /// Get a strictly upper triangle with null parameter throws ArgumentNullException. - /// - [Test] - public void StrictlyUpperTriangleWithNullParameterThrowsArgumentNullException() - { - var data = TestMatrices["Square3x3"]; - Matrix lower = null; - Assert.Throws(() => data.StrictlyUpperTriangle(lower)); - } - - /// - /// Get a strictly upper triangle into a result matrix with unequal column number throws ArgumentException. - /// - [Test] - public void StrictlyUpperTriangleIntoResultWithUnequalColumnNumberThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var lower = CreateMatrix(data.RowCount, data.ColumnCount + 1); - Assert.Throws(() => data.StrictlyUpperTriangle(lower)); - } - - /// - /// Get a strictly upper triangle into a result matrix with unequal row number throws ArgumentException. - /// - [Test] - public void StrictlyUpperTriangleIntoResultWithUnequalRowNumberThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var lower = CreateMatrix(data.RowCount + 1, data.ColumnCount); - Assert.Throws(() => data.StrictlyUpperTriangle(lower)); - } - /// /// Can transpose a matrix. /// @@ -432,129 +88,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32 } } - /// - /// Can set a column with an array. - /// - /// Matrix name. - /// Column real values array. - [TestCase("Singular3x3", new float[] { 1, 2, 3 })] - [TestCase("Square3x3", new float[] { 1, 2, 3 })] - [TestCase("Tall3x2", new float[] { 1, 2, 3 })] - [TestCase("Wide2x3", new float[] { 1, 2 })] - public virtual void CanSetColumnWithArray(string name, float[] real) - { - var column = new Complex32[real.Length]; - for (var i = 0; i < real.Length; i++) - { - column[i] = new Complex32(real[i], 1); - } - - var matrix = TestMatrices[name]; - for (var i = 0; i < matrix.ColumnCount; i++) - { - matrix.SetColumn(i, column); - for (var j = 0; j < matrix.RowCount; j++) - { - Assert.AreEqual(matrix[j, i], column[j]); - } - } - } - - /// - /// Set a column with null array throws ArgumentNullException. - /// - [Test] - public virtual void SetColumnWithNullArrayThrowsArgumentNullException() - { - Complex32[] vec = null; - Assert.Throws(() => TestMatrices["Singular3x3"].SetColumn(1, vec)); - } - - /// - /// Set a column with unequal array length throws ArgumentException. - /// - [Test] - public virtual void SetColumnWithArrayUnequalLengthThrowsArgumentException() - { - var array = new Complex32[] { 1, 2, 3, 4, 5 }; - Assert.Throws(() => TestMatrices["Singular3x3"].SetColumn(1, array)); - } - - /// - /// Set a column array with invalid column index throws ArgumentOutOfRangeException. - /// - [Test] - public void SetColumnWithArrayWithInvalidColumnIndexThrowsArgumentOutOfRangeException() - { - var matrix = TestMatrices["Square3x3"]; - Complex32[] column = { 1, 2, 3 }; - Assert.Throws(() => matrix.SetColumn(matrix.ColumnCount + 1, column)); - Assert.Throws(() => matrix.SetColumn(-1, column)); - } - - /// - /// Can set a column with a vector. - /// - /// Matrix name. - /// Column real values. - [TestCase("Singular3x3", new float[] { 1, 2, 3 })] - [TestCase("Square3x3", new float[] { 1, 2, 3 })] - [TestCase("Tall3x2", new float[] { 1, 2, 3 })] - [TestCase("Wide2x3", new float[] { 1, 2 })] - public virtual void CanSetColumnWithVector(string name, float[] real) - { - var column = new Complex32[real.Length]; - for (var i = 0; i < real.Length; i++) - { - column[i] = new Complex32(real[i], 1); - } - - var matrix = TestMatrices[name]; - var columnVector = CreateVector(column); - for (var i = 0; i < matrix.ColumnCount; i++) - { - matrix.SetColumn(i, column); - for (var j = 0; j < matrix.RowCount; j++) - { - Assert.AreEqual(matrix[j, i], columnVector[j]); - } - } - } - - /// - /// Set a column with vector with wrong length throws ArgumentException. - /// - [Test] - public virtual void SetColumnWithVectorWithUnequalLengthThrowsArgumentException() - { - var matrix = TestMatrices["Singular3x3"]; - var columnVector = CreateVector(new Complex32[] { 1, 2, 3, 4, 5 }); - Assert.Throws(() => matrix.SetColumn(1, columnVector)); - } - - /// - /// Set a column with null vector throw ArgumentNullException. - /// - [Test] - public void SetColumnWithNullVectorThrowsArgumentNullException() - { - var matrix = TestMatrices["Square3x3"]; - Vector columnVector = null; - Assert.Throws(() => matrix.SetColumn(1, columnVector)); - } - - /// - /// Set column vector with invalid column index throws ArgumentOutOfRangeException. - /// - [Test] - public void SetColumnWithVectorWithInvalidColumnIndexThrowsArgumentOutOfRangeException() - { - var matrix = TestMatrices["Square3x3"]; - var column = CreateVector(new Complex32[] { 1, 2, 3 }); - Assert.Throws(() => matrix.SetColumn(-1, column)); - Assert.Throws(() => matrix.SetColumn(matrix.ColumnCount + 1, column)); - } - /// /// Can insert a column. /// @@ -615,118 +148,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32 Assert.Throws(() => matrix.InsertColumn(0, column)); } - /// - /// Can set a row with an array. - /// - /// Matrix name. - /// Row index. - [TestCase("Singular3x3", new float[] { 1, 2, 3 })] - [TestCase("Square3x3", new float[] { 1, 2, 3 })] - [TestCase("Tall3x2", new float[] { 1, 2 })] - [TestCase("Wide2x3", new float[] { 1, 2, 3 })] - public virtual void CanSetRowWithArray(string name, float[] real) - { - var row = new Complex32[real.Length]; - for (var i = 0; i < real.Length; i++) - { - row[i] = new Complex32(real[i], 1); - } - - var matrix = TestMatrices[name]; - for (var i = 0; i < matrix.RowCount; i++) - { - matrix.SetRow(i, row); - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(matrix[i, j], row[j]); - } - } - } - - /// - /// Set a row with null array throws ArgumentNullException. - /// - [Test] - public virtual void SetRowWithNullArrayThrowsArgumentNullException() - { - Complex32[] arr = null; - Assert.Throws(() => TestMatrices["Square3x3"].SetRow(1, arr)); - } - - /// - /// Set a row with an array with invalid row index throws ArgumentOutOfRangeException. - /// - [Test] - public void SetRowWithArrayWithInvalidRowIndexThrowsArgumentOutOfRangeException() - { - var matrix = TestMatrices["Square3x3"]; - Complex32[] row = { 1, 2, 3 }; - Assert.Throws(() => matrix.SetRow(-1, row)); - Assert.Throws(() => matrix.SetRow(matrix.RowCount + 1, row)); - } - - /// - /// Can set a row with a vector. - /// - /// Matrix name. - /// Row real values. - [TestCase("Singular3x3", new float[] { 1, 2, 3 })] - [TestCase("Square3x3", new float[] { 1, 2, 3 })] - [TestCase("Tall3x2", new float[] { 1, 2 })] - [TestCase("Wide2x3", new float[] { 1, 2, 3 })] - public virtual void CanSetRowWithVector(string name, float[] real) - { - var row = new Complex32[real.Length]; - for (var i = 0; i < real.Length; i++) - { - row[i] = new Complex32(real[i], 1); - } - - var matrix = TestMatrices[name]; - var rowVector = CreateVector(row); - for (var i = 0; i < matrix.RowCount; i++) - { - matrix.SetRow(i, row); - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(matrix[i, j], rowVector[j]); - } - } - } - - /// - /// Set a row with a vector of unequal length throws ArgumentException. - /// - [Test] - public virtual void SetRowWithVectorWithUnequalLengthThrowsArgumentException() - { - var vec = CreateVector(new Complex32[] { 1, 2, 3, 4, 5 }); - Assert.Throws(() => TestMatrices["Square3x3"].SetRow(1, vec)); - } - - /// - /// Set a row with a null vector throws ArgumentNullException. - /// - [Test] - public void SetRowWithNullVectorThrowsArgumentNullException() - { - var matrix = TestMatrices["Square3x3"]; - Vector rowVector = null; - Assert.Throws(() => matrix.SetRow(1, rowVector)); - } - - /// - /// Set a row with a vector with invalid row index throws ArgumentOutOfRangeException. - /// - [Test] - public void SetRowWithVectorWithInvalidRowIndexThrowsArgumentOutOfRangeException() - { - var matrix = TestMatrices["Square3x3"]; - var row = CreateVector(new Complex32[] { 1, 2, 3 }); - Assert.Throws(() => matrix.SetRow(-1, row)); - Assert.Throws(() => matrix.SetRow(matrix.RowCount + 1, row)); - } - /// /// Can set a submatrix. /// @@ -809,103 +230,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32 Assert.Throws(() => TestMatrices["Square3x3"].SetSubMatrix(0, 2, 0, 2, subMatrix)); } - /// - /// Can set a diagonal vector. - /// - /// Matrix name. - /// Diagonal real values. - [TestCase("Square3x3", new float[] { 1, 2, 3 })] - [TestCase("Wide2x3", new float[] { 1, 2 })] - [TestCase("Tall3x2", new float[] { 1, 2 })] - public void CanSetDiagonalVector(string name, float[] real) - { - var diagonal = new Complex32[real.Length]; - for (var i = 0; i < real.Length; i++) - { - diagonal[i] = new Complex32(real[i], 1); - } - - var matrix = TestMatrices[name]; - var vector = CreateVector(diagonal); - matrix.SetDiagonal(vector); - - var min = Math.Min(matrix.ColumnCount, matrix.RowCount); - Assert.AreEqual(diagonal.Length, min); - - for (var i = 0; i < vector.Count; i++) - { - Assert.AreEqual(vector[i], matrix[i, i]); - } - } - - /// - /// Set a diagonal vector with unequal length throws ArgumentException. - /// - [Test] - public void SetDiagonalVectorWithUnequalLengthThrowsArgumentException() - { - var vector = CreateVector(new Complex32[] { 1, 2, 3 }); - Assert.Throws(() => TestMatrices["Wide2x3"].SetDiagonal(vector)); - } - - /// - /// Set a diagonal with null vector throws ArgumentNullException. - /// - [Test] - public void SetDiagonalWithNullVectorThrowsArgumentNullException() - { - Vector vector = null; - Assert.Throws(() => TestMatrices["Square3x3"].SetDiagonal(vector)); - } - - /// - /// Can set a diagonal array. - /// - /// Matrix name. - /// Diagonal real values. - [TestCase("Square3x3", new float[] { 1, 2, 3 })] - [TestCase("Wide2x3", new float[] { 1, 2 })] - [TestCase("Tall3x2", new float[] { 1, 2 })] - public void CanSetDiagonalArray(string name, float[] real) - { - var diagonal = new Complex32[real.Length]; - for (var i = 0; i < real.Length; i++) - { - diagonal[i] = new Complex32(real[i], 1); - } - - var matrix = TestMatrices[name]; - matrix.SetDiagonal(diagonal); - - var min = Math.Min(matrix.ColumnCount, matrix.RowCount); - Assert.AreEqual(diagonal.Length, min); - - for (var i = 0; i < diagonal.Length; i++) - { - Assert.AreEqual(diagonal[i], matrix[i, i]); - } - } - - /// - /// Set a diagonal array with unequal length throws ArgumentException. - /// - [Test] - public void SetDiagonalArrayWithUnequalLengthThrowsArgumentException() - { - var array = new Complex32[] { 1, 2, 3 }; - Assert.Throws(() => TestMatrices["Wide2x3"].SetDiagonal(array)); - } - - /// - /// Set a diagonal with null array throws ArgumentNullException. - /// - [Test] - public void SetDiagonalWithNullArrayThrowsArgumentNullException() - { - Complex32[] array = null; - Assert.Throws(() => TestMatrices["Square3x3"].SetDiagonal(array)); - } - /// /// Can insert a row. /// diff --git a/src/UnitTests/LinearAlgebraTests/Double/DiagonalMatrixTests.cs b/src/UnitTests/LinearAlgebraTests/Double/DiagonalMatrixTests.cs index 8e2b193c..7e6f1f2d 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/DiagonalMatrixTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/DiagonalMatrixTests.cs @@ -320,94 +320,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double } } - /// - /// Can set a column with an array. - /// - /// Matrix name. - /// Column array. - public override void CanSetColumnWithArray(string name, double[] column) - { - try - { - // Pass all invoke to base - base.CanSetColumnWithArray(name, column); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - - /// - /// Can set a column with a vector. - /// - /// Matrix name. - /// Column values. - public override void CanSetColumnWithVector(string name, double[] column) - { - try - { - // Pass all invoke to base - base.CanSetColumnWithVector(name, column); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - - /// - /// Can set a row with an array. - /// - /// Matrix name. - /// Row index. - public override void CanSetRowWithArray(string name, double[] row) - { - try - { - // Pass all invoke to base - base.CanSetRowWithArray(name, row); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - - /// - /// Can set a row with a vector. - /// - /// Matrix name. - /// Row index. - public override void CanSetRowWithVector(string name, double[] row) - { - try - { - // Pass all invoke to base - base.CanSetRowWithVector(name, row); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - /// /// Can set a submatrix. /// diff --git a/src/UnitTests/LinearAlgebraTests/Double/MatrixStructureTheory.cs b/src/UnitTests/LinearAlgebraTests/Double/MatrixStructureTheory.cs index 380ff9e6..39bda709 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/MatrixStructureTheory.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/MatrixStructureTheory.cs @@ -45,5 +45,10 @@ { return new DenseVector(size); } + + protected override double Zero + { + get { return 0d; } + } } } \ No newline at end of file diff --git a/src/UnitTests/LinearAlgebraTests/Double/MatrixTests.cs b/src/UnitTests/LinearAlgebraTests/Double/MatrixTests.cs index 9ace2619..d01d8336 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/MatrixTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/MatrixTests.cs @@ -35,350 +35,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double /// public abstract partial class MatrixTests : MatrixLoader { - /// - /// Can set a row. - /// - /// Row index. - /// Matrix name. - [TestCase(0, "Singular3x3")] - [TestCase(1, "Square3x3")] - [TestCase(2, "Square3x3")] - public void CanSetRow(int rowIndex, string name) - { - var matrix = TestMatrices[name].Clone(); - matrix.SetRow(rowIndex, CreateVector(matrix.ColumnCount)); - - for (var i = 0; i < matrix.RowCount; i++) - { - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(i == rowIndex ? 0.0 : TestMatrices[name][i, j], matrix[i, j]); - } - } - } - - /// - /// Can set a column. - /// - /// Column index. - /// Matrix name. - [TestCase(0, "Singular3x3")] - [TestCase(1, "Square3x3")] - [TestCase(2, "Square3x3")] - public void CanSetColumn(int colIndex, string name) - { - var matrix = TestMatrices[name].Clone(); - matrix.SetColumn(colIndex, CreateVector(matrix.ColumnCount)); - - for (var i = 0; i < matrix.RowCount; i++) - { - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(j == colIndex ? 0.0 : TestMatrices[name][i, j], matrix[i, j]); - } - } - } - - /// - /// Get an upper triangle matrix. - /// - /// Matrix name. - [TestCase("Singular3x3")] - [TestCase("Square3x3")] - [TestCase("Square4x4")] - [TestCase("Tall3x2")] - [TestCase("Wide2x3")] - public void CanUpperTriangle(string name) - { - var data = TestMatrices[name]; - var upper = data.UpperTriangle(); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i <= j ? data[i, j] : 0, upper[i, j]); - } - } - } - - /// - /// Get an upper triangle matrix into a result matrix. - /// - /// Matrix name. - [TestCase("Singular3x3")] - [TestCase("Square3x3")] - [TestCase("Square4x4")] - [TestCase("Tall3x2")] - [TestCase("Wide2x3")] - public void CanUpperTriangleIntoResult(string name) - { - var data = TestMatrices[name]; - var result = CreateMatrix(data.RowCount, data.ColumnCount); - data.UpperTriangle(result); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i <= j ? data[i, j] : 0, result[i, j]); - } - } - } - - /// - /// Get an upper triangle matrix into null result matrix throws ArgumentNullException. - /// - [Test] - public void UpperTriangleIntoResultNullThrowsArgumentNullException() - { - var data = TestMatrices["Square3x3"]; - Matrix result = null; - Assert.Throws(() => data.UpperTriangle(result)); - } - - /// - /// Get an upper triangle into a result matrix with unequal rows throws ArgumentException. - /// - [Test] - public void UpperTriangleIntoResultWithUnEqualRowsThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var result = CreateMatrix(data.RowCount + 1, data.ColumnCount); - Assert.Throws(() => data.UpperTriangle(result)); - } - - /// - /// Get an upper triangle into a result matrix with unequal columns throws ArgumentException. - /// - [Test] - public void UpperTriangleIntoResultWithUnEqualColumnsThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var result = CreateMatrix(data.RowCount, data.ColumnCount + 1); - Assert.Throws(() => data.UpperTriangle(result)); - } - - /// - /// Get a lower triangle matrix. - /// - /// Matrix name. - [TestCase("Singular3x3")] - [TestCase("Square3x3")] - [TestCase("Square4x4")] - [TestCase("Tall3x2")] - [TestCase("Wide2x3")] - public void CanLowerTriangle(string name) - { - var data = TestMatrices[name]; - var lower = data.LowerTriangle(); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i >= j ? data[i, j] : 0, lower[i, j]); - } - } - } - - /// - /// Get a lower triangle matrix into a result matrix. - /// - /// Matrix name. - [TestCase("Singular3x3")] - [TestCase("Square3x3")] - [TestCase("Square4x4")] - [TestCase("Tall3x2")] - [TestCase("Wide2x3")] - public void CanLowerTriangleIntoResult(string name) - { - var data = TestMatrices[name]; - var result = CreateMatrix(data.RowCount, data.ColumnCount); - data.LowerTriangle(result); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i >= j ? data[i, j] : 0, result[i, j]); - } - } - } - - /// - /// Get a lower triangle matrix into null result matrix throws ArgumentNullException. - /// - [Test] - public void LowerTriangleIntoResultNullThrowsArgumentNullException() - { - var data = TestMatrices["Square3x3"]; - Matrix result = null; - Assert.Throws(() => data.LowerTriangle(result)); - } - - /// - /// Get a lower triangle into a result matrix with unequal rows throws ArgumentException. - /// - [Test] - public void LowerTriangleIntoResultWithUnEqualRowsThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var result = CreateMatrix(data.RowCount + 1, data.ColumnCount); - Assert.Throws(() => data.LowerTriangle(result)); - } - - /// - /// Get a lower triangle into a result matrix with unequal columns throws ArgumentException. - /// - [Test] - public void LowerTriangleIntoResultWithUnEqualColumnsThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var result = CreateMatrix(data.RowCount, data.ColumnCount + 1); - Assert.Throws(() => data.LowerTriangle(result)); - } - - /// - /// Get a strictly lower triangle. - /// - [Test] - public void CanStrictlyLowerTriangle() - { - foreach (var data in TestMatrices.Values) - { - var lower = data.StrictlyLowerTriangle(); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i > j ? data[i, j] : 0, lower[i, j]); - } - } - } - } - - /// - /// Get a strictly lower triangle into a result matrix. - /// - [Test] - public void CanStrictlyLowerTriangleIntoResult() - { - foreach (var data in TestMatrices.Values) - { - var lower = CreateMatrix(data.RowCount, data.ColumnCount); - data.StrictlyLowerTriangle(lower); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i > j ? data[i, j] : 0, lower[i, j]); - } - } - } - } - - /// - /// Get a strictly lower triangle with null parameter throws ArgumentNullException. - /// - [Test] - public void StrictlyLowerTriangleWithNullParameterThrowsArgumentNullException() - { - var data = TestMatrices["Square3x3"]; - Matrix lower = null; - Assert.Throws(() => data.StrictlyLowerTriangle(lower)); - } - - /// - /// Get a strictly lower triangle into result with unequal column number throws ArgumentException. - /// - [Test] - public void StrictlyLowerTriangleIntoResultWithUnequalColumnNumberThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var lower = CreateMatrix(data.RowCount, data.ColumnCount + 1); - Assert.Throws(() => data.StrictlyLowerTriangle(lower)); - } - - /// - /// Get a strictly lower triangle into result with unequal row number throws ArgumentException. - /// - [Test] - public void StrictlyLowerTriangleIntoResultWithUnequalRowNumberThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var lower = CreateMatrix(data.RowCount + 1, data.ColumnCount); - Assert.Throws(() => data.StrictlyLowerTriangle(lower)); - } - - /// - /// Get a strictly upper triangle. - /// - [Test] - public void CanStrictlyUpperTriangle() - { - foreach (var data in TestMatrices.Values) - { - var lower = data.StrictlyUpperTriangle(); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i < j ? data[i, j] : 0, lower[i, j]); - } - } - } - } - - /// - /// Get a strictly upper triangle into a result matrix. - /// - [Test] - public void CanStrictlyUpperTriangleIntoResult() - { - foreach (var data in TestMatrices.Values) - { - var lower = CreateMatrix(data.RowCount, data.ColumnCount); - data.StrictlyUpperTriangle(lower); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i < j ? data[i, j] : 0, lower[i, j]); - } - } - } - } - - /// - /// Get a strictly upper triangle with null parameter throws ArgumentNullException. - /// - [Test] - public void StrictlyUpperTriangleWithNullParameterThrowsArgumentNullException() - { - var data = TestMatrices["Square3x3"]; - Matrix lower = null; - Assert.Throws(() => data.StrictlyUpperTriangle(lower)); - } - - /// - /// Get a strictly upper triangle into a result matrix with unequal column number throws ArgumentException. - /// - [Test] - public void StrictlyUpperTriangleIntoResultWithUnequalColumnNumberThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var lower = CreateMatrix(data.RowCount, data.ColumnCount + 1); - Assert.Throws(() => data.StrictlyUpperTriangle(lower)); - } - - /// - /// Get a strictly upper triangle into a result matrix with unequal row number throws ArgumentException. - /// - [Test] - public void StrictlyUpperTriangleIntoResultWithUnequalRowNumberThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var lower = CreateMatrix(data.RowCount + 1, data.ColumnCount); - Assert.Throws(() => data.StrictlyUpperTriangle(lower)); - } - /// /// Can transpose a matrix. /// @@ -405,117 +61,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double } } - /// - /// Can set a column with an array. - /// - /// Matrix name. - /// Column array. - [TestCase("Singular3x3", new double[] { 1, 2, 3 })] - [TestCase("Square3x3", new double[] { 1, 2, 3 })] - [TestCase("Tall3x2", new double[] { 1, 2, 3 })] - [TestCase("Wide2x3", new double[] { 1, 2 })] - public virtual void CanSetColumnWithArray(string name, double[] column) - { - var matrix = TestMatrices[name]; - for (var i = 0; i < matrix.ColumnCount; i++) - { - matrix.SetColumn(i, column); - for (var j = 0; j < matrix.RowCount; j++) - { - Assert.AreEqual(matrix[j, i], column[j]); - } - } - } - - /// - /// Set a column with null array throws ArgumentNullException. - /// - [Test] - public virtual void SetColumnWithNullArrayThrowsArgumentNullException() - { - double[] vec = null; - Assert.Throws(() => TestMatrices["Singular3x3"].SetColumn(1, vec)); - } - - /// - /// Set a column with unequal array length throws ArgumentException. - /// - [Test] - public virtual void SetColumnWithArrayUnequalLengthThrowsArgumentException() - { - var array = new double[] { 1, 2, 3, 4, 5 }; - Assert.Throws(() => TestMatrices["Singular3x3"].SetColumn(1, array)); - } - - /// - /// Set a column array with invalid column index throws ArgumentOutOfRangeException. - /// - [Test] - public void SetColumnWithArrayWithInvalidColumnIndexThrowsArgumentOutOfRangeException() - { - var matrix = TestMatrices["Square3x3"]; - double[] column = { 1, 2, 3 }; - Assert.Throws(() => matrix.SetColumn(matrix.ColumnCount + 1, column)); - Assert.Throws(() => matrix.SetColumn(-1, column)); - } - - /// - /// Can set a column with a vector. - /// - /// Matrix name. - /// Column values. - [TestCase("Singular3x3", new double[] { 1, 2, 3 })] - [TestCase("Square3x3", new double[] { 1, 2, 3 })] - [TestCase("Tall3x2", new double[] { 1, 2, 3 })] - [TestCase("Wide2x3", new double[] { 1, 2 })] - public virtual void CanSetColumnWithVector(string name, double[] column) - { - var matrix = TestMatrices[name]; - var columnVector = CreateVector(column); - for (var i = 0; i < matrix.ColumnCount; i++) - { - matrix.SetColumn(i, column); - for (var j = 0; j < matrix.RowCount; j++) - { - Assert.AreEqual(matrix[j, i], columnVector[j]); - } - } - } - - /// - /// Set a column with vector with wrong length throws ArgumentException. - /// - [Test] - public virtual void SetColumnWithVectorWithUnequalLengthThrowsArgumentException() - { - var matrix = TestMatrices["Singular3x3"]; - var columnVector = CreateVector(new double[] { 1, 2, 3, 4, 5 }); - Assert.Throws(() => matrix.SetColumn(1, columnVector)); - } - - /// - /// Set a column with null vector throw ArgumentNullException. - /// - [Test] - public void SetColumnWithNullVectorThrowsArgumentNullException() - { - var matrix = TestMatrices["Square3x3"]; - Vector columnVector = null; - Assert.Throws(() => matrix.SetColumn(1, columnVector)); - } - - /// - /// Set column vector with invalid column index throws ArgumentOutOfRangeException. - /// - [Test] - public void SetColumnWithVectorWithInvalidColumnIndexThrowsArgumentOutOfRangeException() - { - var matrix = TestMatrices["Square3x3"]; - var column = CreateVector(new double[] { 1, 2, 3 }); - Assert.Throws(() => matrix.SetColumn(-1, column)); - Assert.Throws(() => matrix.SetColumn(matrix.ColumnCount + 1, column)); - } - /// /// Can insert a column. /// @@ -576,106 +121,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double Assert.Throws(() => matrix.InsertColumn(0, column)); } - /// - /// Can set a row with an array. - /// - /// Matrix name. - /// Row index. - [TestCase("Singular3x3", new double[] { 1, 2, 3 })] - [TestCase("Square3x3", new double[] { 1, 2, 3 })] - [TestCase("Tall3x2", new double[] { 1, 2 })] - [TestCase("Wide2x3", new double[] { 1, 2, 3 })] - public virtual void CanSetRowWithArray(string name, double[] row) - { - var matrix = TestMatrices[name]; - for (var i = 0; i < matrix.RowCount; i++) - { - matrix.SetRow(i, row); - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(matrix[i, j], row[j]); - } - } - } - - /// - /// Set a row with null array throws ArgumentNullException. - /// - [Test] - public virtual void SetRowWithNullArrayThrowsArgumentNullException() - { - double[] arr = null; - Assert.Throws(() => TestMatrices["Square3x3"].SetRow(1, arr)); - } - - /// - /// Set a row with an array with invalid row index throws ArgumentOutOfRangeException. - /// - [Test] - public void SetRowWithArrayWithInvalidRowIndexThrowsArgumentOutOfRangeException() - { - var matrix = TestMatrices["Square3x3"]; - double[] row = { 1, 2, 3 }; - Assert.Throws(() => matrix.SetRow(-1, row)); - Assert.Throws(() => matrix.SetRow(matrix.RowCount + 1, row)); - } - - /// - /// Can set a row with a vector. - /// - /// Matrix name. - /// Row index. - [TestCase("Singular3x3", new double[] { 1, 2, 3 })] - [TestCase("Square3x3", new double[] { 1, 2, 3 })] - [TestCase("Tall3x2", new double[] { 1, 2 })] - [TestCase("Wide2x3", new double[] { 1, 2, 3 })] - public virtual void CanSetRowWithVector(string name, double[] row) - { - var matrix = TestMatrices[name]; - var rowVector = CreateVector(row); - for (var i = 0; i < matrix.RowCount; i++) - { - matrix.SetRow(i, row); - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(matrix[i, j], rowVector[j]); - } - } - } - - /// - /// Set a row with a vector of unequal length throws ArgumentException. - /// - [Test] - public virtual void SetRowWithVectorWithUnequalLengthThrowsArgumentException() - { - var vec = CreateVector(new double[] { 1, 2, 3, 4, 5 }); - Assert.Throws(() => TestMatrices["Square3x3"].SetRow(1, vec)); - } - - /// - /// Set a row with a null vector throws ArgumentNullException. - /// - [Test] - public void SetRowWithNullVectorThrowsArgumentNullException() - { - var matrix = TestMatrices["Square3x3"]; - Vector rowVector = null; - Assert.Throws(() => matrix.SetRow(1, rowVector)); - } - - /// - /// Set a row with a vector with invalid row index throws ArgumentOutOfRangeException. - /// - [Test] - public void SetRowWithVectorWithInvalidRowIndexThrowsArgumentOutOfRangeException() - { - var matrix = TestMatrices["Square3x3"]; - var row = CreateVector(new double[] { 1, 2, 3 }); - Assert.Throws(() => matrix.SetRow(-1, row)); - Assert.Throws(() => matrix.SetRow(matrix.RowCount + 1, row)); - } - /// /// Can set a submatrix. /// @@ -758,91 +203,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double Assert.Throws(() => TestMatrices["Square3x3"].SetSubMatrix(0, 2, 0, 2, subMatrix)); } - /// - /// Can set a diagonal vector. - /// - /// Matrix name. - /// Diagonal vector. - [TestCase("Square3x3", new double[] { 1, 2, 3 })] - [TestCase("Wide2x3", new double[] { 1, 2 })] - [TestCase("Tall3x2", new double[] { 1, 2 })] - public void CanSetDiagonalVector(string name, double[] diagonal) - { - var matrix = TestMatrices[name]; - var vector = CreateVector(diagonal); - matrix.SetDiagonal(vector); - - var min = Math.Min(matrix.ColumnCount, matrix.RowCount); - Assert.AreEqual(diagonal.Length, min); - - for (var i = 0; i < vector.Count; i++) - { - Assert.AreEqual(vector[i], matrix[i, i]); - } - } - - /// - /// Set a diagonal vector with unequal length throws ArgumentException. - /// - [Test] - public void SetDiagonalVectorWithUnequalLengthThrowsArgumentException() - { - var vector = CreateVector(new double[] { 1, 2, 3 }); - Assert.Throws(() => TestMatrices["Wide2x3"].SetDiagonal(vector)); - } - - /// - /// Set a diagonal with null vector throws ArgumentNullException. - /// - [Test] - public void SetDiagonalWithNullVectorThrowsArgumentNullException() - { - Vector vector = null; - Assert.Throws(() => TestMatrices["Square3x3"].SetDiagonal(vector)); - } - - /// - /// Can set a diagonal array. - /// - /// Matrix name. - /// Diagonal array. - [TestCase("Square3x3", new double[] { 1, 2, 3 })] - [TestCase("Wide2x3", new double[] { 1, 2 })] - [TestCase("Tall3x2", new double[] { 1, 2 })] - public void CanSetDiagonalArray(string name, double[] diagonal) - { - var matrix = TestMatrices[name]; - matrix.SetDiagonal(diagonal); - - var min = Math.Min(matrix.ColumnCount, matrix.RowCount); - Assert.AreEqual(diagonal.Length, min); - - for (var i = 0; i < diagonal.Length; i++) - { - Assert.AreEqual(diagonal[i], matrix[i, i]); - } - } - - /// - /// Set a diagonal array with unequal length throws ArgumentException. - /// - [Test] - public void SetDiagonalArrayWithUnequalLengthThrowsArgumentException() - { - var array = new double[] { 1, 2, 3 }; - Assert.Throws(() => TestMatrices["Wide2x3"].SetDiagonal(array)); - } - - /// - /// Set a diagonal with null array throws ArgumentNullException. - /// - [Test] - public void SetDiagonalWithNullArrayThrowsArgumentNullException() - { - double[] array = null; - Assert.Throws(() => TestMatrices["Square3x3"].SetDiagonal(array)); - } - /// /// Can insert a row. /// diff --git a/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs b/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs index 75655109..d82ab2bf 100644 --- a/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs +++ b/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs @@ -11,6 +11,7 @@ protected abstract Matrix CreateDense(int rows, int columns); protected abstract Matrix CreateSparse(int rows, int columns); protected abstract Vector CreateVector(int size); + protected abstract T Zero { get; } [Theory, Timeout(200)] public void IsEqualToItself(Matrix matrix) @@ -43,9 +44,9 @@ { Assert.That(matrix, Is.Not.EqualTo(2)); Assert.IsFalse(matrix.Equals(2)); - Assert.IsFalse(matrix.Equals((object)2)); - Assert.IsFalse(((object)matrix).Equals(2)); - Assert.IsFalse(matrix == (object)2); + Assert.IsFalse(matrix.Equals((object) 2)); + Assert.IsFalse(((object) matrix).Equals(2)); + Assert.IsFalse(matrix == (object) 2); } [Theory, Timeout(200)] @@ -116,15 +117,17 @@ [Theory, Timeout(200)] public void CanGetFieldsByIndex(Matrix matrix) { - Assert.That(() => { var x = matrix[0, 0]; }, Throws.Nothing); - Assert.That(() => { var x = matrix[0, matrix.ColumnCount - 1]; }, Throws.Nothing); - Assert.That(() => { var x = matrix[matrix.RowCount - 1, 0]; }, Throws.Nothing); + Assert.That(() => matrix[0, 0], Throws.Nothing); + Assert.That(() => matrix[0, matrix.ColumnCount - 1], Throws.Nothing); + Assert.That(() => matrix[matrix.RowCount - 1, 0], Throws.Nothing); - Assert.That(() => { var x = matrix[-1, 1]; }, Throws.InstanceOf()); - Assert.That(() => { var x = matrix[1, -1]; }, Throws.InstanceOf()); - Assert.That(() => { var x = matrix[0, matrix.ColumnCount]; }, Throws.InstanceOf()); + Assert.That(() => matrix[-1, 1], Throws.InstanceOf()); + Assert.That(() => matrix[1, -1], Throws.InstanceOf()); + Assert.That(() => matrix[0, matrix.ColumnCount], Throws.InstanceOf()); } + #region Row & Column Access + [Theory, Timeout(200)] public void CanGetRow(Matrix matrix) { @@ -145,8 +148,8 @@ } // Invalid Rows - Assert.That(() => { matrix.Row(-1); }, Throws.InstanceOf()); - Assert.That(() => { matrix.Row(matrix.RowCount); }, Throws.InstanceOf()); + Assert.That(() => matrix.Row(-1), Throws.InstanceOf()); + Assert.That(() => matrix.Row(matrix.RowCount), Throws.InstanceOf()); } [Theory, Timeout(200)] @@ -193,11 +196,11 @@ } // Invalid Rows - Assert.That(() => { matrix.Row(-1, 0, 2); }, Throws.InstanceOf()); - Assert.That(() => { matrix.Row(matrix.RowCount, 0, 1); }, Throws.InstanceOf()); - Assert.That(() => { matrix.Row(0, -1, 1); }, Throws.InstanceOf()); - Assert.That(() => { matrix.Row(0, 1, 0); }, Throws.InstanceOf()); - Assert.That(() => { matrix.Row(0, 0, matrix.ColumnCount + 1); }, Throws.InstanceOf()); + Assert.That(() => matrix.Row(-1, 0, 2), Throws.InstanceOf()); + Assert.That(() => matrix.Row(matrix.RowCount, 0, 1), Throws.InstanceOf()); + Assert.That(() => matrix.Row(0, -1, 1), Throws.InstanceOf()); + Assert.That(() => matrix.Row(0, 1, 0), Throws.InstanceOf()); + Assert.That(() => matrix.Row(0, 0, matrix.ColumnCount + 1), Throws.InstanceOf()); } [Theory, Timeout(200)] @@ -237,8 +240,8 @@ } // Invalid Columns - Assert.That(() => { matrix.Column(-1); }, Throws.InstanceOf()); - Assert.That(() => { matrix.Column(matrix.ColumnCount); }, Throws.InstanceOf()); + Assert.That(() => matrix.Column(-1), Throws.InstanceOf()); + Assert.That(() => matrix.Column(matrix.ColumnCount), Throws.InstanceOf()); } [Theory, Timeout(200)] @@ -285,11 +288,11 @@ } // Invalid Rows - Assert.That(() => { matrix.Column(-1, 0, 2); }, Throws.InstanceOf()); - Assert.That(() => { matrix.Column(matrix.ColumnCount, 0, 1); }, Throws.InstanceOf()); - Assert.That(() => { matrix.Column(0, -1, 1); }, Throws.InstanceOf()); - Assert.That(() => { matrix.Column(0, 1, 0); }, Throws.InstanceOf()); - Assert.That(() => { matrix.Column(0, 0, matrix.RowCount + 1); }, Throws.InstanceOf()); + Assert.That(() => matrix.Column(-1, 0, 2), Throws.InstanceOf()); + Assert.That(() => matrix.Column(matrix.ColumnCount, 0, 1), Throws.InstanceOf()); + Assert.That(() => matrix.Column(0, -1, 1), Throws.InstanceOf()); + Assert.That(() => matrix.Column(0, 1, 0), Throws.InstanceOf()); + Assert.That(() => matrix.Column(0, 0, matrix.RowCount + 1), Throws.InstanceOf()); } [Theory, Timeout(200)] @@ -308,5 +311,360 @@ Assert.That(() => matrix.Column(matrix.ColumnCount, 0, matrix.ColumnCount - 1, col), Throws.InstanceOf()); Assert.That(() => matrix.Column(0, 0, matrix.RowCount, col), Throws.InstanceOf()); } + + [Theory, Timeout(200)] + public void CanSetRow(Matrix matrix) + { + // First Row + var m = matrix.Clone(); + m.SetRow(0, CreateVector(matrix.ColumnCount)); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(m[i, j], Is.EqualTo(i == 0 ? Zero : matrix[i, j])); + } + } + + // Last Row + m = matrix.Clone(); + m.SetRow(matrix.RowCount - 1, CreateVector(matrix.ColumnCount)); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(m[i, j], Is.EqualTo(i == matrix.RowCount - 1 ? Zero : matrix[i, j])); + } + } + + // Invalid Rows + Assert.That(() => matrix.SetRow(0, default(Vector)), Throws.InstanceOf()); + Assert.That(() => matrix.SetRow(-1, CreateVector(matrix.ColumnCount)), Throws.InstanceOf()); + Assert.That(() => matrix.SetRow(matrix.RowCount, CreateVector(matrix.ColumnCount)), Throws.InstanceOf()); + Assert.That(() => matrix.SetRow(0, CreateVector(matrix.ColumnCount - 1)), Throws.ArgumentException); + Assert.That(() => matrix.SetRow(0, CreateVector(matrix.ColumnCount + 1)), Throws.ArgumentException); + } + + [Theory, Timeout(200)] + public void CanSetRowArray(Matrix matrix) + { + // First Row + var m = matrix.Clone(); + m.SetRow(0, CreateVector(matrix.ColumnCount).ToArray()); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(m[i, j], Is.EqualTo(i == 0 ? Zero : matrix[i, j])); + } + } + + // Last Row + m = matrix.Clone(); + m.SetRow(matrix.RowCount - 1, new T[matrix.ColumnCount]); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(m[i, j], Is.EqualTo(i == matrix.RowCount - 1 ? Zero : matrix[i, j])); + } + } + + // Invalid Rows + Assert.That(() => matrix.SetRow(0, default(T[])), Throws.InstanceOf()); + Assert.That(() => matrix.SetRow(-1, new T[matrix.ColumnCount]), Throws.InstanceOf()); + Assert.That(() => matrix.SetRow(matrix.RowCount, new T[matrix.ColumnCount]), Throws.InstanceOf()); + Assert.That(() => matrix.SetRow(0, new T[matrix.ColumnCount - 1]), Throws.ArgumentException); + Assert.That(() => matrix.SetRow(0, new T[matrix.ColumnCount + 1]), Throws.ArgumentException); + } + + [Theory, Timeout(200)] + public void CanSetColumn(Matrix matrix) + { + // First Column + var m = matrix.Clone(); + m.SetColumn(0, CreateVector(matrix.RowCount)); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(m[i, j], Is.EqualTo(j == 0 ? Zero : matrix[i, j])); + } + } + + // Last Column + m = matrix.Clone(); + m.SetColumn(matrix.ColumnCount - 1, CreateVector(matrix.RowCount)); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(m[i, j], Is.EqualTo(j == matrix.ColumnCount - 1 ? Zero : matrix[i, j])); + } + } + + // Invalid Rows + Assert.That(() => matrix.SetColumn(0, default(Vector)), Throws.InstanceOf()); + Assert.That(() => matrix.SetColumn(-1, CreateVector(matrix.RowCount)), Throws.InstanceOf()); + Assert.That(() => matrix.SetColumn(matrix.ColumnCount, CreateVector(matrix.RowCount)), Throws.InstanceOf()); + Assert.That(() => matrix.SetColumn(0, CreateVector(matrix.RowCount - 1)), Throws.ArgumentException); + Assert.That(() => matrix.SetColumn(0, CreateVector(matrix.RowCount + 1)), Throws.ArgumentException); + } + + [Theory, Timeout(200)] + public void CanSetColumnArray(Matrix matrix) + { + // First Column + var m = matrix.Clone(); + m.SetColumn(0, CreateVector(matrix.RowCount).ToArray()); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(m[i, j], Is.EqualTo(j == 0 ? Zero : matrix[i, j])); + } + } + + // Last Column + m = matrix.Clone(); + m.SetColumn(matrix.ColumnCount - 1, new T[matrix.RowCount]); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(m[i, j], Is.EqualTo(j == matrix.ColumnCount - 1 ? Zero : matrix[i, j])); + } + } + + // Invalid Rows + Assert.That(() => matrix.SetColumn(0, default(T[])), Throws.InstanceOf()); + Assert.That(() => matrix.SetColumn(-1, new T[matrix.RowCount]), Throws.InstanceOf()); + Assert.That(() => matrix.SetColumn(matrix.ColumnCount, new T[matrix.RowCount]), Throws.InstanceOf()); + Assert.That(() => matrix.SetColumn(0, new T[matrix.RowCount - 1]), Throws.ArgumentException); + Assert.That(() => matrix.SetColumn(0, new T[matrix.RowCount + 1]), Throws.ArgumentException); + } + + #endregion + + #region Triangle Access + + [Theory, Timeout(200)] + public void CanGetUpperTriangle(Matrix matrix) + { + var upper = matrix.UpperTriangle(); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(upper[i, j], Is.EqualTo(i <= j ? matrix[i, j] : Zero)); + } + } + } + + [Theory, Timeout(200)] + public void CanGetUpperTriangleIntoResult(Matrix matrix) + { + var dense = CreateDense(matrix.RowCount, matrix.ColumnCount); + matrix.UpperTriangle(dense); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(dense[i, j], Is.EqualTo(i <= j ? matrix[i, j] : Zero)); + } + } + + var sparse = CreateSparse(matrix.RowCount, matrix.ColumnCount); + matrix.UpperTriangle(sparse); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(sparse[i, j], Is.EqualTo(i <= j ? matrix[i, j] : Zero)); + } + } + + Assert.That(() => matrix.UpperTriangle(null), Throws.InstanceOf()); + Assert.That(() => matrix.UpperTriangle(CreateSparse(matrix.RowCount + 1, matrix.ColumnCount)), Throws.ArgumentException); + Assert.That(() => matrix.UpperTriangle(CreateDense(matrix.RowCount, matrix.ColumnCount + 1)), Throws.ArgumentException); + } + + [Theory, Timeout(200)] + public void CanGetLowerTriangle(Matrix matrix) + { + var upper = matrix.LowerTriangle(); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(upper[i, j], Is.EqualTo(i >= j ? matrix[i, j] : Zero)); + } + } + } + + [Theory, Timeout(200)] + public void CanGetLowerTriangleIntoResult(Matrix matrix) + { + var dense = CreateDense(matrix.RowCount, matrix.ColumnCount); + matrix.LowerTriangle(dense); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(dense[i, j], Is.EqualTo(i >= j ? matrix[i, j] : Zero)); + } + } + + var sparse = CreateSparse(matrix.RowCount, matrix.ColumnCount); + matrix.LowerTriangle(sparse); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(sparse[i, j], Is.EqualTo(i >= j ? matrix[i, j] : Zero)); + } + } + + Assert.That(() => matrix.LowerTriangle(null), Throws.InstanceOf()); + Assert.That(() => matrix.LowerTriangle(CreateSparse(matrix.RowCount + 1, matrix.ColumnCount)), Throws.ArgumentException); + Assert.That(() => matrix.LowerTriangle(CreateDense(matrix.RowCount, matrix.ColumnCount + 1)), Throws.ArgumentException); + } + + [Theory, Timeout(200)] + public void CanGetStrictlyUpperTriangle(Matrix matrix) + { + var upper = matrix.StrictlyUpperTriangle(); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(upper[i, j], Is.EqualTo(i < j ? matrix[i, j] : Zero)); + } + } + } + + [Theory, Timeout(200)] + public void CanGetStrictlyUpperTriangleIntoResult(Matrix matrix) + { + var dense = CreateDense(matrix.RowCount, matrix.ColumnCount); + matrix.StrictlyUpperTriangle(dense); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(dense[i, j], Is.EqualTo(i < j ? matrix[i, j] : Zero)); + } + } + + var sparse = CreateSparse(matrix.RowCount, matrix.ColumnCount); + matrix.StrictlyUpperTriangle(sparse); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(sparse[i, j], Is.EqualTo(i < j ? matrix[i, j] : Zero)); + } + } + + Assert.That(() => matrix.StrictlyUpperTriangle(null), Throws.InstanceOf()); + Assert.That(() => matrix.StrictlyUpperTriangle(CreateSparse(matrix.RowCount + 1, matrix.ColumnCount)), Throws.ArgumentException); + Assert.That(() => matrix.StrictlyUpperTriangle(CreateDense(matrix.RowCount, matrix.ColumnCount + 1)), Throws.ArgumentException); + } + + [Theory, Timeout(200)] + public void CanGetStrictlyLowerTriangle(Matrix matrix) + { + var upper = matrix.StrictlyLowerTriangle(); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(upper[i, j], Is.EqualTo(i > j ? matrix[i, j] : Zero)); + } + } + } + + [Theory, Timeout(200)] + public void CanGetStrictlyLowerTriangleIntoResult(Matrix matrix) + { + var dense = CreateDense(matrix.RowCount, matrix.ColumnCount); + matrix.StrictlyLowerTriangle(dense); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(dense[i, j], Is.EqualTo(i > j ? matrix[i, j] : Zero)); + } + } + + var sparse = CreateSparse(matrix.RowCount, matrix.ColumnCount); + matrix.StrictlyLowerTriangle(sparse); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(sparse[i, j], Is.EqualTo(i > j ? matrix[i, j] : Zero)); + } + } + + Assert.That(() => matrix.StrictlyLowerTriangle(null), Throws.InstanceOf()); + Assert.That(() => matrix.StrictlyLowerTriangle(CreateSparse(matrix.RowCount + 1, matrix.ColumnCount)), Throws.ArgumentException); + Assert.That(() => matrix.StrictlyLowerTriangle(CreateDense(matrix.RowCount, matrix.ColumnCount + 1)), Throws.ArgumentException); + } + + #endregion + + #region Diagonal Access + + [Theory, Timeout(200)] + public void CanGetDiagonal(Matrix matrix) + { + var diag = matrix.Diagonal(); + Assert.That(diag.Count, Is.EqualTo(Math.Min(matrix.RowCount, matrix.ColumnCount))); + for (var i = 0; i < Math.Min(matrix.RowCount, matrix.ColumnCount); i++) + { + Assert.That(diag[i], Is.EqualTo(matrix[i, i])); + } + } + + [Theory, Timeout(200)] + public void CanSetDiagonal(Matrix matrix) + { + var m = matrix.Clone(); + m.SetDiagonal(CreateVector(Math.Min(matrix.RowCount, matrix.ColumnCount))); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(m[i, j], Is.EqualTo(i == j ? Zero : matrix[i, j])); + } + } + + // Invalid + Assert.That(() => matrix.SetDiagonal(default(Vector)), Throws.InstanceOf()); + Assert.That(() => matrix.SetDiagonal(CreateVector(Math.Min(matrix.RowCount, matrix.ColumnCount) - 1)), Throws.ArgumentException); + Assert.That(() => matrix.SetDiagonal(CreateVector(Math.Min(matrix.RowCount, matrix.ColumnCount) + 1)), Throws.ArgumentException); + } + + [Theory, Timeout(200)] + public void CanSetDiagonalArray(Matrix matrix) + { + var m = matrix.Clone(); + m.SetDiagonal(new T[Math.Min(matrix.RowCount, matrix.ColumnCount)]); + for (var i = 0; i < matrix.RowCount; i++) + { + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.That(m[i, j], Is.EqualTo(i == j ? Zero : matrix[i, j])); + } + } + + // Invalid + Assert.That(() => matrix.SetDiagonal(default(T[])), Throws.InstanceOf()); + Assert.That(() => matrix.SetDiagonal(new T[Math.Min(matrix.RowCount, matrix.ColumnCount) - 1]), Throws.ArgumentException); + Assert.That(() => matrix.SetDiagonal(new T[Math.Min(matrix.RowCount, matrix.ColumnCount) + 1]), Throws.ArgumentException); + } + + #endregion } } diff --git a/src/UnitTests/LinearAlgebraTests/Single/DiagonalMatrixTests.cs b/src/UnitTests/LinearAlgebraTests/Single/DiagonalMatrixTests.cs index 622df1ec..71046b50 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/DiagonalMatrixTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/DiagonalMatrixTests.cs @@ -319,94 +319,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single } } - /// - /// Can set a column with an array. - /// - /// Matrix name. - /// Column array. - public override void CanSetColumnWithArray(string name, float[] column) - { - try - { - // Pass all invoke to base - base.CanSetColumnWithArray(name, column); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - - /// - /// Can set a column with a vector. - /// - /// Matrix name. - /// Column values. - public override void CanSetColumnWithVector(string name, float[] column) - { - try - { - // Pass all invoke to base - base.CanSetColumnWithVector(name, column); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - - /// - /// Can set a row with an array. - /// - /// Matrix name. - /// Row index. - public override void CanSetRowWithArray(string name, float[] row) - { - try - { - // Pass all invoke to base - base.CanSetRowWithArray(name, row); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - - /// - /// Can set a row with a vector. - /// - /// Matrix name. - /// Row index. - public override void CanSetRowWithVector(string name, float[] row) - { - try - { - // Pass all invoke to base - base.CanSetRowWithVector(name, row); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - /// /// Can set a submatrix. /// diff --git a/src/UnitTests/LinearAlgebraTests/Single/MatrixStructureTheory.cs b/src/UnitTests/LinearAlgebraTests/Single/MatrixStructureTheory.cs index c55d3d20..4cc74623 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/MatrixStructureTheory.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/MatrixStructureTheory.cs @@ -45,5 +45,10 @@ { return new DenseVector(size); } + + protected override float Zero + { + get { return 0f; } + } } } diff --git a/src/UnitTests/LinearAlgebraTests/Single/MatrixTests.cs b/src/UnitTests/LinearAlgebraTests/Single/MatrixTests.cs index 48bb76ee..4aae70cf 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/MatrixTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/MatrixTests.cs @@ -35,350 +35,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single /// public abstract partial class MatrixTests : MatrixLoader { - /// - /// Can set a row. - /// - /// Row index. - /// Matrix name. - [TestCase(0, "Singular3x3")] - [TestCase(1, "Square3x3")] - [TestCase(2, "Square3x3")] - public void CanSetRow(int rowIndex, string name) - { - var matrix = TestMatrices[name].Clone(); - matrix.SetRow(rowIndex, CreateVector(matrix.ColumnCount)); - - for (var i = 0; i < matrix.RowCount; i++) - { - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(i == rowIndex ? 0.0f : TestMatrices[name][i, j], matrix[i, j]); - } - } - } - - /// - /// Can set a column. - /// - /// Column index. - /// Matrix name. - [TestCase(0, "Singular3x3")] - [TestCase(1, "Square3x3")] - [TestCase(2, "Square3x3")] - public void CanSetColumn(int colIndex, string name) - { - var matrix = TestMatrices[name].Clone(); - matrix.SetColumn(colIndex, CreateVector(matrix.ColumnCount)); - - for (var i = 0; i < matrix.RowCount; i++) - { - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(j == colIndex ? 0.0f : TestMatrices[name][i, j], matrix[i, j]); - } - } - } - - /// - /// Get an upper triangle matrix. - /// - /// Matrix name. - [TestCase("Singular3x3")] - [TestCase("Square3x3")] - [TestCase("Square4x4")] - [TestCase("Tall3x2")] - [TestCase("Wide2x3")] - public void CanUpperTriangle(string name) - { - var data = TestMatrices[name]; - var upper = data.UpperTriangle(); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i <= j ? data[i, j] : 0, upper[i, j]); - } - } - } - - /// - /// Get an upper triangle matrix into a result matrix. - /// - /// Matrix name. - [TestCase("Singular3x3")] - [TestCase("Square3x3")] - [TestCase("Square4x4")] - [TestCase("Tall3x2")] - [TestCase("Wide2x3")] - public void CanUpperTriangleIntoResult(string name) - { - var data = TestMatrices[name]; - var result = CreateMatrix(data.RowCount, data.ColumnCount); - data.UpperTriangle(result); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i <= j ? data[i, j] : 0, result[i, j]); - } - } - } - - /// - /// Get an upper triangle matrix into null result matrix throws ArgumentNullException. - /// - [Test] - public void UpperTriangleIntoResultNullThrowsArgumentNullException() - { - var data = TestMatrices["Square3x3"]; - Matrix result = null; - Assert.Throws(() => data.UpperTriangle(result)); - } - - /// - /// Get an upper triangle into a result matrix with unequal rows throws ArgumentException. - /// - [Test] - public void UpperTriangleIntoResultWithUnEqualRowsThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var result = CreateMatrix(data.RowCount + 1, data.ColumnCount); - Assert.Throws(() => data.UpperTriangle(result)); - } - - /// - /// Get an upper triangle into a result matrix with unequal columns throws ArgumentException. - /// - [Test] - public void UpperTriangleIntoResultWithUnEqualColumnsThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var result = CreateMatrix(data.RowCount, data.ColumnCount + 1); - Assert.Throws(() => data.UpperTriangle(result)); - } - - /// - /// Get a lower triangle matrix. - /// - /// Matrix name. - [TestCase("Singular3x3")] - [TestCase("Square3x3")] - [TestCase("Square4x4")] - [TestCase("Tall3x2")] - [TestCase("Wide2x3")] - public void CanLowerTriangle(string name) - { - var data = TestMatrices[name]; - var lower = data.LowerTriangle(); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i >= j ? data[i, j] : 0, lower[i, j]); - } - } - } - - /// - /// Get a lower triangle matrix into a result matrix. - /// - /// Matrix name. - [TestCase("Singular3x3")] - [TestCase("Square3x3")] - [TestCase("Square4x4")] - [TestCase("Tall3x2")] - [TestCase("Wide2x3")] - public void CanLowerTriangleIntoResult(string name) - { - var data = TestMatrices[name]; - var result = CreateMatrix(data.RowCount, data.ColumnCount); - data.LowerTriangle(result); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i >= j ? data[i, j] : 0, result[i, j]); - } - } - } - - /// - /// Get a lower triangle matrix into null result matrix throws ArgumentNullException. - /// - [Test] - public void LowerTriangleIntoResultNullThrowsArgumentNullException() - { - var data = TestMatrices["Square3x3"]; - Matrix result = null; - Assert.Throws(() => data.LowerTriangle(result)); - } - - /// - /// Get a lower triangle into a result matrix with unequal rows throws ArgumentException. - /// - [Test] - public void LowerTriangleIntoResultWithUnEqualRowsThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var result = CreateMatrix(data.RowCount + 1, data.ColumnCount); - Assert.Throws(() => data.LowerTriangle(result)); - } - - /// - /// Get a lower triangle into a result matrix with unequal columns throws ArgumentException. - /// - [Test] - public void LowerTriangleIntoResultWithUnEqualColumnsThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var result = CreateMatrix(data.RowCount, data.ColumnCount + 1); - Assert.Throws(() => data.LowerTriangle(result)); - } - - /// - /// Get a strictly lower triangle. - /// - [Test] - public void CanStrictlyLowerTriangle() - { - foreach (var data in TestMatrices.Values) - { - var lower = data.StrictlyLowerTriangle(); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i > j ? data[i, j] : 0, lower[i, j]); - } - } - } - } - - /// - /// Get a strictly lower triangle into a result matrix. - /// - [Test] - public void CanStrictlyLowerTriangleIntoResult() - { - foreach (var data in TestMatrices.Values) - { - var lower = CreateMatrix(data.RowCount, data.ColumnCount); - data.StrictlyLowerTriangle(lower); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i > j ? data[i, j] : 0, lower[i, j]); - } - } - } - } - - /// - /// Get a strictly lower triangle with null parameter throws ArgumentNullException. - /// - [Test] - public void StrictlyLowerTriangleWithNullParameterThrowsArgumentNullException() - { - var data = TestMatrices["Square3x3"]; - Matrix lower = null; - Assert.Throws(() => data.StrictlyLowerTriangle(lower)); - } - - /// - /// Get a strictly lower triangle into result with unequal column number throws ArgumentException. - /// - [Test] - public void StrictlyLowerTriangleIntoResultWithUnequalColumnNumberThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var lower = CreateMatrix(data.RowCount, data.ColumnCount + 1); - Assert.Throws(() => data.StrictlyLowerTriangle(lower)); - } - - /// - /// Get a strictly lower triangle into result with unequal row number throws ArgumentException. - /// - [Test] - public void StrictlyLowerTriangleIntoResultWithUnequalRowNumberThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var lower = CreateMatrix(data.RowCount + 1, data.ColumnCount); - Assert.Throws(() => data.StrictlyLowerTriangle(lower)); - } - - /// - /// Get a strictly upper triangle. - /// - [Test] - public void CanStrictlyUpperTriangle() - { - foreach (var data in TestMatrices.Values) - { - var lower = data.StrictlyUpperTriangle(); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i < j ? data[i, j] : 0, lower[i, j]); - } - } - } - } - - /// - /// Get a strictly upper triangle into a result matrix. - /// - [Test] - public void CanStrictlyUpperTriangleIntoResult() - { - foreach (var data in TestMatrices.Values) - { - var lower = CreateMatrix(data.RowCount, data.ColumnCount); - data.StrictlyUpperTriangle(lower); - for (var i = 0; i < data.RowCount; i++) - { - for (var j = 0; j < data.ColumnCount; j++) - { - Assert.AreEqual(i < j ? data[i, j] : 0, lower[i, j]); - } - } - } - } - - /// - /// Get a strictly upper triangle with null parameter throws ArgumentNullException. - /// - [Test] - public void StrictlyUpperTriangleWithNullParameterThrowsArgumentNullException() - { - var data = TestMatrices["Square3x3"]; - Matrix lower = null; - Assert.Throws(() => data.StrictlyUpperTriangle(lower)); - } - - /// - /// Get a strictly upper triangle into a result matrix with unequal column number throws ArgumentException. - /// - [Test] - public void StrictlyUpperTriangleIntoResultWithUnequalColumnNumberThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var lower = CreateMatrix(data.RowCount, data.ColumnCount + 1); - Assert.Throws(() => data.StrictlyUpperTriangle(lower)); - } - - /// - /// Get a strictly upper triangle into a result matrix with unequal row number throws ArgumentException. - /// - [Test] - public void StrictlyUpperTriangleIntoResultWithUnequalRowNumberThrowsArgumentException() - { - var data = TestMatrices["Square3x3"]; - var lower = CreateMatrix(data.RowCount + 1, data.ColumnCount); - Assert.Throws(() => data.StrictlyUpperTriangle(lower)); - } - /// /// Can transpose a matrix. /// @@ -405,117 +61,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single } } - /// - /// Can set a column with an array. - /// - /// Matrix name. - /// Column array. - [TestCase("Singular3x3", new float[] { 1, 2, 3 })] - [TestCase("Square3x3", new float[] { 1, 2, 3 })] - [TestCase("Tall3x2", new float[] { 1, 2, 3 })] - [TestCase("Wide2x3", new float[] { 1, 2 })] - public virtual void CanSetColumnWithArray(string name, float[] column) - { - var matrix = TestMatrices[name]; - for (var i = 0; i < matrix.ColumnCount; i++) - { - matrix.SetColumn(i, column); - for (var j = 0; j < matrix.RowCount; j++) - { - Assert.AreEqual(matrix[j, i], column[j]); - } - } - } - - /// - /// Set a column with null array throws ArgumentNullException. - /// - [Test] - public virtual void SetColumnWithNullArrayThrowsArgumentNullException() - { - float[] vec = null; - Assert.Throws(() => TestMatrices["Singular3x3"].SetColumn(1, vec)); - } - - /// - /// Set a column with unequal array length throws ArgumentException. - /// - [Test] - public virtual void SetColumnWithArrayUnequalLengthThrowsArgumentException() - { - var array = new float[] { 1, 2, 3, 4, 5 }; - Assert.Throws(() => TestMatrices["Singular3x3"].SetColumn(1, array)); - } - - /// - /// Set a column array with invalid column index throws ArgumentOutOfRangeException. - /// - [Test] - public void SetColumnWithArrayWithInvalidColumnIndexThrowsArgumentOutOfRangeException() - { - var matrix = TestMatrices["Square3x3"]; - float[] column = { 1, 2, 3 }; - Assert.Throws(() => matrix.SetColumn(matrix.ColumnCount + 1, column)); - Assert.Throws(() => matrix.SetColumn(-1, column)); - } - - /// - /// Can set a column with a vector. - /// - /// Matrix name. - /// Column values. - [TestCase("Singular3x3", new float[] { 1, 2, 3 })] - [TestCase("Square3x3", new float[] { 1, 2, 3 })] - [TestCase("Tall3x2", new float[] { 1, 2, 3 })] - [TestCase("Wide2x3", new float[] { 1, 2 })] - public virtual void CanSetColumnWithVector(string name, float[] column) - { - var matrix = TestMatrices[name]; - var columnVector = CreateVector(column); - for (var i = 0; i < matrix.ColumnCount; i++) - { - matrix.SetColumn(i, column); - for (var j = 0; j < matrix.RowCount; j++) - { - Assert.AreEqual(matrix[j, i], columnVector[j]); - } - } - } - - /// - /// Set a column with vector with wrong length throws ArgumentException. - /// - [Test] - public virtual void SetColumnWithVectorWithUnequalLengthThrowsArgumentException() - { - var matrix = TestMatrices["Singular3x3"]; - var columnVector = CreateVector(new float[] { 1, 2, 3, 4, 5 }); - Assert.Throws(() => matrix.SetColumn(1, columnVector)); - } - - /// - /// Set a column with null vector throw ArgumentNullException. - /// - [Test] - public void SetColumnWithNullVectorThrowsArgumentNullException() - { - var matrix = TestMatrices["Square3x3"]; - Vector columnVector = null; - Assert.Throws(() => matrix.SetColumn(1, columnVector)); - } - - /// - /// Set column vector with invalid column index throws ArgumentOutOfRangeException. - /// - [Test] - public void SetColumnWithVectorWithInvalidColumnIndexThrowsArgumentOutOfRangeException() - { - var matrix = TestMatrices["Square3x3"]; - var column = CreateVector(new float[] { 1, 2, 3 }); - Assert.Throws(() => matrix.SetColumn(-1, column)); - Assert.Throws(() => matrix.SetColumn(matrix.ColumnCount + 1, column)); - } - /// /// Can insert a column. /// @@ -576,106 +121,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single Assert.Throws(() => matrix.InsertColumn(0, column)); } - /// - /// Can set a row with an array. - /// - /// Matrix name. - /// Row index. - [TestCase("Singular3x3", new float[] { 1, 2, 3 })] - [TestCase("Square3x3", new float[] { 1, 2, 3 })] - [TestCase("Tall3x2", new float[] { 1, 2 })] - [TestCase("Wide2x3", new float[] { 1, 2, 3 })] - public virtual void CanSetRowWithArray(string name, float[] row) - { - var matrix = TestMatrices[name]; - for (var i = 0; i < matrix.RowCount; i++) - { - matrix.SetRow(i, row); - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(matrix[i, j], row[j]); - } - } - } - - /// - /// Set a row with null array throws ArgumentNullException. - /// - [Test] - public virtual void SetRowWithNullArrayThrowsArgumentNullException() - { - float[] arr = null; - Assert.Throws(() => TestMatrices["Square3x3"].SetRow(1, arr)); - } - - /// - /// Set a row with an array with invalid row index throws ArgumentOutOfRangeException. - /// - [Test] - public void SetRowWithArrayWithInvalidRowIndexThrowsArgumentOutOfRangeException() - { - var matrix = TestMatrices["Square3x3"]; - float[] row = { 1, 2, 3 }; - Assert.Throws(() => matrix.SetRow(-1, row)); - Assert.Throws(() => matrix.SetRow(matrix.RowCount + 1, row)); - } - - /// - /// Can set a row with a vector. - /// - /// Matrix name. - /// Row index. - [TestCase("Singular3x3", new float[] { 1, 2, 3 })] - [TestCase("Square3x3", new float[] { 1, 2, 3 })] - [TestCase("Tall3x2", new float[] { 1, 2 })] - [TestCase("Wide2x3", new float[] { 1, 2, 3 })] - public virtual void CanSetRowWithVector(string name, float[] row) - { - var matrix = TestMatrices[name]; - var rowVector = CreateVector(row); - for (var i = 0; i < matrix.RowCount; i++) - { - matrix.SetRow(i, row); - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(matrix[i, j], rowVector[j]); - } - } - } - - /// - /// Set a row with a vector of unequal length throws ArgumentException. - /// - [Test] - public virtual void SetRowWithVectorWithUnequalLengthThrowsArgumentException() - { - var vec = CreateVector(new float[] { 1, 2, 3, 4, 5 }); - Assert.Throws(() => TestMatrices["Square3x3"].SetRow(1, vec)); - } - - /// - /// Set a row with a null vector throws ArgumentNullException. - /// - [Test] - public void SetRowWithNullVectorThrowsArgumentNullException() - { - var matrix = TestMatrices["Square3x3"]; - Vector rowVector = null; - Assert.Throws(() => matrix.SetRow(1, rowVector)); - } - - /// - /// Set a row with a vector with invalid row index throws ArgumentOutOfRangeException. - /// - [Test] - public void SetRowWithVectorWithInvalidRowIndexThrowsArgumentOutOfRangeException() - { - var matrix = TestMatrices["Square3x3"]; - var row = CreateVector(new float[] { 1, 2, 3 }); - Assert.Throws(() => matrix.SetRow(-1, row)); - Assert.Throws(() => matrix.SetRow(matrix.RowCount + 1, row)); - } - /// /// Can set a submatrix. /// @@ -758,91 +203,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single Assert.Throws(() => TestMatrices["Square3x3"].SetSubMatrix(0, 2, 0, 2, subMatrix)); } - /// - /// Can set a diagonal vector. - /// - /// Matrix name. - /// Diagonal vector. - [TestCase("Square3x3", new float[] { 1, 2, 3 })] - [TestCase("Wide2x3", new float[] { 1, 2 })] - [TestCase("Tall3x2", new float[] { 1, 2 })] - public void CanSetDiagonalVector(string name, float[] diagonal) - { - var matrix = TestMatrices[name]; - var vector = CreateVector(diagonal); - matrix.SetDiagonal(vector); - - var min = Math.Min(matrix.ColumnCount, matrix.RowCount); - Assert.AreEqual(diagonal.Length, min); - - for (var i = 0; i < vector.Count; i++) - { - Assert.AreEqual(vector[i], matrix[i, i]); - } - } - - /// - /// Set a diagonal vector with unequal length throws ArgumentException. - /// - [Test] - public void SetDiagonalVectorWithUnequalLengthThrowsArgumentException() - { - var vector = CreateVector(new float[] { 1, 2, 3 }); - Assert.Throws(() => TestMatrices["Wide2x3"].SetDiagonal(vector)); - } - - /// - /// Set a diagonal with null vector throws ArgumentNullException. - /// - [Test] - public void SetDiagonalWithNullVectorThrowsArgumentNullException() - { - Vector vector = null; - Assert.Throws(() => TestMatrices["Square3x3"].SetDiagonal(vector)); - } - - /// - /// Can set a diagonal array. - /// - /// Matrix name. - /// Diagonal array. - [TestCase("Square3x3", new float[] { 1, 2, 3 })] - [TestCase("Wide2x3", new float[] { 1, 2 })] - [TestCase("Tall3x2", new float[] { 1, 2 })] - public void CanSetDiagonalArray(string name, float[] diagonal) - { - var matrix = TestMatrices[name]; - matrix.SetDiagonal(diagonal); - - var min = Math.Min(matrix.ColumnCount, matrix.RowCount); - Assert.AreEqual(diagonal.Length, min); - - for (var i = 0; i < diagonal.Length; i++) - { - Assert.AreEqual(diagonal[i], matrix[i, i]); - } - } - - /// - /// Set a diagonal array with unequal length throws ArgumentException. - /// - [Test] - public void SetDiagonalArrayWithUnequalLengthThrowsArgumentException() - { - var array = new float[] { 1, 2, 3 }; - Assert.Throws(() => TestMatrices["Wide2x3"].SetDiagonal(array)); - } - - /// - /// Set a diagonal with null array throws ArgumentNullException. - /// - [Test] - public void SetDiagonalWithNullArrayThrowsArgumentNullException() - { - float[] array = null; - Assert.Throws(() => TestMatrices["Square3x3"].SetDiagonal(array)); - } - /// /// Can insert a row. ///