diff --git a/src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs b/src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs index 1f285089..44e0f932 100644 --- a/src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs @@ -201,7 +201,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// of columns. /// (columnIndex + columnLength) >= Columns /// (rowIndex + rowLength) >= Rows - /// If or + /// If or /// is not positive. public override Matrix SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount) { diff --git a/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs index 18f1159e..268cf260 100644 --- a/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs @@ -1065,7 +1065,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// of columns. /// (columnIndex + columnLength) >= Columns /// (rowIndex + rowLength) >= Rows - /// If or + /// If or /// is not positive. public override Matrix SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount) { @@ -1164,14 +1164,14 @@ namespace MathNet.Numerics.LinearAlgebra.Complex for (var i = 0; i < rowIndex; i++) { - result.SetRow(i, Row(i)); + result.At(i, i, At(i, i)); } result.SetRow(rowIndex, row); - for (var i = rowIndex + 1; i < RowCount; i++) + for (var i = rowIndex + 1; i < result.RowCount; i++) { - result.SetRow(i, Row(i - 1)); + result.At(i, i - 1, At(i - 1, i - 1)); } return result; diff --git a/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs index 97e6faf9..0ef336ae 100644 --- a/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs @@ -389,7 +389,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// of columns. /// (columnIndex + columnLength) >= Columns /// (rowIndex + rowLength) >= Rows - /// If or + /// If or /// is not positive. public override Matrix SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount) { @@ -405,12 +405,12 @@ namespace MathNet.Numerics.LinearAlgebra.Complex if (rowCount < 1) { - throw new ArgumentException(Resources.ArgumentMustBePositive, "rowCount"); + throw new ArgumentOutOfRangeException("rowCount", Resources.ArgumentMustBePositive); } if (columnCount < 1) { - throw new ArgumentException(Resources.ArgumentMustBePositive, "columnCount"); + throw new ArgumentOutOfRangeException("columnCount", Resources.ArgumentMustBePositive); } var colMax = columnIndex + columnCount; diff --git a/src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs b/src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs index 80dfdc35..66309118 100644 --- a/src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs @@ -201,7 +201,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// of columns. /// (columnIndex + columnLength) >= Columns /// (rowIndex + rowLength) >= Rows - /// If or + /// If or /// is not positive. public override Matrix SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount) { diff --git a/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs index 96fa37e1..02f0ea4b 100644 --- a/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs @@ -1065,7 +1065,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// of columns. /// (columnIndex + columnLength) >= Columns /// (rowIndex + rowLength) >= Rows - /// If or + /// If or /// is not positive. public override Matrix SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount) { @@ -1164,14 +1164,14 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 for (var i = 0; i < rowIndex; i++) { - result.SetRow(i, Row(i)); + result.At(i, i, At(i, i)); } result.SetRow(rowIndex, row); - for (var i = rowIndex + 1; i < RowCount; i++) + for (var i = rowIndex + 1; i < result.RowCount; i++) { - result.SetRow(i, Row(i - 1)); + result.At(i, i - 1, At(i - 1, i - 1)); } return result; diff --git a/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs index b6674171..74244ed8 100644 --- a/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs @@ -389,7 +389,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// of columns. /// (columnIndex + columnLength) >= Columns /// (rowIndex + rowLength) >= Rows - /// If or + /// If or /// is not positive. public override Matrix SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount) { @@ -405,12 +405,12 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 if (rowCount < 1) { - throw new ArgumentException(Resources.ArgumentMustBePositive, "rowCount"); + throw new ArgumentOutOfRangeException("rowCount", Resources.ArgumentMustBePositive); } if (columnCount < 1) { - throw new ArgumentException(Resources.ArgumentMustBePositive, "columnCount"); + throw new ArgumentOutOfRangeException("columnCount", Resources.ArgumentMustBePositive); } var colMax = columnIndex + columnCount; diff --git a/src/Numerics/LinearAlgebra/Double/DenseMatrix.cs b/src/Numerics/LinearAlgebra/Double/DenseMatrix.cs index 7bb83338..71fff598 100644 --- a/src/Numerics/LinearAlgebra/Double/DenseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Double/DenseMatrix.cs @@ -201,7 +201,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// of columns. /// (columnIndex + columnLength) >= Columns /// (rowIndex + rowLength) >= Rows - /// If or + /// If or /// is not positive. public override Matrix SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount) { diff --git a/src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs index bc90bc25..d2583b3c 100644 --- a/src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs @@ -1059,7 +1059,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// of columns. /// (columnIndex + columnLength) >= Columns /// (rowIndex + rowLength) >= Rows - /// If or + /// If or /// is not positive. public override Matrix SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount) { @@ -1158,14 +1158,14 @@ namespace MathNet.Numerics.LinearAlgebra.Double for (var i = 0; i < rowIndex; i++) { - result.SetRow(i, Row(i)); + result.At(i, i, At(i, i)); } result.SetRow(rowIndex, row); - for (var i = rowIndex + 1; i < RowCount; i++) + for (var i = rowIndex + 1; i < result.RowCount; i++) { - result.SetRow(i, Row(i - 1)); + result.At(i, i - 1, At(i - 1, i - 1)); } return result; diff --git a/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs index c9bb7a29..f5a5bd82 100644 --- a/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs @@ -388,7 +388,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// of columns. /// (columnIndex + columnLength) >= Columns /// (rowIndex + rowLength) >= Rows - /// If or + /// If or /// is not positive. public override Matrix SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount) { @@ -404,12 +404,12 @@ namespace MathNet.Numerics.LinearAlgebra.Double if (rowCount < 1) { - throw new ArgumentException(Resources.ArgumentMustBePositive, "rowCount"); + throw new ArgumentOutOfRangeException("rowCount", Resources.ArgumentMustBePositive); } if (columnCount < 1) { - throw new ArgumentException(Resources.ArgumentMustBePositive, "columnCount"); + throw new ArgumentOutOfRangeException("columnCount", Resources.ArgumentMustBePositive); } var colMax = columnIndex + columnCount; diff --git a/src/Numerics/LinearAlgebra/Generic/Matrix.cs b/src/Numerics/LinearAlgebra/Generic/Matrix.cs index 2d81173c..72cdaddc 100644 --- a/src/Numerics/LinearAlgebra/Generic/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Generic/Matrix.cs @@ -611,7 +611,7 @@ namespace MathNet.Numerics.LinearAlgebra.Generic /// of columns. /// (columnIndex + columnLength) >= Columns /// (rowIndex + rowLength) >= Rows - /// If or + /// If or /// is not positive. public virtual Matrix SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount) { @@ -627,12 +627,12 @@ namespace MathNet.Numerics.LinearAlgebra.Generic if (rowCount < 1) { - throw new ArgumentException(Resources.ArgumentMustBePositive, "rowCount"); + throw new ArgumentOutOfRangeException("rowCount", Resources.ArgumentMustBePositive); } if (columnCount < 1) { - throw new ArgumentException(Resources.ArgumentMustBePositive, "columnCount"); + throw new ArgumentOutOfRangeException("columnCount", Resources.ArgumentMustBePositive); } var colMax = columnIndex + columnCount; @@ -1109,7 +1109,7 @@ namespace MathNet.Numerics.LinearAlgebra.Generic /// (rowIndex + rowLength) >= Rows /// If is /// the size of is not at least x . - /// If or + /// If or /// is not positive. public virtual void SetSubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount, Matrix subMatrix) { @@ -1125,12 +1125,12 @@ namespace MathNet.Numerics.LinearAlgebra.Generic if (rowCount < 1) { - throw new ArgumentException(Resources.ArgumentMustBePositive, "rowCount"); + throw new ArgumentOutOfRangeException("rowCount", Resources.ArgumentMustBePositive); } if (columnCount < 1) { - throw new ArgumentException(Resources.ArgumentMustBePositive, "columnCount"); + throw new ArgumentOutOfRangeException("columnCount", Resources.ArgumentMustBePositive); } if (subMatrix == null) diff --git a/src/Numerics/LinearAlgebra/Single/DenseMatrix.cs b/src/Numerics/LinearAlgebra/Single/DenseMatrix.cs index 42d2f8c3..cd458836 100644 --- a/src/Numerics/LinearAlgebra/Single/DenseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Single/DenseMatrix.cs @@ -201,7 +201,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single /// of columns. /// (columnIndex + columnLength) >= Columns /// (rowIndex + rowLength) >= Rows - /// If or + /// If or /// is not positive. public override Matrix SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount) { diff --git a/src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs index 2722ed91..57ff3b21 100644 --- a/src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs @@ -1059,7 +1059,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single /// of columns. /// (columnIndex + columnLength) >= Columns /// (rowIndex + rowLength) >= Rows - /// If or + /// If or /// is not positive. public override Matrix SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount) { @@ -1158,14 +1158,14 @@ namespace MathNet.Numerics.LinearAlgebra.Single for (var i = 0; i < rowIndex; i++) { - result.SetRow(i, Row(i)); + result.At(i, i, At(i, i)); } result.SetRow(rowIndex, row); - for (var i = rowIndex + 1; i < RowCount; i++) + for (var i = rowIndex + 1; i < result.RowCount; i++) { - result.SetRow(i, Row(i - 1)); + result.At(i, i - 1, At(i - 1, i - 1)); } return result; diff --git a/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs index 153ef3bc..4c89cc1e 100644 --- a/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs @@ -388,7 +388,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single /// of columns. /// (columnIndex + columnLength) >= Columns /// (rowIndex + rowLength) >= Rows - /// If or + /// If or /// is not positive. public override Matrix SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount) { @@ -404,12 +404,12 @@ namespace MathNet.Numerics.LinearAlgebra.Single if (rowCount < 1) { - throw new ArgumentException(Resources.ArgumentMustBePositive, "rowCount"); + throw new ArgumentOutOfRangeException("rowCount", Resources.ArgumentMustBePositive); } if (columnCount < 1) { - throw new ArgumentException(Resources.ArgumentMustBePositive, "columnCount"); + throw new ArgumentOutOfRangeException("columnCount", Resources.ArgumentMustBePositive); } var colMax = columnIndex + columnCount; diff --git a/src/Numerics/LinearAlgebra/Storage/MatrixStorage.Validation.cs b/src/Numerics/LinearAlgebra/Storage/MatrixStorage.Validation.cs index b8eda87d..1d962b4b 100644 --- a/src/Numerics/LinearAlgebra/Storage/MatrixStorage.Validation.cs +++ b/src/Numerics/LinearAlgebra/Storage/MatrixStorage.Validation.cs @@ -25,12 +25,12 @@ namespace MathNet.Numerics.LinearAlgebra.Storage { if (rowCount < 1) { - throw new ArgumentException(Resources.ArgumentMustBePositive, "rowCount"); + throw new ArgumentOutOfRangeException("rowCount", Resources.ArgumentMustBePositive); } if (columnCount < 1) { - throw new ArgumentException(Resources.ArgumentMustBePositive, "columnCount"); + throw new ArgumentOutOfRangeException("columnCount", Resources.ArgumentMustBePositive); } // Verify Source diff --git a/src/Numerics/LinearAlgebra/Storage/MatrixStorage.cs b/src/Numerics/LinearAlgebra/Storage/MatrixStorage.cs index 6c85843a..394b6990 100644 --- a/src/Numerics/LinearAlgebra/Storage/MatrixStorage.cs +++ b/src/Numerics/LinearAlgebra/Storage/MatrixStorage.cs @@ -1,6 +1,5 @@ using System; using MathNet.Numerics.Properties; -using MathNet.Numerics.Threading; namespace MathNet.Numerics.LinearAlgebra.Storage { diff --git a/src/Numerics/LinearAlgebra/Storage/SparseDiagonalMatrixStorage.cs b/src/Numerics/LinearAlgebra/Storage/SparseDiagonalMatrixStorage.cs index 7d23424d..a5ce6575 100644 --- a/src/Numerics/LinearAlgebra/Storage/SparseDiagonalMatrixStorage.cs +++ b/src/Numerics/LinearAlgebra/Storage/SparseDiagonalMatrixStorage.cs @@ -239,7 +239,14 @@ namespace MathNet.Numerics.LinearAlgebra.Storage target.Clear(); } - if (sourceRowIndex > sourceColumnIndex && sourceColumnIndex + columnCount > sourceRowIndex) + if (sourceRowIndex == sourceColumnIndex) + { + for (var i = 0; i < Math.Min(columnCount, rowCount); i++) + { + target.At(i + targetRowIndex, i + targetColumnIndex, Data[sourceRowIndex + i]); + } + } + else if (sourceRowIndex > sourceColumnIndex && sourceColumnIndex + columnCount > sourceRowIndex) { // column by column, but skip resulting zero columns at the beginning int columnInit = sourceRowIndex - sourceColumnIndex; @@ -257,13 +264,8 @@ namespace MathNet.Numerics.LinearAlgebra.Storage target.At(rowInit + i + targetRowIndex, i + targetColumnIndex, Data[sourceColumnIndex + i]); } } - else - { - for (var i = 0; i < Math.Min(columnCount, rowCount); i++) - { - target.At(i + targetRowIndex, i + targetColumnIndex, Data[sourceRowIndex + i]); - } - } + + // else: all zero, nop } } } diff --git a/src/UnitTests/LinearAlgebraTests/Complex/DiagonalMatrixTests.cs b/src/UnitTests/LinearAlgebraTests/Complex/DiagonalMatrixTests.cs index 6d731846..7cc5299d 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/DiagonalMatrixTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/DiagonalMatrixTests.cs @@ -320,30 +320,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex } } - /// - /// Can set a submatrix. - /// - /// The row to start copying to. - /// The number of rows to copy. - /// The column to start copying to. - /// The number of columns to copy. - public override void CanSetSubMatrix(int rowStart, int rowLength, int colStart, int colLength) - { - try - { - // Pass all invoke to base - base.CanSetSubMatrix(rowStart, rowLength, colStart, colLength); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - /// /// Can compute Frobenius norm. /// @@ -515,43 +491,5 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex var matrix = TestMatrices["Square3x3"]; Assert.IsTrue(matrix.IsSymmetric); } - - /// - /// Can get a sub-matrix. - /// - [Test] - public override void CanGetASubMatrix() - { - var matrix = CreateMatrix(10, 10); - for (var row = 0; row < matrix.RowCount; row++) - { - for (var column = 0; column < matrix.ColumnCount; column++) - { - if (row == column) - { - matrix[row, column] = 1.0; - } - } - } - - var submatrix = matrix.SubMatrix(8, 2, 0, 2); - Assert.AreEqual(2, submatrix.RowCount); - Assert.AreEqual(2, submatrix.ColumnCount); - - for (var row = 0; row < submatrix.RowCount; row++) - { - for (var column = 0; column < submatrix.ColumnCount; column++) - { - if (row == column) - { - Assert.AreEqual(Complex.One, submatrix[row, column]); - } - else - { - Assert.AreEqual(Complex.Zero, submatrix[row, column]); - } - } - } - } } } diff --git a/src/UnitTests/LinearAlgebraTests/Complex/MatrixStructureTheory.cs b/src/UnitTests/LinearAlgebraTests/Complex/MatrixStructureTheory.cs index 4efee412..08906b69 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/MatrixStructureTheory.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/MatrixStructureTheory.cs @@ -1,4 +1,8 @@ -namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex +using System.Linq; +using MathNet.Numerics.Distributions; +using MathNet.Numerics.Random; + +namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex { using LinearAlgebra.Complex; using LinearAlgebra.Generic; @@ -11,7 +15,7 @@ [Datapoints] Matrix[] _matrices = new Matrix[] { - new DenseMatrix(new[,] {{1d, new Complex(1.1d, -4d), 2d}, {1d, 1d, 2d}, {1d, new Complex(1d,2d), 2d}}), + new DenseMatrix(new[,] {{1d, new Complex(1.1d, -4d), 2d}, {1d, 1d, 2d}, {1d, new Complex(1d, 2d), 2d}}), new DenseMatrix(new[,] {{-1.1d, -2.2d, -3.3d}, {0d, 1.1d, new Complex(2.2d, -1.2d)}, {-4.4d, 5.5d, 6.6d}}), new DenseMatrix(new[,] {{new Complex(-1.1d, -2d), -2.2d, -3.3d, -4.4d}, {0d, 1.1d, 2.2d, 3.3d}, {1d, 2.1d, 6.2d, 4.3d}, {-4.4d, 5.5d, 6.6d, -7.7d}}), new DenseMatrix(new[,] {{-1.1d, new Complex(-2.2d, 3.4d), -3.3d, -4.4d}, {-1.1d, -2.2d, -3.3d, -4.4d}, {-1.1d, -2.2d, -3.3d, -4.4d}, {-1.1d, -2.2d, -3.3d, -4.4d}}), @@ -20,11 +24,11 @@ new DenseMatrix(new[,] {{1d, 2d, 3d}, {2d, new Complex(2d, 2d), 0d}, {3d, Complex.Zero, 3d}}), new SparseMatrix(new[,] {{7d, 1d, 2d}, {1d, 1d, 2d}, {1d, 1d + Complex.ImaginaryOne, 2d}}), - new SparseMatrix(new[,] {{7d, 1d, 2d}, {new Complex(1d,2d), 0d, Complex.Zero}, {-2d, 0d, 0d}}), + new SparseMatrix(new[,] {{7d, 1d, 2d}, {new Complex(1d, 2d), 0d, Complex.Zero}, {-2d, 0d, 0d}}), new SparseMatrix(new[,] {{-1.1d, 0d, 0d}, {0d, new Complex(1.1d, 2d), 2.2d}}), - new DiagonalMatrix(3, 3, new[] {new Complex(1d,1d), -2d, 1.5d}), - new DiagonalMatrix(3, 3, new[] {new Complex(1d,2d), 0d, -1.5d}), + new DiagonalMatrix(3, 3, new[] {new Complex(1d, 1d), -2d, 1.5d}), + new DiagonalMatrix(3, 3, new[] {new Complex(1d, 2d), 0d, -1.5d}), new UserDefinedMatrix(new[,] {{0d, 1d, 2d}, {-1d, 7.7d, 0d}, {-2d, Complex.Zero, 0d}}) }; @@ -37,6 +41,12 @@ return new DenseMatrix(rows, columns); } + protected override Matrix CreateDense(int rows, int columns, int seed) + { + var dist = new Normal {RandomSource = new MersenneTwister(seed)}; + return new DenseMatrix(rows, columns, Enumerable.Range(0, rows*columns).Select(k => new Complex(dist.Sample(), dist.Sample())).ToArray()); + } + protected override Matrix CreateSparse(int rows, int columns) { return new SparseMatrix(rows, columns); @@ -47,6 +57,12 @@ return new DenseVector(size); } + protected override Vector CreateVector(int size, int seed) + { + var dist = new Normal {RandomSource = new MersenneTwister(seed)}; + return new DenseVector(Enumerable.Range(0, size).Select(k => new Complex(dist.Sample(), dist.Sample())).ToArray()); + } + protected override Complex Zero { get { return Complex.Zero; } diff --git a/src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.cs b/src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.cs index 4b0e85f4..f7b5060b 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.cs @@ -88,208 +88,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex } } - /// - /// Can insert a column. - /// - [Test] - public void CanInsertColumn() - { - var matrix = CreateMatrix(3, 3); - var column = CreateVector(matrix.RowCount); - for (var i = 0; i < column.Count; i++) - { - column[i] = i; - } - - for (var k = 0; k < matrix.ColumnCount + 1; k++) - { - var result = matrix.InsertColumn(k, column); - Assert.AreEqual(result.ColumnCount, matrix.ColumnCount + 1); - for (var col = 0; col < result.ColumnCount; col++) - { - for (var row = 0; row < result.RowCount; row++) - { - AssertHelpers.AreEqual(col == k ? column[row] : 0, result[row, col]); - } - } - } - } - - /// - /// Insert null column throws ArgumentNullException. - /// - [Test] - public void InsertNullColumnThrowsArgumentNullException() - { - var matrix = TestMatrices["Square3x3"]; - Assert.Throws(() => matrix.InsertColumn(0, null)); - } - - /// - /// Insert a column with invalid column index throws ArgumentOutOfRangeException. - /// - [Test] - public void InsertColumnWithInvalidColumnIndexThrowsArgumentOutOfRangeException() - { - var matrix = CreateMatrix(3, 3); - var column = CreateVector(matrix.RowCount); - Assert.Throws(() => matrix.InsertColumn(-1, column)); - Assert.Throws(() => matrix.InsertColumn(5, column)); - } - - /// - /// Insert a column with invalid number of elements throws ArgumentException. - /// - [Test] - public void InsertColumnWithUnequalNumberOfElementsThrowsArgumentException() - { - var matrix = CreateMatrix(3, 3); - var column = CreateVector(matrix.RowCount + 1); - Assert.Throws(() => matrix.InsertColumn(0, column)); - } - - /// - /// Can set a submatrix. - /// - /// The row to start copying to. - /// The number of rows to copy. - /// The column to start copying to. - /// The number of columns to copy. - [TestCase(0, 2, 0, 2)] - [TestCase(1, 1, 1, 1)] - public virtual void CanSetSubMatrix(int rowStart, int rowLength, int colStart, int colLength) - { - foreach (var matrix in TestMatrices.Values) - { - var subMatrix = matrix.SubMatrix(0, 2, 0, 2); - subMatrix[0, 0] = 10.0; - subMatrix[0, 1] = -1.0; - subMatrix[1, 0] = 3.0; - subMatrix[1, 1] = 4.0; - matrix.SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix); - - for (int i = rowStart, ii = 0; i < rowLength; i++, ii++) - { - for (int j = colStart, jj = 0; j < colLength; j++, jj++) - { - Assert.AreEqual(matrix[i, j], subMatrix[ii, jj]); - } - } - } - } - - /// - /// Set submatrix with invalid ranges throws ArgumentOutOfRangeException. - /// - /// The row to start copying to. - /// The number of rows to copy. - /// The column to start copying to. - /// The number of columns to copy. - [TestCase(0, 4, 0, 2)] - [TestCase(0, 2, 0, 4)] - [TestCase(4, 2, 0, 2)] - [TestCase(0, 2, 4, 2)] - [TestCase(-1, 2, 0, 2)] - [TestCase(0, 2, -1, 2)] - public virtual void SetSubMatrixWithInvalidRangesThrowsArgumentOutOfRangeException(int rowStart, int rowLength, int colStart, int colLength) - { - var subMatrix = TestMatrices["Square3x3"].SubMatrix(0, 2, 0, 2); - subMatrix[0, 0] = 10.0; - subMatrix[0, 1] = -1.0; - subMatrix[1, 0] = 3.0; - subMatrix[1, 1] = 4.0; - Assert.Throws(() => TestMatrices["Square3x3"].SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix)); - } - - /// - /// Set submatrix with invalid length throws ArgumentOutOfRangeException. - /// - /// The row to start copying to. - /// The number of rows to copy. - /// The column to start copying to. - /// The number of columns to copy. - [TestCase(0, -1, 0, 2)] - [TestCase(0, 2, 0, -1)] - public virtual void SetSubMatrixWithInvalidLengthsThrowsArgumentException(int rowStart, int rowLength, int colStart, int colLength) - { - var subMatrix = TestMatrices["Square3x3"].SubMatrix(0, 2, 0, 2); - subMatrix[0, 0] = 10.0; - subMatrix[0, 1] = -1.0; - subMatrix[1, 0] = 3.0; - subMatrix[1, 1] = 4.0; - Assert.Throws(() => TestMatrices["Square3x3"].SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix)); - } - - /// - /// Set a submatrix with null submatrix throws ArgumentNullException. - /// - [Test] - public void SetSubMatrixWithNullSubMatrixThrowsArgumentNullException() - { - Matrix subMatrix = null; - Assert.Throws(() => TestMatrices["Square3x3"].SetSubMatrix(0, 2, 0, 2, subMatrix)); - } - - /// - /// Can insert a row. - /// - [Test] - public void CanInsertRow() - { - var matrix = CreateMatrix(3, 3); - var row = CreateVector(matrix.ColumnCount); - for (var i = 0; i < row.Count; i++) - { - row[i] = i; - } - - for (var insertedRowIndex = 0; insertedRowIndex < matrix.RowCount + 1; insertedRowIndex++) - { - var result = matrix.InsertRow(insertedRowIndex, row); - Assert.AreEqual(result.RowCount, matrix.ColumnCount + 1); - for (var i = 0; i < result.RowCount; i++) - { - for (var j = 0; j < result.ColumnCount; j++) - { - Assert.AreEqual(i == insertedRowIndex ? row[j] : Complex.Zero, result[i, j]); - } - } - } - } - - /// - /// Insert null row throws ArgumentNullException. - /// - [Test] - public void InsertNullRowThrowsArgumentNullException() - { - var matrix = TestMatrices["Square3x3"]; - Assert.Throws(() => matrix.InsertRow(0, null)); - } - - /// - /// Insert a row with invalid row index throws ArgumentOutOfRangeException. - /// - [Test] - public void InsertRowWithInvalidRowIndexThrowsArgumentOutOfRangeException() - { - var matrix = CreateMatrix(3, 3); - var row = CreateVector(matrix.ColumnCount); - Assert.Throws(() => matrix.InsertRow(-1, row)); - Assert.Throws(() => matrix.InsertRow(5, row)); - } - - /// - /// Insert a row with invalid number of elements throws ArgumentException. - /// - [Test] - public void InsertRowWithInvalidNumberOfElementsThrowsArgumentException() - { - var matrix = CreateMatrix(3, 3); - var row = CreateVector(matrix.ColumnCount + 1); - Assert.Throws(() => matrix.InsertRow(0, row)); - } - /// /// Can convert a matrix to a multidimensional array. /// @@ -785,34 +583,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex Assert.IsFalse(matrix.IsSymmetric); } - /// - /// Can get a sub-matrix. - /// - [Test] - public virtual void CanGetASubMatrix() - { - var matrix = CreateMatrix(10, 10); - for (var row = 0; row < matrix.RowCount; row++) - { - for (var column = 0; column < matrix.ColumnCount; column++) - { - matrix[row, column] = 1.0; - } - } - - var submatrix = matrix.SubMatrix(8, 2, 0, 2); - Assert.AreEqual(2, submatrix.RowCount); - Assert.AreEqual(2, submatrix.ColumnCount); - - for (var row = 0; row < submatrix.RowCount; row++) - { - for (var column = 0; column < submatrix.ColumnCount; column++) - { - Assert.AreEqual(Complex.One, submatrix[row, column]); - } - } - } - /// /// Test whether we can create a matrix from a list of column vectors. /// diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/DiagonalMatrixTests.cs b/src/UnitTests/LinearAlgebraTests/Complex32/DiagonalMatrixTests.cs index ac7d9189..bdde8a11 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/DiagonalMatrixTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/DiagonalMatrixTests.cs @@ -320,30 +320,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32 } } - /// - /// Can set a submatrix. - /// - /// The row to start copying to. - /// The number of rows to copy. - /// The column to start copying to. - /// The number of columns to copy. - public override void CanSetSubMatrix(int rowStart, int rowLength, int colStart, int colLength) - { - try - { - // Pass all invoke to base - base.CanSetSubMatrix(rowStart, rowLength, colStart, colLength); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - /// /// Can compute Frobenius norm. /// @@ -515,43 +491,5 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32 var matrix = TestMatrices["Square3x3"]; Assert.IsTrue(matrix.IsSymmetric); } - - /// - /// Can get a sub-matrix. - /// - [Test] - public override void CanGetASubMatrix() - { - var matrix = CreateMatrix(10, 10); - for (var row = 0; row < matrix.RowCount; row++) - { - for (var column = 0; column < matrix.ColumnCount; column++) - { - if (row == column) - { - matrix[row, column] = 1.0f; - } - } - } - - var submatrix = matrix.SubMatrix(8, 2, 0, 2); - Assert.AreEqual(2, submatrix.RowCount); - Assert.AreEqual(2, submatrix.ColumnCount); - - for (var row = 0; row < submatrix.RowCount; row++) - { - for (var column = 0; column < submatrix.ColumnCount; column++) - { - if (row == column) - { - Assert.AreEqual(Complex32.One, submatrix[row, column]); - } - else - { - Assert.AreEqual(Complex32.Zero, submatrix[row, column]); - } - } - } - } } } diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/MatrixStructureTheory.cs b/src/UnitTests/LinearAlgebraTests/Complex32/MatrixStructureTheory.cs index 1fe04b4c..82367fd9 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/MatrixStructureTheory.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/MatrixStructureTheory.cs @@ -1,4 +1,8 @@ -namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32 +using System.Linq; +using MathNet.Numerics.Distributions; +using MathNet.Numerics.Random; + +namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32 { using LinearAlgebra.Complex32; using LinearAlgebra.Generic; @@ -11,7 +15,7 @@ [Datapoints] Matrix[] _matrices = new Matrix[] { - new DenseMatrix(new[,] {{1f, new Complex32(1.1f, -4f), 2f}, {1f, 1f, 2f}, {1f, new Complex32(1f,2f), 2f}}), + new DenseMatrix(new[,] {{1f, new Complex32(1.1f, -4f), 2f}, {1f, 1f, 2f}, {1f, new Complex32(1f, 2f), 2f}}), new DenseMatrix(new[,] {{-1.1f, -2.2f, -3.3f}, {0f, 1.1f, new Complex32(2.2f, -1.2f)}, {-4.4f, 5.5f, 6.6f}}), new DenseMatrix(new[,] {{new Complex32(-1.1f, -2f), -2.2f, -3.3f, -4.4f}, {0f, 1.1f, 2.2f, 3.3f}, {1f, 2.1f, 6.2f, 4.3f}, {-4.4f, 5.5f, 6.6f, -7.7f}}), new DenseMatrix(new[,] {{-1.1f, new Complex32(-2.2f, 3.4f), -3.3f, -4.4f}, {-1.1f, -2.2f, -3.3f, -4.4f}, {-1.1f, -2.2f, -3.3f, -4.4f}, {-1.1f, -2.2f, -3.3f, -4.4f}}), @@ -20,23 +24,29 @@ new DenseMatrix(new[,] {{1f, 2f, 3f}, {2f, new Complex32(2f, 2f), 0f}, {3f, Complex32.Zero, 3f}}), new SparseMatrix(new[,] {{7f, 1f, 2f}, {1f, 1f, 2f}, {1f, 1f + Complex32.ImaginaryOne, 2f}}), - new SparseMatrix(new[,] {{7f, 1f, 2f}, {new Complex32(1f,2f), 0f, Complex32.Zero}, {-2f, 0f, 0f}}), + new SparseMatrix(new[,] {{7f, 1f, 2f}, {new Complex32(1f, 2f), 0f, Complex32.Zero}, {-2f, 0f, 0f}}), new SparseMatrix(new[,] {{-1.1f, 0f, 0f}, {0f, new Complex32(1.1f, 2f), 2.2f}}), - new DiagonalMatrix(3, 3, new[] {new Complex32(1f,1f), -2f, 1.5f}), - new DiagonalMatrix(3, 3, new[] {new Complex32(1f,2f), 0f, -1.5f}), + new DiagonalMatrix(3, 3, new[] {new Complex32(1f, 1f), -2f, 1.5f}), + new DiagonalMatrix(3, 3, new[] {new Complex32(1f, 2f), 0f, -1.5f}), new UserDefinedMatrix(new[,] {{0f, 1f, 2f}, {-1f, 7.7f, 0f}, {-2f, Complex32.Zero, 0f}}) }; [Datapoints] - Complex32[] scalars = new[] { new Complex32(2f, 0f), new Complex32(-1.5f, 3.5f), Complex32.Zero }; + Complex32[] scalars = new[] {new Complex32(2f, 0f), new Complex32(-1.5f, 3.5f), Complex32.Zero}; protected override Matrix CreateDense(int rows, int columns) { return new DenseMatrix(rows, columns); } + protected override Matrix CreateDense(int rows, int columns, int seed) + { + var dist = new Normal {RandomSource = new MersenneTwister(seed)}; + return new DenseMatrix(rows, columns, Enumerable.Range(0, rows*columns).Select(k => new Complex32((float) dist.Sample(), (float) dist.Sample())).ToArray()); + } + protected override Matrix CreateSparse(int rows, int columns) { return new SparseMatrix(rows, columns); @@ -47,6 +57,12 @@ return new DenseVector(size); } + protected override Vector CreateVector(int size, int seed) + { + var dist = new Normal {RandomSource = new MersenneTwister(seed)}; + return new DenseVector(Enumerable.Range(0, size).Select(k => new Complex32((float) dist.Sample(), (float) dist.Sample())).ToArray()); + } + protected override Complex32 Zero { get { return Complex32.Zero; } diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.cs b/src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.cs index 07f2c72d..fb454064 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.cs @@ -88,208 +88,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32 } } - /// - /// Can insert a column. - /// - [Test] - public void CanInsertColumn() - { - var matrix = CreateMatrix(3, 3); - var column = CreateVector(matrix.RowCount); - for (var i = 0; i < column.Count; i++) - { - column[i] = i; - } - - for (var k = 0; k < matrix.ColumnCount + 1; k++) - { - var result = matrix.InsertColumn(k, column); - Assert.AreEqual(result.ColumnCount, matrix.ColumnCount + 1); - for (var col = 0; col < result.ColumnCount; col++) - { - for (var row = 0; row < result.RowCount; row++) - { - AssertHelpers.AreEqual(col == k ? column[row] : 0, result[row, col]); - } - } - } - } - - /// - /// Insert null column throws ArgumentNullException. - /// - [Test] - public void InsertNullColumnThrowsArgumentNullException() - { - var matrix = TestMatrices["Square3x3"]; - Assert.Throws(() => matrix.InsertColumn(0, null)); - } - - /// - /// Insert a column with invalid column index throws ArgumentOutOfRangeException. - /// - [Test] - public void InsertColumnWithInvalidColumnIndexThrowsArgumentOutOfRangeException() - { - var matrix = CreateMatrix(3, 3); - var column = CreateVector(matrix.RowCount); - Assert.Throws(() => matrix.InsertColumn(-1, column)); - Assert.Throws(() => matrix.InsertColumn(5, column)); - } - - /// - /// Insert a column with invalid number of elements throws ArgumentException. - /// - [Test] - public void InsertColumnWithUnequalNumberOfElementsThrowsArgumentException() - { - var matrix = CreateMatrix(3, 3); - var column = CreateVector(matrix.RowCount + 1); - Assert.Throws(() => matrix.InsertColumn(0, column)); - } - - /// - /// Can set a submatrix. - /// - /// The row to start copying to. - /// The number of rows to copy. - /// The column to start copying to. - /// The number of columns to copy. - [TestCase(0, 2, 0, 2)] - [TestCase(1, 1, 1, 1)] - public virtual void CanSetSubMatrix(int rowStart, int rowLength, int colStart, int colLength) - { - foreach (var matrix in TestMatrices.Values) - { - var subMatrix = matrix.SubMatrix(0, 2, 0, 2); - subMatrix[0, 0] = 10.0f; - subMatrix[0, 1] = -1.0f; - subMatrix[1, 0] = 3.0f; - subMatrix[1, 1] = 4.0f; - matrix.SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix); - - for (int i = rowStart, ii = 0; i < rowLength; i++, ii++) - { - for (int j = colStart, jj = 0; j < colLength; j++, jj++) - { - Assert.AreEqual(matrix[i, j], subMatrix[ii, jj]); - } - } - } - } - - /// - /// Set submatrix with invalid ranges throws ArgumentOutOfRangeException. - /// - /// The row to start copying to. - /// The number of rows to copy. - /// The column to start copying to. - /// The number of columns to copy. - [TestCase(0, 4, 0, 2)] - [TestCase(0, 2, 0, 4)] - [TestCase(4, 2, 0, 2)] - [TestCase(0, 2, 4, 2)] - [TestCase(-1, 2, 0, 2)] - [TestCase(0, 2, -1, 2)] - public virtual void SetSubMatrixWithInvalidRangesThrowsArgumentOutOfRangeException(int rowStart, int rowLength, int colStart, int colLength) - { - var subMatrix = TestMatrices["Square3x3"].SubMatrix(0, 2, 0, 2); - subMatrix[0, 0] = 10.0f; - subMatrix[0, 1] = -1.0f; - subMatrix[1, 0] = 3.0f; - subMatrix[1, 1] = 4.0f; - Assert.Throws(() => TestMatrices["Square3x3"].SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix)); - } - - /// - /// Set submatrix with invalid length throws ArgumentOutOfRangeException. - /// - /// The row to start copying to. - /// The number of rows to copy. - /// The column to start copying to. - /// The number of columns to copy. - [TestCase(0, -1, 0, 2)] - [TestCase(0, 2, 0, -1)] - public virtual void SetSubMatrixWithInvalidLengthsThrowsArgumentException(int rowStart, int rowLength, int colStart, int colLength) - { - var subMatrix = TestMatrices["Square3x3"].SubMatrix(0, 2, 0, 2); - subMatrix[0, 0] = 10.0f; - subMatrix[0, 1] = -1.0f; - subMatrix[1, 0] = 3.0f; - subMatrix[1, 1] = 4.0f; - Assert.Throws(() => TestMatrices["Square3x3"].SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix)); - } - - /// - /// Set a submatrix with null submatrix throws ArgumentNullException. - /// - [Test] - public void SetSubMatrixWithNullSubMatrixThrowsArgumentNullException() - { - Matrix subMatrix = null; - Assert.Throws(() => TestMatrices["Square3x3"].SetSubMatrix(0, 2, 0, 2, subMatrix)); - } - - /// - /// Can insert a row. - /// - [Test] - public void CanInsertRow() - { - var matrix = CreateMatrix(3, 3); - var row = CreateVector(matrix.ColumnCount); - for (var i = 0; i < row.Count; i++) - { - row[i] = i; - } - - for (var insertedRowIndex = 0; insertedRowIndex < matrix.RowCount + 1; insertedRowIndex++) - { - var result = matrix.InsertRow(insertedRowIndex, row); - Assert.AreEqual(result.RowCount, matrix.ColumnCount + 1); - for (var i = 0; i < result.RowCount; i++) - { - for (var j = 0; j < result.ColumnCount; j++) - { - Assert.AreEqual(i == insertedRowIndex ? row[j] : Complex32.Zero, result[i, j]); - } - } - } - } - - /// - /// Insert null row throws ArgumentNullException. - /// - [Test] - public void InsertNullRowThrowsArgumentNullException() - { - var matrix = TestMatrices["Square3x3"]; - Assert.Throws(() => matrix.InsertRow(0, null)); - } - - /// - /// Insert a row with invalid row index throws ArgumentOutOfRangeException. - /// - [Test] - public void InsertRowWithInvalidRowIndexThrowsArgumentOutOfRangeException() - { - var matrix = CreateMatrix(3, 3); - var row = CreateVector(matrix.ColumnCount); - Assert.Throws(() => matrix.InsertRow(-1, row)); - Assert.Throws(() => matrix.InsertRow(5, row)); - } - - /// - /// Insert a row with invalid number of elements throws ArgumentException. - /// - [Test] - public void InsertRowWithInvalidNumberOfElementsThrowsArgumentException() - { - var matrix = CreateMatrix(3, 3); - var row = CreateVector(matrix.ColumnCount + 1); - Assert.Throws(() => matrix.InsertRow(0, row)); - } - /// /// Can convert a matrix to a multidimensional array. /// @@ -785,34 +583,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32 Assert.IsFalse(matrix.IsSymmetric); } - /// - /// Can get a sub-matrix. - /// - [Test] - public virtual void CanGetASubMatrix() - { - var matrix = CreateMatrix(10, 10); - for (var row = 0; row < matrix.RowCount; row++) - { - for (var column = 0; column < matrix.ColumnCount; column++) - { - matrix[row, column] = 1.0f; - } - } - - var submatrix = matrix.SubMatrix(8, 2, 0, 2); - Assert.AreEqual(2, submatrix.RowCount); - Assert.AreEqual(2, submatrix.ColumnCount); - - for (var row = 0; row < submatrix.RowCount; row++) - { - for (var column = 0; column < submatrix.ColumnCount; column++) - { - Assert.AreEqual(Complex32.One, submatrix[row, column]); - } - } - } - /// /// Test whether we can create a matrix from a list of column vectors. /// diff --git a/src/UnitTests/LinearAlgebraTests/Double/DiagonalMatrixTests.cs b/src/UnitTests/LinearAlgebraTests/Double/DiagonalMatrixTests.cs index 7e6f1f2d..a00a7c02 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/DiagonalMatrixTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/DiagonalMatrixTests.cs @@ -320,30 +320,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double } } - /// - /// Can set a submatrix. - /// - /// The row to start copying to. - /// The number of rows to copy. - /// The column to start copying to. - /// The number of columns to copy. - public override void CanSetSubMatrix(int rowStart, int rowLength, int colStart, int colLength) - { - try - { - // Pass all invoke to base - base.CanSetSubMatrix(rowStart, rowLength, colStart, colLength); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - /// /// Can compute Frobenius norm. /// @@ -516,44 +492,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double Assert.IsTrue(matrix.IsSymmetric); } - /// - /// Can get a sub-matrix. - /// - [Test] - public override void CanGetASubMatrix() - { - var matrix = CreateMatrix(10, 10); - for (var row = 0; row < matrix.RowCount; row++) - { - for (var column = 0; column < matrix.ColumnCount; column++) - { - if (row == column) - { - matrix[row, column] = 1.0; - } - } - } - - var submatrix = matrix.SubMatrix(8, 2, 0, 2); - Assert.AreEqual(2, submatrix.RowCount); - Assert.AreEqual(2, submatrix.ColumnCount); - - for (var row = 0; row < submatrix.RowCount; row++) - { - for (var column = 0; column < submatrix.ColumnCount; column++) - { - if (row == column) - { - Assert.AreEqual(1.0, submatrix[row, column]); - } - else - { - Assert.AreEqual(0.0, submatrix[row, column]); - } - } - } - } - [Test] public void CanGetSubMatrix_Issue35() { diff --git a/src/UnitTests/LinearAlgebraTests/Double/MatrixStructureTheory.cs b/src/UnitTests/LinearAlgebraTests/Double/MatrixStructureTheory.cs index 39bda709..457312d8 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/MatrixStructureTheory.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/MatrixStructureTheory.cs @@ -1,4 +1,8 @@ -namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double +using System.Linq; +using MathNet.Numerics.Distributions; +using MathNet.Numerics.Random; + +namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double { using LinearAlgebra.Double; using LinearAlgebra.Generic; @@ -36,6 +40,12 @@ return new DenseMatrix(rows, columns); } + protected override Matrix CreateDense(int rows, int columns, int seed) + { + var dist = new Normal {RandomSource = new MersenneTwister(seed)}; + return new DenseMatrix(rows, columns, dist.Samples().Take(rows*columns).ToArray()); + } + protected override Matrix CreateSparse(int rows, int columns) { return new SparseMatrix(rows, columns); @@ -46,6 +56,12 @@ return new DenseVector(size); } + protected override Vector CreateVector(int size, int seed) + { + var dist = new Normal {RandomSource = new MersenneTwister(seed)}; + return new DenseVector(dist.Samples().Take(size).ToArray()); + } + protected override double Zero { get { return 0d; } diff --git a/src/UnitTests/LinearAlgebraTests/Double/MatrixTests.cs b/src/UnitTests/LinearAlgebraTests/Double/MatrixTests.cs index d01d8336..2ae08413 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/MatrixTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/MatrixTests.cs @@ -61,208 +61,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double } } - /// - /// Can insert a column. - /// - [Test] - public void CanInsertColumn() - { - var matrix = CreateMatrix(3, 3); - var column = CreateVector(matrix.RowCount); - for (var i = 0; i < column.Count; i++) - { - column[i] = i; - } - - for (var k = 0; k < matrix.ColumnCount + 1; k++) - { - var result = matrix.InsertColumn(k, column); - Assert.AreEqual(result.ColumnCount, matrix.ColumnCount + 1); - for (var col = 0; col < result.ColumnCount; col++) - { - for (var row = 0; row < result.RowCount; row++) - { - Assert.AreEqual(col == k ? row : 0, result[row, col]); - } - } - } - } - - /// - /// Insert null column throws ArgumentNullException. - /// - [Test] - public void InsertNullColumnThrowsArgumentNullException() - { - var matrix = TestMatrices["Square3x3"]; - Assert.Throws(() => matrix.InsertColumn(0, null)); - } - - /// - /// Insert a column with invalid column index throws ArgumentOutOfRangeException. - /// - [Test] - public void InsertColumnWithInvalidColumnIndexThrowsArgumentOutOfRangeException() - { - var matrix = CreateMatrix(3, 3); - var column = CreateVector(matrix.RowCount); - Assert.Throws(() => matrix.InsertColumn(-1, column)); - Assert.Throws(() => matrix.InsertColumn(5, column)); - } - - /// - /// Insert a column with invalid number of elements throws ArgumentException. - /// - [Test] - public void InsertColumnWithUnequalNumberOfElementsThrowsArgumentException() - { - var matrix = CreateMatrix(3, 3); - var column = CreateVector(matrix.RowCount + 1); - Assert.Throws(() => matrix.InsertColumn(0, column)); - } - - /// - /// Can set a submatrix. - /// - /// The row to start copying to. - /// The number of rows to copy. - /// The column to start copying to. - /// The number of columns to copy. - [TestCase(0, 2, 0, 2)] - [TestCase(1, 1, 1, 1)] - public virtual void CanSetSubMatrix(int rowStart, int rowLength, int colStart, int colLength) - { - foreach (var matrix in TestMatrices.Values) - { - var subMatrix = matrix.SubMatrix(0, 2, 0, 2); - subMatrix[0, 0] = 10.0; - subMatrix[0, 1] = -1.0; - subMatrix[1, 0] = 3.0; - subMatrix[1, 1] = 4.0; - matrix.SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix); - - for (int i = rowStart, ii = 0; i < rowLength; i++, ii++) - { - for (int j = colStart, jj = 0; j < colLength; j++, jj++) - { - Assert.AreEqual(matrix[i, j], subMatrix[ii, jj]); - } - } - } - } - - /// - /// Set submatrix with invalid ranges throws ArgumentOutOfRangeException. - /// - /// The row to start copying to. - /// The number of rows to copy. - /// The column to start copying to. - /// The number of columns to copy. - [TestCase(0, 4, 0, 2)] - [TestCase(0, 2, 0, 4)] - [TestCase(4, 2, 0, 2)] - [TestCase(0, 2, 4, 2)] - [TestCase(-1, 2, 0, 2)] - [TestCase(0, 2, -1, 2)] - public virtual void SetSubMatrixWithInvalidRangesThrowsArgumentOutOfRangeException(int rowStart, int rowLength, int colStart, int colLength) - { - var subMatrix = TestMatrices["Square3x3"].SubMatrix(0, 2, 0, 2); - subMatrix[0, 0] = 10.0; - subMatrix[0, 1] = -1.0; - subMatrix[1, 0] = 3.0; - subMatrix[1, 1] = 4.0; - Assert.Throws(() => TestMatrices["Square3x3"].SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix)); - } - - /// - /// Set submatrix with invalid length throws ArgumentOutOfRangeException. - /// - /// The row to start copying to. - /// The number of rows to copy. - /// The column to start copying to. - /// The number of columns to copy. - [TestCase(0, -1, 0, 2)] - [TestCase(0, 2, 0, -1)] - public virtual void SetSubMatrixWithInvalidLengthsThrowsArgumentException(int rowStart, int rowLength, int colStart, int colLength) - { - var subMatrix = TestMatrices["Square3x3"].SubMatrix(0, 2, 0, 2); - subMatrix[0, 0] = 10.0; - subMatrix[0, 1] = -1.0; - subMatrix[1, 0] = 3.0; - subMatrix[1, 1] = 4.0; - Assert.Throws(() => TestMatrices["Square3x3"].SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix)); - } - - /// - /// Set a submatrix with null submatrix throws ArgumentNullException. - /// - [Test] - public void SetSubMatrixWithNullSubMatrixThrowsArgumentNullException() - { - Matrix subMatrix = null; - Assert.Throws(() => TestMatrices["Square3x3"].SetSubMatrix(0, 2, 0, 2, subMatrix)); - } - - /// - /// Can insert a row. - /// - [Test] - public void CanInsertRow() - { - var matrix = CreateMatrix(3, 3); - var row = CreateVector(matrix.ColumnCount); - for (var i = 0; i < row.Count; i++) - { - row[i] = i; - } - - for (var insertedRowIndex = 0; insertedRowIndex < matrix.RowCount + 1; insertedRowIndex++) - { - var result = matrix.InsertRow(insertedRowIndex, row); - Assert.AreEqual(result.RowCount, matrix.ColumnCount + 1); - for (var i = 0; i < result.RowCount; i++) - { - for (var j = 0; j < result.ColumnCount; j++) - { - Assert.AreEqual(i == insertedRowIndex ? row[j] : 0, result[i, j]); - } - } - } - } - - /// - /// Insert null row throws ArgumentNullException. - /// - [Test] - public void InsertNullRowThrowsArgumentNullException() - { - var matrix = TestMatrices["Square3x3"]; - Assert.Throws(() => matrix.InsertRow(0, null)); - } - - /// - /// Insert a row with invalid row index throws ArgumentOutOfRangeException. - /// - [Test] - public void InsertRowWithInvalidRowIndexThrowsArgumentOutOfRangeException() - { - var matrix = CreateMatrix(3, 3); - var row = CreateVector(matrix.ColumnCount); - Assert.Throws(() => matrix.InsertRow(-1, row)); - Assert.Throws(() => matrix.InsertRow(5, row)); - } - - /// - /// Insert a row with invalid number of elements throws ArgumentException. - /// - [Test] - public void InsertRowWithInvalidNumberOfElementsThrowsArgumentException() - { - var matrix = CreateMatrix(3, 3); - var row = CreateVector(matrix.ColumnCount + 1); - Assert.Throws(() => matrix.InsertRow(0, row)); - } - /// /// Can convert a matrix to a multidimensional array. /// @@ -758,34 +556,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double Assert.IsFalse(matrix.IsSymmetric); } - /// - /// Can get a sub-matrix. - /// - [Test] - public virtual void CanGetASubMatrix() - { - var matrix = CreateMatrix(10, 10); - for (var row = 0; row < matrix.RowCount; row++) - { - for (var column = 0; column < matrix.ColumnCount; column++) - { - matrix[row, column] = 1.0; - } - } - - var submatrix = matrix.SubMatrix(8, 2, 0, 2); - Assert.AreEqual(2, submatrix.RowCount); - Assert.AreEqual(2, submatrix.ColumnCount); - - for (var row = 0; row < submatrix.RowCount; row++) - { - for (var column = 0; column < submatrix.ColumnCount; column++) - { - Assert.AreEqual(1.0, submatrix[row, column]); - } - } - } - /// /// Test whether we can create a matrix from a list of column vectors. /// diff --git a/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.Access.cs b/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.Access.cs new file mode 100644 index 00000000..ffbd1ebf --- /dev/null +++ b/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.Access.cs @@ -0,0 +1,634 @@ +using System; +using MathNet.Numerics.LinearAlgebra.Generic; +using NUnit.Framework; + +namespace MathNet.Numerics.UnitTests.LinearAlgebraTests +{ + partial class MatrixStructureTheory + { + [Theory, Timeout(200)] + public void CanGetFieldsByIndex(Matrix matrix) + { + 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(() => matrix[-1, 1], Throws.InstanceOf()); + Assert.That(() => matrix[1, -1], Throws.InstanceOf()); + Assert.That(() => matrix[0, matrix.ColumnCount], Throws.InstanceOf()); + } + + [Theory, Timeout(200)] + public void CanGetRow(Matrix matrix) + { + // First Row + var firstrow = matrix.Row(0); + Assert.That(firstrow.Count, Is.EqualTo(matrix.ColumnCount)); + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.AreEqual(matrix[0, j], firstrow[j]); + } + + // Last Row + var lastrow = matrix.Row(matrix.RowCount - 1); + Assert.That(lastrow.Count, Is.EqualTo(matrix.ColumnCount)); + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.AreEqual(matrix[matrix.RowCount - 1, j], lastrow[j]); + } + + // Invalid Rows + Assert.That(() => matrix.Row(-1), Throws.InstanceOf()); + Assert.That(() => matrix.Row(matrix.RowCount), Throws.InstanceOf()); + } + + [Theory, Timeout(200)] + public void CanGetRowIntoResult(Matrix matrix) + { + var row = CreateVector(matrix.ColumnCount); + matrix.Row(0, row); + + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.AreEqual(matrix[0, j], row[j]); + } + + Assert.That(() => matrix.Row(0, null), Throws.InstanceOf()); + Assert.That(() => matrix.Row(-1, row), Throws.InstanceOf()); + Assert.That(() => matrix.Row(matrix.RowCount, row), Throws.InstanceOf()); + } + + [Theory, Timeout(200)] + public virtual void CanGetRowWithRange(Matrix matrix) + { + // First Row, Columns 0..1 + var firstrow = matrix.Row(0, 0, 2); + Assert.That(firstrow.Count, Is.EqualTo(2)); + for (var j = 0; j < 2; j++) + { + Assert.AreEqual(matrix[0, j], firstrow[j]); + } + + // Second Row, Full Columns + var secondrow = matrix.Row(1, 0, matrix.ColumnCount); + Assert.That(secondrow.Count, Is.EqualTo(matrix.ColumnCount)); + for (var j = 0; j < matrix.ColumnCount; j++) + { + Assert.AreEqual(matrix[1, j], secondrow[j]); + } + + // Last Row, Columns 1 + var lastrow = matrix.Row(matrix.RowCount - 1, 1, 1); + Assert.That(lastrow.Count, Is.EqualTo(1)); + for (var j = 0; j < 1; j++) + { + Assert.AreEqual(matrix[matrix.RowCount - 1, j + 1], lastrow[j]); + } + + // 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()); + } + + [Theory, Timeout(200)] + public void CanGetRowWithRangeIntoResult(Matrix matrix) + { + var row = CreateVector(matrix.ColumnCount - 1); + matrix.Row(0, 1, matrix.ColumnCount - 1, row); + + for (var j = 0; j < matrix.ColumnCount - 1; j++) + { + Assert.AreEqual(matrix[0, j + 1], row[j]); + } + + Assert.That(() => matrix.Row(0, 0, matrix.ColumnCount - 1, null), Throws.InstanceOf()); + Assert.That(() => matrix.Row(-1, 0, matrix.ColumnCount - 1, row), Throws.InstanceOf()); + Assert.That(() => matrix.Row(matrix.RowCount, 0, matrix.ColumnCount - 1, row), Throws.InstanceOf()); + Assert.That(() => matrix.Row(0, 0, matrix.ColumnCount, row), Throws.InstanceOf()); + } + + [Theory, Timeout(200)] + public void CanGetColumn(Matrix matrix) + { + // First Column + var firstcol = matrix.Column(0); + Assert.That(firstcol.Count, Is.EqualTo(matrix.RowCount)); + for (var i = 0; i < matrix.RowCount; i++) + { + Assert.AreEqual(matrix[i, 0], firstcol[i]); + } + + // Last Column + var lastcol = matrix.Column(matrix.ColumnCount - 1); + Assert.That(lastcol.Count, Is.EqualTo(matrix.RowCount)); + for (var i = 0; i < matrix.RowCount; i++) + { + Assert.AreEqual(matrix[i, matrix.ColumnCount - 1], lastcol[i]); + } + + // Invalid Columns + Assert.That(() => matrix.Column(-1), Throws.InstanceOf()); + Assert.That(() => matrix.Column(matrix.ColumnCount), Throws.InstanceOf()); + } + + [Theory, Timeout(200)] + public void CanGetColumnIntoResult(Matrix matrix) + { + var col = CreateVector(matrix.RowCount); + matrix.Column(0, col); + + for (var i = 0; i < matrix.RowCount; i++) + { + Assert.AreEqual(matrix[i, 0], col[i]); + } + + Assert.That(() => matrix.Column(0, null), Throws.InstanceOf()); + Assert.That(() => matrix.Column(-1, col), Throws.InstanceOf()); + Assert.That(() => matrix.Column(matrix.ColumnCount, col), Throws.InstanceOf()); + } + + [Theory, Timeout(200)] + public virtual void CanGetColumnWithRange(Matrix matrix) + { + // First Column, Rows 0..1 + var firstcol = matrix.Column(0, 0, 2); + Assert.That(firstcol.Count, Is.EqualTo(2)); + for (var i = 0; i < 2; i++) + { + Assert.AreEqual(matrix[i, 0], firstcol[i]); + } + + // Second Column, Full Rows + var secondcol = matrix.Column(1, 0, matrix.RowCount); + Assert.That(secondcol.Count, Is.EqualTo(matrix.RowCount)); + for (var i = 0; i < matrix.RowCount; i++) + { + Assert.AreEqual(matrix[i, 1], secondcol[i]); + } + + // Last Column, Rows 1 + var lastcol = matrix.Column(matrix.ColumnCount - 1, 1, 1); + Assert.That(lastcol.Count, Is.EqualTo(1)); + for (var i = 0; i < 1; i++) + { + Assert.AreEqual(matrix[i + 1, matrix.ColumnCount - 1], lastcol[i]); + } + + // 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()); + } + + [Theory, Timeout(200)] + public void CanGetColumnWithRangeIntoResult(Matrix matrix) + { + var col = CreateVector(matrix.RowCount - 1); + matrix.Column(0, 1, matrix.RowCount - 1, col); + + for (var i = 0; i < matrix.RowCount - 1; i++) + { + Assert.AreEqual(matrix[i + 1, 0], col[i]); + } + + Assert.That(() => matrix.Column(0, 0, matrix.RowCount - 1, null), Throws.InstanceOf()); + Assert.That(() => matrix.Column(-1, 0, matrix.RowCount - 1, col), Throws.InstanceOf()); + 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); + } + + [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); + } + + [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); + } + + [Theory, Timeout(200)] + public void CanGetSubmatrix(Matrix matrix) + { + // Top Left Corner 2x2 + var topleft = matrix.SubMatrix(0, 2, 0, 2); + Assert.That(topleft.RowCount, Is.EqualTo(2)); + Assert.That(topleft.ColumnCount, Is.EqualTo(2)); + for (var i = 0; i < 2; i++) + { + for (var j = 0; j < 2; j++) + { + Assert.That(topleft[i,j], Is.EqualTo(matrix[i,j])); + } + } + + // Bottom Right Cornet 1x2 + var bottomright = matrix.SubMatrix(matrix.RowCount - 1, 1, matrix.ColumnCount - 2, 2); + Assert.That(bottomright.RowCount, Is.EqualTo(1)); + Assert.That(bottomright.ColumnCount, Is.EqualTo(2)); + for (var i = 0; i < 1; i++) + { + for (var j = 0; j < 2; j++) + { + Assert.That(bottomright[i, j], Is.EqualTo(matrix[matrix.RowCount - 1 + i, matrix.ColumnCount - 2 + j])); + } + } + + // Left Field 1x1 + var field = matrix.SubMatrix(1, 1, 0, 1); + Assert.That(field.RowCount, Is.EqualTo(1)); + Assert.That(field.ColumnCount, Is.EqualTo(1)); + Assert.That(field[0, 0], Is.EqualTo(matrix[1, 0]), "{0}->{1}", matrix.GetType().FullName, field.GetType().FullName); + + // Invalid + Assert.That(() => matrix.SubMatrix(-1, 1, 0, 1), Throws.InstanceOf()); + Assert.That(() => matrix.SubMatrix(matrix.RowCount, 1, 0, 1), Throws.InstanceOf()); + Assert.That(() => matrix.SubMatrix(0, 0, 0, 1), Throws.InstanceOf()); + Assert.That(() => matrix.SubMatrix(0, 1, -1, 1), Throws.InstanceOf()); + Assert.That(() => matrix.SubMatrix(0, 1, matrix.ColumnCount, 1), Throws.InstanceOf()); + Assert.That(() => matrix.SubMatrix(0, 1, 0, 0), Throws.InstanceOf()); + } + + [Theory, Timeout(200)] + public void CanSetSubmatrix(Matrix matrix) + { + // Top Left Corner 2x2 + var topleft = CreateDense(2, 2); + var m = matrix.Clone(); + m.SetSubMatrix(0, 2, 0, 2, topleft); + for (var i = 0; i < m.RowCount; i++) + { + for (var j = 0; j < m.ColumnCount; j++) + { + Assert.That(m[i, j], Is.EqualTo(i < 2 && j < 2 ? topleft[i, j] : matrix[i, j])); + } + } + + // Bottom Right Cornet 1x2 + var bottomright = CreateDense(1, 2); + m = matrix.Clone(); + m.SetSubMatrix(matrix.RowCount - 1, 1, matrix.ColumnCount - 2, 2, bottomright); + for (var i = 0; i < m.RowCount; i++) + { + for (var j = 0; j < m.ColumnCount; j++) + { + Assert.That(m[i, j], Is.EqualTo(i >= matrix.RowCount - 1 && j >= matrix.ColumnCount - 2 ? bottomright[i - matrix.RowCount + 1, j - matrix.ColumnCount + 2] : matrix[i, j])); + } + } + + // Invalid + m = matrix.Clone(); + Assert.That(() => m.SetSubMatrix(0, 1, 0, 1, default(Matrix)), Throws.InstanceOf()); + Assert.That(() => m.SetSubMatrix(-1, 1, 0, 1, CreateDense(1,1)), Throws.InstanceOf()); + Assert.That(() => m.SetSubMatrix(matrix.RowCount, 1, 0, 1, CreateDense(1, 1)), Throws.InstanceOf()); + Assert.That(() => m.SetSubMatrix(0, 0, 0, 1, CreateDense(1, 1)), Throws.InstanceOf()); + Assert.That(() => m.SetSubMatrix(0, 1, -1, 1, CreateDense(1, 1)), Throws.InstanceOf()); + Assert.That(() => m.SetSubMatrix(0, 1, matrix.ColumnCount, 1, CreateDense(1, 1)), Throws.InstanceOf()); + Assert.That(() => m.SetSubMatrix(0, 1, 0, 0, CreateDense(1, 1)), Throws.InstanceOf()); + + // Usually invalid, but not for SetSubMatrix (since size is explicitly provided) + Assert.That(() => m.SetSubMatrix(0, 1, 0, 1, CreateDense(1, 2)), Throws.Nothing); + Assert.That(() => m.SetSubMatrix(0, 1, 0, 1, CreateDense(2, 1)), Throws.Nothing); + } + } +} diff --git a/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.Reform.cs b/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.Reform.cs new file mode 100644 index 00000000..5504d2e3 --- /dev/null +++ b/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.Reform.cs @@ -0,0 +1,81 @@ +using System; +using MathNet.Numerics.LinearAlgebra.Generic; +using NUnit.Framework; + +namespace MathNet.Numerics.UnitTests.LinearAlgebraTests +{ + partial class MatrixStructureTheory + { + [Theory, Timeout(200)] + public void CanInsertRow(Matrix matrix) + { + var row = CreateVector(matrix.ColumnCount, 0); + for (var position = 0; position < matrix.RowCount + 1; position++) + { + var result = matrix.InsertRow(position, row); + Assert.That(result.RowCount, Is.EqualTo(matrix.RowCount + 1)); + for (int ir = 0, im = 0; ir < result.RowCount; ir++, im++) + { + if (ir == position) + { + im--; + for (var j = 0; j < result.ColumnCount; j++) + { + Assert.That(result[ir, j], Is.EqualTo(row[j]), "A({0},{1}) for {2}", ir, j, matrix.GetType().FullName); + } + } + else + { + for (var j = 0; j < result.ColumnCount; j++) + { + Assert.That(result[ir, j], Is.EqualTo(matrix[im, j]), "A({0},{1}) for {2}", ir, j, matrix.GetType().FullName); + } + } + } + } + + // Invalid + Assert.That(() => matrix.InsertRow(0, default(Vector)), Throws.InstanceOf()); + Assert.That(() => matrix.InsertRow(-1, CreateVector(matrix.ColumnCount)), Throws.InstanceOf()); + Assert.That(() => matrix.InsertRow(matrix.RowCount + 1, CreateVector(matrix.ColumnCount)), Throws.InstanceOf()); + Assert.That(() => matrix.InsertRow(0, CreateVector(matrix.ColumnCount - 1)), Throws.ArgumentException); + Assert.That(() => matrix.InsertRow(0, CreateVector(matrix.ColumnCount + 1)), Throws.ArgumentException); + } + + [Theory, Timeout(200)] + public void CanInsertColumn(Matrix matrix) + { + var column = CreateVector(matrix.RowCount, 0); + for (var position = 0; position < matrix.ColumnCount + 1; position++) + { + var result = matrix.InsertColumn(position, column); + Assert.That(result.ColumnCount, Is.EqualTo(matrix.ColumnCount + 1)); + for (int jr = 0, jm = 0; jr < result.ColumnCount; jr++, jm++) + { + if (jr == position) + { + jm--; + for (var i = 0; i < result.RowCount; i++) + { + Assert.That(result[i, jr], Is.EqualTo(column[i])); + } + } + else + { + for (var i = 0; i < result.RowCount; i++) + { + Assert.That(result[i, jr], Is.EqualTo(matrix[i, jm])); + } + } + } + } + + // Invalid + Assert.That(() => matrix.InsertColumn(0, default(Vector)), Throws.InstanceOf()); + Assert.That(() => matrix.InsertColumn(-1, CreateVector(matrix.RowCount)), Throws.InstanceOf()); + Assert.That(() => matrix.InsertColumn(matrix.ColumnCount + 1, CreateVector(matrix.RowCount)), Throws.InstanceOf()); + Assert.That(() => matrix.InsertColumn(0, CreateVector(matrix.RowCount - 1)), Throws.ArgumentException); + Assert.That(() => matrix.InsertColumn(0, CreateVector(matrix.RowCount + 1)), Throws.ArgumentException); + } + } +} diff --git a/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs b/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs index d82ab2bf..ec0bda76 100644 --- a/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs +++ b/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs @@ -5,12 +5,14 @@ using NUnit.Framework; [TestFixture] - public abstract class MatrixStructureTheory + public abstract partial class MatrixStructureTheory where T : struct, IEquatable, IFormattable { protected abstract Matrix CreateDense(int rows, int columns); + protected abstract Matrix CreateDense(int rows, int columns, int seed); protected abstract Matrix CreateSparse(int rows, int columns); protected abstract Vector CreateVector(int size); + protected abstract Vector CreateVector(int size, int seed); protected abstract T Zero { get; } [Theory, Timeout(200)] @@ -113,558 +115,5 @@ cleared.Clear(); Assert.That(cleared, Is.EqualTo(matrix.CreateMatrix(matrix.RowCount, matrix.ColumnCount))); } - - [Theory, Timeout(200)] - public void CanGetFieldsByIndex(Matrix matrix) - { - 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(() => 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) - { - // First Row - var firstrow = matrix.Row(0); - Assert.That(firstrow.Count, Is.EqualTo(matrix.ColumnCount)); - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(matrix[0, j], firstrow[j]); - } - - // Last Row - var lastrow = matrix.Row(matrix.RowCount - 1); - Assert.That(lastrow.Count, Is.EqualTo(matrix.ColumnCount)); - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(matrix[matrix.RowCount - 1, j], lastrow[j]); - } - - // Invalid Rows - Assert.That(() => matrix.Row(-1), Throws.InstanceOf()); - Assert.That(() => matrix.Row(matrix.RowCount), Throws.InstanceOf()); - } - - [Theory, Timeout(200)] - public void CanGetRowIntoResult(Matrix matrix) - { - var row = CreateVector(matrix.ColumnCount); - matrix.Row(0, row); - - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(matrix[0, j], row[j]); - } - - Assert.That(() => matrix.Row(0, null), Throws.InstanceOf()); - Assert.That(() => matrix.Row(-1, row), Throws.InstanceOf()); - Assert.That(() => matrix.Row(matrix.RowCount, row), Throws.InstanceOf()); - } - - [Theory, Timeout(200)] - public virtual void CanGetRowWithRange(Matrix matrix) - { - // First Row, Columns 0..1 - var firstrow = matrix.Row(0, 0, 2); - Assert.That(firstrow.Count, Is.EqualTo(2)); - for (var j = 0; j < 2; j++) - { - Assert.AreEqual(matrix[0, j], firstrow[j]); - } - - // Second Row, Full Columns - var secondrow = matrix.Row(1, 0, matrix.ColumnCount); - Assert.That(secondrow.Count, Is.EqualTo(matrix.ColumnCount)); - for (var j = 0; j < matrix.ColumnCount; j++) - { - Assert.AreEqual(matrix[1, j], secondrow[j]); - } - - // Last Row, Columns 1 - var lastrow = matrix.Row(matrix.RowCount - 1, 1, 1); - Assert.That(lastrow.Count, Is.EqualTo(1)); - for (var j = 0; j < 1; j++) - { - Assert.AreEqual(matrix[matrix.RowCount - 1, j + 1], lastrow[j]); - } - - // 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()); - } - - [Theory, Timeout(200)] - public void CanGetRowWithRangeIntoResult(Matrix matrix) - { - var row = CreateVector(matrix.ColumnCount - 1); - matrix.Row(0, 1, matrix.ColumnCount - 1, row); - - for (var j = 0; j < matrix.ColumnCount - 1; j++) - { - Assert.AreEqual(matrix[0, j + 1], row[j]); - } - - Assert.That(() => matrix.Row(0, 0, matrix.ColumnCount - 1, null), Throws.InstanceOf()); - Assert.That(() => matrix.Row(-1, 0, matrix.ColumnCount - 1, row), Throws.InstanceOf()); - Assert.That(() => matrix.Row(matrix.RowCount, 0, matrix.ColumnCount - 1, row), Throws.InstanceOf()); - Assert.That(() => matrix.Row(0, 0, matrix.ColumnCount, row), Throws.InstanceOf()); - } - - [Theory, Timeout(200)] - public void CanGetColumn(Matrix matrix) - { - // First Column - var firstcol = matrix.Column(0); - Assert.That(firstcol.Count, Is.EqualTo(matrix.RowCount)); - for (var i = 0; i < matrix.RowCount; i++) - { - Assert.AreEqual(matrix[i, 0], firstcol[i]); - } - - // Last Column - var lastcol = matrix.Column(matrix.ColumnCount - 1); - Assert.That(lastcol.Count, Is.EqualTo(matrix.RowCount)); - for (var i = 0; i < matrix.RowCount; i++) - { - Assert.AreEqual(matrix[i, matrix.ColumnCount - 1], lastcol[i]); - } - - // Invalid Columns - Assert.That(() => matrix.Column(-1), Throws.InstanceOf()); - Assert.That(() => matrix.Column(matrix.ColumnCount), Throws.InstanceOf()); - } - - [Theory, Timeout(200)] - public void CanGetColumnIntoResult(Matrix matrix) - { - var col = CreateVector(matrix.RowCount); - matrix.Column(0, col); - - for (var i = 0; i < matrix.RowCount; i++) - { - Assert.AreEqual(matrix[i, 0], col[i]); - } - - Assert.That(() => matrix.Column(0, null), Throws.InstanceOf()); - Assert.That(() => matrix.Column(-1, col), Throws.InstanceOf()); - Assert.That(() => matrix.Column(matrix.ColumnCount, col), Throws.InstanceOf()); - } - - [Theory, Timeout(200)] - public virtual void CanGetColumnWithRange(Matrix matrix) - { - // First Column, Rows 0..1 - var firstcol = matrix.Column(0, 0, 2); - Assert.That(firstcol.Count, Is.EqualTo(2)); - for (var i = 0; i < 2; i++) - { - Assert.AreEqual(matrix[i, 0], firstcol[i]); - } - - // Second Column, Full Rows - var secondcol = matrix.Column(1, 0, matrix.RowCount); - Assert.That(secondcol.Count, Is.EqualTo(matrix.RowCount)); - for (var i = 0; i < matrix.RowCount; i++) - { - Assert.AreEqual(matrix[i, 1], secondcol[i]); - } - - // Last Column, Rows 1 - var lastcol = matrix.Column(matrix.ColumnCount - 1, 1, 1); - Assert.That(lastcol.Count, Is.EqualTo(1)); - for (var i = 0; i < 1; i++) - { - Assert.AreEqual(matrix[i + 1, matrix.ColumnCount - 1], lastcol[i]); - } - - // 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()); - } - - [Theory, Timeout(200)] - public void CanGetColumnWithRangeIntoResult(Matrix matrix) - { - var col = CreateVector(matrix.RowCount - 1); - matrix.Column(0, 1, matrix.RowCount - 1, col); - - for (var i = 0; i < matrix.RowCount - 1; i++) - { - Assert.AreEqual(matrix[i + 1, 0], col[i]); - } - - Assert.That(() => matrix.Column(0, 0, matrix.RowCount - 1, null), Throws.InstanceOf()); - Assert.That(() => matrix.Column(-1, 0, matrix.RowCount - 1, col), Throws.InstanceOf()); - 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 71046b50..94c9d1ae 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/DiagonalMatrixTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/DiagonalMatrixTests.cs @@ -319,30 +319,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single } } - /// - /// Can set a submatrix. - /// - /// The row to start copying to. - /// The number of rows to copy. - /// The column to start copying to. - /// The number of columns to copy. - public override void CanSetSubMatrix(int rowStart, int rowLength, int colStart, int colLength) - { - try - { - // Pass all invoke to base - base.CanSetSubMatrix(rowStart, rowLength, colStart, colLength); - } - catch (AggregateException ex) - { - // Supress only IndexOutOfRangeException exceptions due to Diagonal matrix nature - if (ex.InnerExceptions.Any(innerException => !(innerException is IndexOutOfRangeException))) - { - throw; - } - } - } - /// /// Can compute Frobenius norm. /// @@ -515,43 +491,5 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single var matrix = TestMatrices["Square3x3"]; Assert.IsTrue(matrix.IsSymmetric); } - - /// - /// Can get a sub-matrix. - /// - [Test] - public override void CanGetASubMatrix() - { - var matrix = CreateMatrix(10, 10); - for (var row = 0; row < matrix.RowCount; row++) - { - for (var column = 0; column < matrix.ColumnCount; column++) - { - if (row == column) - { - matrix[row, column] = 1.0f; - } - } - } - - var submatrix = matrix.SubMatrix(8, 2, 0, 2); - Assert.AreEqual(2, submatrix.RowCount); - Assert.AreEqual(2, submatrix.ColumnCount); - - for (var row = 0; row < submatrix.RowCount; row++) - { - for (var column = 0; column < submatrix.ColumnCount; column++) - { - if (row == column) - { - Assert.AreEqual(1.0f, submatrix[row, column]); - } - else - { - Assert.AreEqual(0.0f, submatrix[row, column]); - } - } - } - } } } diff --git a/src/UnitTests/LinearAlgebraTests/Single/MatrixStructureTheory.cs b/src/UnitTests/LinearAlgebraTests/Single/MatrixStructureTheory.cs index 4cc74623..e3a54842 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/MatrixStructureTheory.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/MatrixStructureTheory.cs @@ -1,4 +1,8 @@ -namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single +using System.Linq; +using MathNet.Numerics.Distributions; +using MathNet.Numerics.Random; + +namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single { using LinearAlgebra.Single; using LinearAlgebra.Generic; @@ -36,6 +40,12 @@ return new DenseMatrix(rows, columns); } + protected override Matrix CreateDense(int rows, int columns, int seed) + { + var dist = new Normal {RandomSource = new MersenneTwister(seed)}; + return new DenseMatrix(rows, columns, dist.Samples().Select(d => (float) d).Take(rows*columns).ToArray()); + } + protected override Matrix CreateSparse(int rows, int columns) { return new SparseMatrix(rows, columns); @@ -46,6 +56,12 @@ return new DenseVector(size); } + protected override Vector CreateVector(int size, int seed) + { + var dist = new Normal {RandomSource = new MersenneTwister(seed)}; + return new DenseVector(dist.Samples().Select(d => (float) d).Take(size).ToArray()); + } + protected override float Zero { get { return 0f; } diff --git a/src/UnitTests/LinearAlgebraTests/Single/MatrixTests.cs b/src/UnitTests/LinearAlgebraTests/Single/MatrixTests.cs index 4aae70cf..e940cf51 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/MatrixTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/MatrixTests.cs @@ -61,208 +61,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single } } - /// - /// Can insert a column. - /// - [Test] - public void CanInsertColumn() - { - var matrix = CreateMatrix(3, 3); - var column = CreateVector(matrix.RowCount); - for (var i = 0; i < column.Count; i++) - { - column[i] = i; - } - - for (var k = 0; k < matrix.ColumnCount + 1; k++) - { - var result = matrix.InsertColumn(k, column); - Assert.AreEqual(result.ColumnCount, matrix.ColumnCount + 1); - for (var col = 0; col < result.ColumnCount; col++) - { - for (var row = 0; row < result.RowCount; row++) - { - Assert.AreEqual(col == k ? row : 0, result[row, col]); - } - } - } - } - - /// - /// Insert null column throws ArgumentNullException. - /// - [Test] - public void InsertNullColumnThrowsArgumentNullException() - { - var matrix = TestMatrices["Square3x3"]; - Assert.Throws(() => matrix.InsertColumn(0, null)); - } - - /// - /// Insert a column with invalid column index throws ArgumentOutOfRangeException. - /// - [Test] - public void InsertColumnWithInvalidColumnIndexThrowsArgumentOutOfRangeException() - { - var matrix = CreateMatrix(3, 3); - var column = CreateVector(matrix.RowCount); - Assert.Throws(() => matrix.InsertColumn(-1, column)); - Assert.Throws(() => matrix.InsertColumn(5, column)); - } - - /// - /// Insert a column with invalid number of elements throws ArgumentException. - /// - [Test] - public void InsertColumnWithUnequalNumberOfElementsThrowsArgumentException() - { - var matrix = CreateMatrix(3, 3); - var column = CreateVector(matrix.RowCount + 1); - Assert.Throws(() => matrix.InsertColumn(0, column)); - } - - /// - /// Can set a submatrix. - /// - /// The row to start copying to. - /// The number of rows to copy. - /// The column to start copying to. - /// The number of columns to copy. - [TestCase(0, 2, 0, 2)] - [TestCase(1, 1, 1, 1)] - public virtual void CanSetSubMatrix(int rowStart, int rowLength, int colStart, int colLength) - { - foreach (var matrix in TestMatrices.Values) - { - var subMatrix = matrix.SubMatrix(0, 2, 0, 2); - subMatrix[0, 0] = 10.0f; - subMatrix[0, 1] = -1.0f; - subMatrix[1, 0] = 3.0f; - subMatrix[1, 1] = 4.0f; - matrix.SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix); - - for (int i = rowStart, ii = 0; i < rowLength; i++, ii++) - { - for (int j = colStart, jj = 0; j < colLength; j++, jj++) - { - Assert.AreEqual(matrix[i, j], subMatrix[ii, jj]); - } - } - } - } - - /// - /// Set submatrix with invalid ranges throws ArgumentOutOfRangeException. - /// - /// The row to start copying to. - /// The number of rows to copy. - /// The column to start copying to. - /// The number of columns to copy. - [TestCase(0, 4, 0, 2)] - [TestCase(0, 2, 0, 4)] - [TestCase(4, 2, 0, 2)] - [TestCase(0, 2, 4, 2)] - [TestCase(-1, 2, 0, 2)] - [TestCase(0, 2, -1, 2)] - public virtual void SetSubMatrixWithInvalidRangesThrowsArgumentOutOfRangeException(int rowStart, int rowLength, int colStart, int colLength) - { - var subMatrix = TestMatrices["Square3x3"].SubMatrix(0, 2, 0, 2); - subMatrix[0, 0] = 10.0f; - subMatrix[0, 1] = -1.0f; - subMatrix[1, 0] = 3.0f; - subMatrix[1, 1] = 4.0f; - Assert.Throws(() => TestMatrices["Square3x3"].SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix)); - } - - /// - /// Set submatrix with invalid length throws ArgumentOutOfRangeException. - /// - /// The row to start copying to. - /// The number of rows to copy. - /// The column to start copying to. - /// The number of columns to copy. - [TestCase(0, -1, 0, 2)] - [TestCase(0, 2, 0, -1)] - public virtual void SetSubMatrixWithInvalidLengthsThrowsArgumentException(int rowStart, int rowLength, int colStart, int colLength) - { - var subMatrix = TestMatrices["Square3x3"].SubMatrix(0, 2, 0, 2); - subMatrix[0, 0] = 10.0f; - subMatrix[0, 1] = -1.0f; - subMatrix[1, 0] = 3.0f; - subMatrix[1, 1] = 4.0f; - Assert.Throws(() => TestMatrices["Square3x3"].SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix)); - } - - /// - /// Set a submatrix with null submatrix throws ArgumentNullException. - /// - [Test] - public void SetSubMatrixWithNullSubMatrixThrowsArgumentNullException() - { - Matrix subMatrix = null; - Assert.Throws(() => TestMatrices["Square3x3"].SetSubMatrix(0, 2, 0, 2, subMatrix)); - } - - /// - /// Can insert a row. - /// - [Test] - public void CanInsertRow() - { - var matrix = CreateMatrix(3, 3); - var row = CreateVector(matrix.ColumnCount); - for (var i = 0; i < row.Count; i++) - { - row[i] = i; - } - - for (var insertedRowIndex = 0; insertedRowIndex < matrix.RowCount + 1; insertedRowIndex++) - { - var result = matrix.InsertRow(insertedRowIndex, row); - Assert.AreEqual(result.RowCount, matrix.ColumnCount + 1); - for (var i = 0; i < result.RowCount; i++) - { - for (var j = 0; j < result.ColumnCount; j++) - { - Assert.AreEqual(i == insertedRowIndex ? row[j] : 0, result[i, j]); - } - } - } - } - - /// - /// Insert null row throws ArgumentNullException. - /// - [Test] - public void InsertNullRowThrowsArgumentNullException() - { - var matrix = TestMatrices["Square3x3"]; - Assert.Throws(() => matrix.InsertRow(0, null)); - } - - /// - /// Insert a row with invalid row index throws ArgumentOutOfRangeException. - /// - [Test] - public void InsertRowWithInvalidRowIndexThrowsArgumentOutOfRangeException() - { - var matrix = CreateMatrix(3, 3); - var row = CreateVector(matrix.ColumnCount); - Assert.Throws(() => matrix.InsertRow(-1, row)); - Assert.Throws(() => matrix.InsertRow(5, row)); - } - - /// - /// Insert a row with invalid number of elements throws ArgumentException. - /// - [Test] - public void InsertRowWithInvalidNumberOfElementsThrowsArgumentException() - { - var matrix = CreateMatrix(3, 3); - var row = CreateVector(matrix.ColumnCount + 1); - Assert.Throws(() => matrix.InsertRow(0, row)); - } - /// /// Can convert a matrix to a multidimensional array. /// @@ -758,34 +556,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single Assert.IsFalse(matrix.IsSymmetric); } - /// - /// Can get a sub-matrix. - /// - [Test] - public virtual void CanGetASubMatrix() - { - var matrix = CreateMatrix(10, 10); - for (var row = 0; row < matrix.RowCount; row++) - { - for (var column = 0; column < matrix.ColumnCount; column++) - { - matrix[row, column] = 1.0f; - } - } - - var submatrix = matrix.SubMatrix(8, 2, 0, 2); - Assert.AreEqual(2, submatrix.RowCount); - Assert.AreEqual(2, submatrix.ColumnCount); - - for (var row = 0; row < submatrix.RowCount; row++) - { - for (var column = 0; column < submatrix.ColumnCount; column++) - { - Assert.AreEqual(1.0f, submatrix[row, column]); - } - } - } - /// /// Test whether we can create a matrix from a list of column vectors. /// diff --git a/src/UnitTests/UnitTests.csproj b/src/UnitTests/UnitTests.csproj index a5ddecd6..bd6934b7 100644 --- a/src/UnitTests/UnitTests.csproj +++ b/src/UnitTests/UnitTests.csproj @@ -576,7 +576,9 @@ Code + + Code