Browse Source

Tests: replace matrix structural tests with theory (part 5) - Submatrix, Insert; Fix DiagonalMatrix InsertRow

pull/47/head
Christoph Ruegg 14 years ago
parent
commit
bbb23e662e
  1. 2
      src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs
  2. 8
      src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs
  3. 6
      src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs
  4. 2
      src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs
  5. 8
      src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs
  6. 6
      src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs
  7. 2
      src/Numerics/LinearAlgebra/Double/DenseMatrix.cs
  8. 8
      src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs
  9. 6
      src/Numerics/LinearAlgebra/Double/SparseMatrix.cs
  10. 12
      src/Numerics/LinearAlgebra/Generic/Matrix.cs
  11. 2
      src/Numerics/LinearAlgebra/Single/DenseMatrix.cs
  12. 8
      src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs
  13. 6
      src/Numerics/LinearAlgebra/Single/SparseMatrix.cs
  14. 4
      src/Numerics/LinearAlgebra/Storage/MatrixStorage.Validation.cs
  15. 1
      src/Numerics/LinearAlgebra/Storage/MatrixStorage.cs
  16. 18
      src/Numerics/LinearAlgebra/Storage/SparseDiagonalMatrixStorage.cs
  17. 62
      src/UnitTests/LinearAlgebraTests/Complex/DiagonalMatrixTests.cs
  18. 26
      src/UnitTests/LinearAlgebraTests/Complex/MatrixStructureTheory.cs
  19. 230
      src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.cs
  20. 62
      src/UnitTests/LinearAlgebraTests/Complex32/DiagonalMatrixTests.cs
  21. 28
      src/UnitTests/LinearAlgebraTests/Complex32/MatrixStructureTheory.cs
  22. 230
      src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.cs
  23. 62
      src/UnitTests/LinearAlgebraTests/Double/DiagonalMatrixTests.cs
  24. 18
      src/UnitTests/LinearAlgebraTests/Double/MatrixStructureTheory.cs
  25. 230
      src/UnitTests/LinearAlgebraTests/Double/MatrixTests.cs
  26. 634
      src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.Access.cs
  27. 81
      src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.Reform.cs
  28. 557
      src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs
  29. 62
      src/UnitTests/LinearAlgebraTests/Single/DiagonalMatrixTests.cs
  30. 18
      src/UnitTests/LinearAlgebraTests/Single/MatrixStructureTheory.cs
  31. 230
      src/UnitTests/LinearAlgebraTests/Single/MatrixTests.cs
  32. 2
      src/UnitTests/UnitTests.csproj

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

@ -201,7 +201,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// of columns.</item>
/// <item><c>(columnIndex + columnLength) &gt;= Columns</c></item>
/// <item><c>(rowIndex + rowLength) &gt;= Rows</c></item></list></exception>
/// <exception cref="ArgumentException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// is not positive.</exception>
public override Matrix<Complex> SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount)
{

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

@ -1065,7 +1065,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// of columns.</item>
/// <item><c>(columnIndex + columnLength) &gt;= Columns</c></item>
/// <item><c>(rowIndex + rowLength) &gt;= Rows</c></item></list></exception>
/// <exception cref="ArgumentException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// is not positive.</exception>
public override Matrix<Complex> 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;

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

@ -389,7 +389,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// of columns.</item>
/// <item><c>(columnIndex + columnLength) &gt;= Columns</c></item>
/// <item><c>(rowIndex + rowLength) &gt;= Rows</c></item></list></exception>
/// <exception cref="ArgumentException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// is not positive.</exception>
public override Matrix<Complex> 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;

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

@ -201,7 +201,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// of columns.</item>
/// <item><c>(columnIndex + columnLength) &gt;= Columns</c></item>
/// <item><c>(rowIndex + rowLength) &gt;= Rows</c></item></list></exception>
/// <exception cref="ArgumentException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// is not positive.</exception>
public override Matrix<Complex32> SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount)
{

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

@ -1065,7 +1065,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// of columns.</item>
/// <item><c>(columnIndex + columnLength) &gt;= Columns</c></item>
/// <item><c>(rowIndex + rowLength) &gt;= Rows</c></item></list></exception>
/// <exception cref="ArgumentException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// is not positive.</exception>
public override Matrix<Complex32> 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;

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

@ -389,7 +389,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// of columns.</item>
/// <item><c>(columnIndex + columnLength) &gt;= Columns</c></item>
/// <item><c>(rowIndex + rowLength) &gt;= Rows</c></item></list></exception>
/// <exception cref="ArgumentException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// is not positive.</exception>
public override Matrix<Complex32> 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;

2
src/Numerics/LinearAlgebra/Double/DenseMatrix.cs

@ -201,7 +201,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// of columns.</item>
/// <item><c>(columnIndex + columnLength) &gt;= Columns</c></item>
/// <item><c>(rowIndex + rowLength) &gt;= Rows</c></item></list></exception>
/// <exception cref="ArgumentException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// is not positive.</exception>
public override Matrix<double> SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount)
{

8
src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs

@ -1059,7 +1059,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// of columns.</item>
/// <item><c>(columnIndex + columnLength) &gt;= Columns</c></item>
/// <item><c>(rowIndex + rowLength) &gt;= Rows</c></item></list></exception>
/// <exception cref="ArgumentException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// is not positive.</exception>
public override Matrix<double> 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;

6
src/Numerics/LinearAlgebra/Double/SparseMatrix.cs

@ -388,7 +388,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// of columns.</item>
/// <item><c>(columnIndex + columnLength) &gt;= Columns</c></item>
/// <item><c>(rowIndex + rowLength) &gt;= Rows</c></item></list></exception>
/// <exception cref="ArgumentException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// is not positive.</exception>
public override Matrix<double> 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;

12
src/Numerics/LinearAlgebra/Generic/Matrix.cs

@ -611,7 +611,7 @@ namespace MathNet.Numerics.LinearAlgebra.Generic
/// of columns.</item>
/// <item><c>(columnIndex + columnLength) &gt;= Columns</c></item>
/// <item><c>(rowIndex + rowLength) &gt;= Rows</c></item></list></exception>
/// <exception cref="ArgumentException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// is not positive.</exception>
public virtual Matrix<T> 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
/// <item><c>(rowIndex + rowLength) &gt;= Rows</c></item></list></exception>
/// <exception cref="ArgumentNullException">If <paramref name="subMatrix"/> is <see langword="null" /></exception>
/// <item>the size of <paramref name="subMatrix"/> is not at least <paramref name="rowCount"/> x <paramref name="columnCount"/>.</item>
/// <exception cref="ArgumentException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// is not positive.</exception>
public virtual void SetSubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount, Matrix<T> 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)

2
src/Numerics/LinearAlgebra/Single/DenseMatrix.cs

@ -201,7 +201,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// of columns.</item>
/// <item><c>(columnIndex + columnLength) &gt;= Columns</c></item>
/// <item><c>(rowIndex + rowLength) &gt;= Rows</c></item></list></exception>
/// <exception cref="ArgumentException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// is not positive.</exception>
public override Matrix<float> SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount)
{

8
src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs

@ -1059,7 +1059,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// of columns.</item>
/// <item><c>(columnIndex + columnLength) &gt;= Columns</c></item>
/// <item><c>(rowIndex + rowLength) &gt;= Rows</c></item></list></exception>
/// <exception cref="ArgumentException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// is not positive.</exception>
public override Matrix<float> 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;

6
src/Numerics/LinearAlgebra/Single/SparseMatrix.cs

@ -388,7 +388,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// of columns.</item>
/// <item><c>(columnIndex + columnLength) &gt;= Columns</c></item>
/// <item><c>(rowIndex + rowLength) &gt;= Rows</c></item></list></exception>
/// <exception cref="ArgumentException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="rowCount"/> or <paramref name="columnCount"/>
/// is not positive.</exception>
public override Matrix<float> 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;

4
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

1
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
{

18
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
}
}
}

62
src/UnitTests/LinearAlgebraTests/Complex/DiagonalMatrixTests.cs

@ -320,30 +320,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex
}
}
/// <summary>
/// Can set a submatrix.
/// </summary>
/// <param name="rowStart">The row to start copying to.</param>
/// <param name="rowLength">The number of rows to copy.</param>
/// <param name="colStart">The column to start copying to.</param>
/// <param name="colLength">The number of columns to copy.</param>
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;
}
}
}
/// <summary>
/// Can compute Frobenius norm.
/// </summary>
@ -515,43 +491,5 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex
var matrix = TestMatrices["Square3x3"];
Assert.IsTrue(matrix.IsSymmetric);
}
/// <summary>
/// Can get a sub-matrix.
/// </summary>
[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]);
}
}
}
}
}
}

26
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<Complex>[] _matrices = new Matrix<Complex>[]
{
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<Complex> 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<Complex> CreateSparse(int rows, int columns)
{
return new SparseMatrix(rows, columns);
@ -47,6 +57,12 @@
return new DenseVector(size);
}
protected override Vector<Complex> 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; }

230
src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.cs

@ -88,208 +88,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex
}
}
/// <summary>
/// Can insert a column.
/// </summary>
[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]);
}
}
}
}
/// <summary>
/// Insert <c>null</c> column throws <c>ArgumentNullException</c>.
/// </summary>
[Test]
public void InsertNullColumnThrowsArgumentNullException()
{
var matrix = TestMatrices["Square3x3"];
Assert.Throws<ArgumentNullException>(() => matrix.InsertColumn(0, null));
}
/// <summary>
/// Insert a column with invalid column index throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void InsertColumnWithInvalidColumnIndexThrowsArgumentOutOfRangeException()
{
var matrix = CreateMatrix(3, 3);
var column = CreateVector(matrix.RowCount);
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.InsertColumn(-1, column));
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.InsertColumn(5, column));
}
/// <summary>
/// Insert a column with invalid number of elements throws <c>ArgumentException</c>.
/// </summary>
[Test]
public void InsertColumnWithUnequalNumberOfElementsThrowsArgumentException()
{
var matrix = CreateMatrix(3, 3);
var column = CreateVector(matrix.RowCount + 1);
Assert.Throws<ArgumentException>(() => matrix.InsertColumn(0, column));
}
/// <summary>
/// Can set a submatrix.
/// </summary>
/// <param name="rowStart">The row to start copying to.</param>
/// <param name="rowLength">The number of rows to copy.</param>
/// <param name="colStart">The column to start copying to.</param>
/// <param name="colLength">The number of columns to copy.</param>
[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]);
}
}
}
}
/// <summary>
/// Set submatrix with invalid ranges throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
/// <param name="rowStart">The row to start copying to.</param>
/// <param name="rowLength">The number of rows to copy.</param>
/// <param name="colStart">The column to start copying to.</param>
/// <param name="colLength">The number of columns to copy.</param>
[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<ArgumentOutOfRangeException>(() => TestMatrices["Square3x3"].SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix));
}
/// <summary>
/// Set submatrix with invalid length throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
/// <param name="rowStart">The row to start copying to.</param>
/// <param name="rowLength">The number of rows to copy.</param>
/// <param name="colStart">The column to start copying to.</param>
/// <param name="colLength">The number of columns to copy.</param>
[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<ArgumentException>(() => TestMatrices["Square3x3"].SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix));
}
/// <summary>
/// Set a submatrix with <c>null</c> submatrix throws <c>ArgumentNullException</c>.
/// </summary>
[Test]
public void SetSubMatrixWithNullSubMatrixThrowsArgumentNullException()
{
Matrix<Complex> subMatrix = null;
Assert.Throws<ArgumentNullException>(() => TestMatrices["Square3x3"].SetSubMatrix(0, 2, 0, 2, subMatrix));
}
/// <summary>
/// Can insert a row.
/// </summary>
[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]);
}
}
}
}
/// <summary>
/// Insert <c>null</c> row throws <c>ArgumentNullException</c>.
/// </summary>
[Test]
public void InsertNullRowThrowsArgumentNullException()
{
var matrix = TestMatrices["Square3x3"];
Assert.Throws<ArgumentNullException>(() => matrix.InsertRow(0, null));
}
/// <summary>
/// Insert a row with invalid row index throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void InsertRowWithInvalidRowIndexThrowsArgumentOutOfRangeException()
{
var matrix = CreateMatrix(3, 3);
var row = CreateVector(matrix.ColumnCount);
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.InsertRow(-1, row));
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.InsertRow(5, row));
}
/// <summary>
/// Insert a row with invalid number of elements throws <c>ArgumentException</c>.
/// </summary>
[Test]
public void InsertRowWithInvalidNumberOfElementsThrowsArgumentException()
{
var matrix = CreateMatrix(3, 3);
var row = CreateVector(matrix.ColumnCount + 1);
Assert.Throws<ArgumentException>(() => matrix.InsertRow(0, row));
}
/// <summary>
/// Can convert a matrix to a multidimensional array.
/// </summary>
@ -785,34 +583,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex
Assert.IsFalse(matrix.IsSymmetric);
}
/// <summary>
/// Can get a sub-matrix.
/// </summary>
[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]);
}
}
}
/// <summary>
/// Test whether we can create a matrix from a list of column vectors.
/// </summary>

62
src/UnitTests/LinearAlgebraTests/Complex32/DiagonalMatrixTests.cs

@ -320,30 +320,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32
}
}
/// <summary>
/// Can set a submatrix.
/// </summary>
/// <param name="rowStart">The row to start copying to.</param>
/// <param name="rowLength">The number of rows to copy.</param>
/// <param name="colStart">The column to start copying to.</param>
/// <param name="colLength">The number of columns to copy.</param>
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;
}
}
}
/// <summary>
/// Can compute Frobenius norm.
/// </summary>
@ -515,43 +491,5 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32
var matrix = TestMatrices["Square3x3"];
Assert.IsTrue(matrix.IsSymmetric);
}
/// <summary>
/// Can get a sub-matrix.
/// </summary>
[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]);
}
}
}
}
}
}

28
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<Complex32>[] _matrices = new Matrix<Complex32>[]
{
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<Complex32> CreateDense(int rows, int columns)
{
return new DenseMatrix(rows, columns);
}
protected override Matrix<Complex32> 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<Complex32> CreateSparse(int rows, int columns)
{
return new SparseMatrix(rows, columns);
@ -47,6 +57,12 @@
return new DenseVector(size);
}
protected override Vector<Complex32> 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; }

230
src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.cs

@ -88,208 +88,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32
}
}
/// <summary>
/// Can insert a column.
/// </summary>
[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]);
}
}
}
}
/// <summary>
/// Insert <c>null</c> column throws <c>ArgumentNullException</c>.
/// </summary>
[Test]
public void InsertNullColumnThrowsArgumentNullException()
{
var matrix = TestMatrices["Square3x3"];
Assert.Throws<ArgumentNullException>(() => matrix.InsertColumn(0, null));
}
/// <summary>
/// Insert a column with invalid column index throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void InsertColumnWithInvalidColumnIndexThrowsArgumentOutOfRangeException()
{
var matrix = CreateMatrix(3, 3);
var column = CreateVector(matrix.RowCount);
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.InsertColumn(-1, column));
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.InsertColumn(5, column));
}
/// <summary>
/// Insert a column with invalid number of elements throws <c>ArgumentException</c>.
/// </summary>
[Test]
public void InsertColumnWithUnequalNumberOfElementsThrowsArgumentException()
{
var matrix = CreateMatrix(3, 3);
var column = CreateVector(matrix.RowCount + 1);
Assert.Throws<ArgumentException>(() => matrix.InsertColumn(0, column));
}
/// <summary>
/// Can set a submatrix.
/// </summary>
/// <param name="rowStart">The row to start copying to.</param>
/// <param name="rowLength">The number of rows to copy.</param>
/// <param name="colStart">The column to start copying to.</param>
/// <param name="colLength">The number of columns to copy.</param>
[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]);
}
}
}
}
/// <summary>
/// Set submatrix with invalid ranges throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
/// <param name="rowStart">The row to start copying to.</param>
/// <param name="rowLength">The number of rows to copy.</param>
/// <param name="colStart">The column to start copying to.</param>
/// <param name="colLength">The number of columns to copy.</param>
[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<ArgumentOutOfRangeException>(() => TestMatrices["Square3x3"].SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix));
}
/// <summary>
/// Set submatrix with invalid length throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
/// <param name="rowStart">The row to start copying to.</param>
/// <param name="rowLength">The number of rows to copy.</param>
/// <param name="colStart">The column to start copying to.</param>
/// <param name="colLength">The number of columns to copy.</param>
[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<ArgumentException>(() => TestMatrices["Square3x3"].SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix));
}
/// <summary>
/// Set a submatrix with <c>null</c> submatrix throws <c>ArgumentNullException</c>.
/// </summary>
[Test]
public void SetSubMatrixWithNullSubMatrixThrowsArgumentNullException()
{
Matrix<Complex32> subMatrix = null;
Assert.Throws<ArgumentNullException>(() => TestMatrices["Square3x3"].SetSubMatrix(0, 2, 0, 2, subMatrix));
}
/// <summary>
/// Can insert a row.
/// </summary>
[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]);
}
}
}
}
/// <summary>
/// Insert <c>null</c> row throws <c>ArgumentNullException</c>.
/// </summary>
[Test]
public void InsertNullRowThrowsArgumentNullException()
{
var matrix = TestMatrices["Square3x3"];
Assert.Throws<ArgumentNullException>(() => matrix.InsertRow(0, null));
}
/// <summary>
/// Insert a row with invalid row index throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void InsertRowWithInvalidRowIndexThrowsArgumentOutOfRangeException()
{
var matrix = CreateMatrix(3, 3);
var row = CreateVector(matrix.ColumnCount);
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.InsertRow(-1, row));
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.InsertRow(5, row));
}
/// <summary>
/// Insert a row with invalid number of elements throws <c>ArgumentException</c>.
/// </summary>
[Test]
public void InsertRowWithInvalidNumberOfElementsThrowsArgumentException()
{
var matrix = CreateMatrix(3, 3);
var row = CreateVector(matrix.ColumnCount + 1);
Assert.Throws<ArgumentException>(() => matrix.InsertRow(0, row));
}
/// <summary>
/// Can convert a matrix to a multidimensional array.
/// </summary>
@ -785,34 +583,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32
Assert.IsFalse(matrix.IsSymmetric);
}
/// <summary>
/// Can get a sub-matrix.
/// </summary>
[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]);
}
}
}
/// <summary>
/// Test whether we can create a matrix from a list of column vectors.
/// </summary>

62
src/UnitTests/LinearAlgebraTests/Double/DiagonalMatrixTests.cs

@ -320,30 +320,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double
}
}
/// <summary>
/// Can set a submatrix.
/// </summary>
/// <param name="rowStart">The row to start copying to.</param>
/// <param name="rowLength">The number of rows to copy.</param>
/// <param name="colStart">The column to start copying to.</param>
/// <param name="colLength">The number of columns to copy.</param>
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;
}
}
}
/// <summary>
/// Can compute Frobenius norm.
/// </summary>
@ -516,44 +492,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double
Assert.IsTrue(matrix.IsSymmetric);
}
/// <summary>
/// Can get a sub-matrix.
/// </summary>
[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()
{

18
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<double> 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<double> CreateSparse(int rows, int columns)
{
return new SparseMatrix(rows, columns);
@ -46,6 +56,12 @@
return new DenseVector(size);
}
protected override Vector<double> 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; }

230
src/UnitTests/LinearAlgebraTests/Double/MatrixTests.cs

@ -61,208 +61,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double
}
}
/// <summary>
/// Can insert a column.
/// </summary>
[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]);
}
}
}
}
/// <summary>
/// Insert <c>null</c> column throws <c>ArgumentNullException</c>.
/// </summary>
[Test]
public void InsertNullColumnThrowsArgumentNullException()
{
var matrix = TestMatrices["Square3x3"];
Assert.Throws<ArgumentNullException>(() => matrix.InsertColumn(0, null));
}
/// <summary>
/// Insert a column with invalid column index throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void InsertColumnWithInvalidColumnIndexThrowsArgumentOutOfRangeException()
{
var matrix = CreateMatrix(3, 3);
var column = CreateVector(matrix.RowCount);
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.InsertColumn(-1, column));
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.InsertColumn(5, column));
}
/// <summary>
/// Insert a column with invalid number of elements throws <c>ArgumentException</c>.
/// </summary>
[Test]
public void InsertColumnWithUnequalNumberOfElementsThrowsArgumentException()
{
var matrix = CreateMatrix(3, 3);
var column = CreateVector(matrix.RowCount + 1);
Assert.Throws<ArgumentException>(() => matrix.InsertColumn(0, column));
}
/// <summary>
/// Can set a submatrix.
/// </summary>
/// <param name="rowStart">The row to start copying to.</param>
/// <param name="rowLength">The number of rows to copy.</param>
/// <param name="colStart">The column to start copying to.</param>
/// <param name="colLength">The number of columns to copy.</param>
[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]);
}
}
}
}
/// <summary>
/// Set submatrix with invalid ranges throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
/// <param name="rowStart">The row to start copying to.</param>
/// <param name="rowLength">The number of rows to copy.</param>
/// <param name="colStart">The column to start copying to.</param>
/// <param name="colLength">The number of columns to copy.</param>
[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<ArgumentOutOfRangeException>(() => TestMatrices["Square3x3"].SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix));
}
/// <summary>
/// Set submatrix with invalid length throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
/// <param name="rowStart">The row to start copying to.</param>
/// <param name="rowLength">The number of rows to copy.</param>
/// <param name="colStart">The column to start copying to.</param>
/// <param name="colLength">The number of columns to copy.</param>
[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<ArgumentException>(() => TestMatrices["Square3x3"].SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix));
}
/// <summary>
/// Set a submatrix with <c>null</c> submatrix throws <c>ArgumentNullException</c>.
/// </summary>
[Test]
public void SetSubMatrixWithNullSubMatrixThrowsArgumentNullException()
{
Matrix<double> subMatrix = null;
Assert.Throws<ArgumentNullException>(() => TestMatrices["Square3x3"].SetSubMatrix(0, 2, 0, 2, subMatrix));
}
/// <summary>
/// Can insert a row.
/// </summary>
[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]);
}
}
}
}
/// <summary>
/// Insert <c>null</c> row throws <c>ArgumentNullException</c>.
/// </summary>
[Test]
public void InsertNullRowThrowsArgumentNullException()
{
var matrix = TestMatrices["Square3x3"];
Assert.Throws<ArgumentNullException>(() => matrix.InsertRow(0, null));
}
/// <summary>
/// Insert a row with invalid row index throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void InsertRowWithInvalidRowIndexThrowsArgumentOutOfRangeException()
{
var matrix = CreateMatrix(3, 3);
var row = CreateVector(matrix.ColumnCount);
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.InsertRow(-1, row));
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.InsertRow(5, row));
}
/// <summary>
/// Insert a row with invalid number of elements throws <c>ArgumentException</c>.
/// </summary>
[Test]
public void InsertRowWithInvalidNumberOfElementsThrowsArgumentException()
{
var matrix = CreateMatrix(3, 3);
var row = CreateVector(matrix.ColumnCount + 1);
Assert.Throws<ArgumentException>(() => matrix.InsertRow(0, row));
}
/// <summary>
/// Can convert a matrix to a multidimensional array.
/// </summary>
@ -758,34 +556,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double
Assert.IsFalse(matrix.IsSymmetric);
}
/// <summary>
/// Can get a sub-matrix.
/// </summary>
[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]);
}
}
}
/// <summary>
/// Test whether we can create a matrix from a list of column vectors.
/// </summary>

634
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<T>
{
[Theory, Timeout(200)]
public void CanGetFieldsByIndex(Matrix<T> 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<ArgumentOutOfRangeException>());
Assert.That(() => matrix[1, -1], Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix[0, matrix.ColumnCount], Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public void CanGetRow(Matrix<T> 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<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Row(matrix.RowCount), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public void CanGetRowIntoResult(Matrix<T> 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<ArgumentNullException>());
Assert.That(() => matrix.Row(-1, row), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Row(matrix.RowCount, row), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public virtual void CanGetRowWithRange(Matrix<T> 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<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Row(matrix.RowCount, 0, 1), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Row(0, -1, 1), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Row(0, 1, 0), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Row(0, 0, matrix.ColumnCount + 1), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public void CanGetRowWithRangeIntoResult(Matrix<T> 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<ArgumentNullException>());
Assert.That(() => matrix.Row(-1, 0, matrix.ColumnCount - 1, row), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Row(matrix.RowCount, 0, matrix.ColumnCount - 1, row), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Row(0, 0, matrix.ColumnCount, row), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public void CanGetColumn(Matrix<T> 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<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Column(matrix.ColumnCount), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public void CanGetColumnIntoResult(Matrix<T> 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<ArgumentNullException>());
Assert.That(() => matrix.Column(-1, col), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Column(matrix.ColumnCount, col), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public virtual void CanGetColumnWithRange(Matrix<T> 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<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Column(matrix.ColumnCount, 0, 1), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Column(0, -1, 1), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Column(0, 1, 0), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Column(0, 0, matrix.RowCount + 1), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public void CanGetColumnWithRangeIntoResult(Matrix<T> 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<ArgumentNullException>());
Assert.That(() => matrix.Column(-1, 0, matrix.RowCount - 1, col), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Column(matrix.ColumnCount, 0, matrix.ColumnCount - 1, col), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Column(0, 0, matrix.RowCount, col), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public void CanSetRow(Matrix<T> 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<T>)), Throws.InstanceOf<ArgumentNullException>());
Assert.That(() => matrix.SetRow(-1, CreateVector(matrix.ColumnCount)), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.SetRow(matrix.RowCount, CreateVector(matrix.ColumnCount)), Throws.InstanceOf<ArgumentOutOfRangeException>());
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<T> 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<ArgumentNullException>());
Assert.That(() => matrix.SetRow(-1, new T[matrix.ColumnCount]), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.SetRow(matrix.RowCount, new T[matrix.ColumnCount]), Throws.InstanceOf<ArgumentOutOfRangeException>());
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<T> 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<T>)), Throws.InstanceOf<ArgumentNullException>());
Assert.That(() => matrix.SetColumn(-1, CreateVector(matrix.RowCount)), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.SetColumn(matrix.ColumnCount, CreateVector(matrix.RowCount)), Throws.InstanceOf<ArgumentOutOfRangeException>());
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<T> 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<ArgumentNullException>());
Assert.That(() => matrix.SetColumn(-1, new T[matrix.RowCount]), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.SetColumn(matrix.ColumnCount, new T[matrix.RowCount]), Throws.InstanceOf<ArgumentOutOfRangeException>());
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<T> 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<T> 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<ArgumentNullException>());
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<T> 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<T> 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<ArgumentNullException>());
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<T> 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<T> 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<ArgumentNullException>());
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<T> 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<T> 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<ArgumentNullException>());
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<T> 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<T> 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<T>)), Throws.InstanceOf<ArgumentNullException>());
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<T> 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<ArgumentNullException>());
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<T> 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<ArgumentOutOfRangeException>());
Assert.That(() => matrix.SubMatrix(matrix.RowCount, 1, 0, 1), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.SubMatrix(0, 0, 0, 1), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.SubMatrix(0, 1, -1, 1), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.SubMatrix(0, 1, matrix.ColumnCount, 1), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.SubMatrix(0, 1, 0, 0), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public void CanSetSubmatrix(Matrix<T> 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<T>)), Throws.InstanceOf<ArgumentNullException>());
Assert.That(() => m.SetSubMatrix(-1, 1, 0, 1, CreateDense(1,1)), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => m.SetSubMatrix(matrix.RowCount, 1, 0, 1, CreateDense(1, 1)), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => m.SetSubMatrix(0, 0, 0, 1, CreateDense(1, 1)), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => m.SetSubMatrix(0, 1, -1, 1, CreateDense(1, 1)), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => m.SetSubMatrix(0, 1, matrix.ColumnCount, 1, CreateDense(1, 1)), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => m.SetSubMatrix(0, 1, 0, 0, CreateDense(1, 1)), Throws.InstanceOf<ArgumentOutOfRangeException>());
// 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);
}
}
}

81
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<T>
{
[Theory, Timeout(200)]
public void CanInsertRow(Matrix<T> 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<T>)), Throws.InstanceOf<ArgumentNullException>());
Assert.That(() => matrix.InsertRow(-1, CreateVector(matrix.ColumnCount)), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.InsertRow(matrix.RowCount + 1, CreateVector(matrix.ColumnCount)), Throws.InstanceOf<ArgumentOutOfRangeException>());
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<T> 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<T>)), Throws.InstanceOf<ArgumentNullException>());
Assert.That(() => matrix.InsertColumn(-1, CreateVector(matrix.RowCount)), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.InsertColumn(matrix.ColumnCount + 1, CreateVector(matrix.RowCount)), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.InsertColumn(0, CreateVector(matrix.RowCount - 1)), Throws.ArgumentException);
Assert.That(() => matrix.InsertColumn(0, CreateVector(matrix.RowCount + 1)), Throws.ArgumentException);
}
}
}

557
src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs

@ -5,12 +5,14 @@
using NUnit.Framework;
[TestFixture]
public abstract class MatrixStructureTheory<T>
public abstract partial class MatrixStructureTheory<T>
where T : struct, IEquatable<T>, IFormattable
{
protected abstract Matrix<T> CreateDense(int rows, int columns);
protected abstract Matrix<T> CreateDense(int rows, int columns, int seed);
protected abstract Matrix<T> CreateSparse(int rows, int columns);
protected abstract Vector<T> CreateVector(int size);
protected abstract Vector<T> 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<T> 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<ArgumentOutOfRangeException>());
Assert.That(() => matrix[1, -1], Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix[0, matrix.ColumnCount], Throws.InstanceOf<ArgumentOutOfRangeException>());
}
#region Row & Column Access
[Theory, Timeout(200)]
public void CanGetRow(Matrix<T> 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<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Row(matrix.RowCount), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public void CanGetRowIntoResult(Matrix<T> 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<ArgumentNullException>());
Assert.That(() => matrix.Row(-1, row), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Row(matrix.RowCount, row), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public virtual void CanGetRowWithRange(Matrix<T> 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<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Row(matrix.RowCount, 0, 1), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Row(0, -1, 1), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Row(0, 1, 0), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Row(0, 0, matrix.ColumnCount + 1), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public void CanGetRowWithRangeIntoResult(Matrix<T> 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<ArgumentNullException>());
Assert.That(() => matrix.Row(-1, 0, matrix.ColumnCount - 1, row), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Row(matrix.RowCount, 0, matrix.ColumnCount - 1, row), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Row(0, 0, matrix.ColumnCount, row), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public void CanGetColumn(Matrix<T> 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<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Column(matrix.ColumnCount), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public void CanGetColumnIntoResult(Matrix<T> 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<ArgumentNullException>());
Assert.That(() => matrix.Column(-1, col), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Column(matrix.ColumnCount, col), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public virtual void CanGetColumnWithRange(Matrix<T> 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<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Column(matrix.ColumnCount, 0, 1), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Column(0, -1, 1), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Column(0, 1, 0), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Column(0, 0, matrix.RowCount + 1), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public void CanGetColumnWithRangeIntoResult(Matrix<T> 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<ArgumentNullException>());
Assert.That(() => matrix.Column(-1, 0, matrix.RowCount - 1, col), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Column(matrix.ColumnCount, 0, matrix.ColumnCount - 1, col), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.Column(0, 0, matrix.RowCount, col), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public void CanSetRow(Matrix<T> 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<T>)), Throws.InstanceOf<ArgumentNullException>());
Assert.That(() => matrix.SetRow(-1, CreateVector(matrix.ColumnCount)), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.SetRow(matrix.RowCount, CreateVector(matrix.ColumnCount)), Throws.InstanceOf<ArgumentOutOfRangeException>());
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<T> 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<ArgumentNullException>());
Assert.That(() => matrix.SetRow(-1, new T[matrix.ColumnCount]), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.SetRow(matrix.RowCount, new T[matrix.ColumnCount]), Throws.InstanceOf<ArgumentOutOfRangeException>());
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<T> 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<T>)), Throws.InstanceOf<ArgumentNullException>());
Assert.That(() => matrix.SetColumn(-1, CreateVector(matrix.RowCount)), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.SetColumn(matrix.ColumnCount, CreateVector(matrix.RowCount)), Throws.InstanceOf<ArgumentOutOfRangeException>());
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<T> 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<ArgumentNullException>());
Assert.That(() => matrix.SetColumn(-1, new T[matrix.RowCount]), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.SetColumn(matrix.ColumnCount, new T[matrix.RowCount]), Throws.InstanceOf<ArgumentOutOfRangeException>());
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<T> 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<T> 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<ArgumentNullException>());
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<T> 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<T> 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<ArgumentNullException>());
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<T> 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<T> 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<ArgumentNullException>());
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<T> 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<T> 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<ArgumentNullException>());
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<T> 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<T> 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<T>)), Throws.InstanceOf<ArgumentNullException>());
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<T> 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<ArgumentNullException>());
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
}
}

62
src/UnitTests/LinearAlgebraTests/Single/DiagonalMatrixTests.cs

@ -319,30 +319,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single
}
}
/// <summary>
/// Can set a submatrix.
/// </summary>
/// <param name="rowStart">The row to start copying to.</param>
/// <param name="rowLength">The number of rows to copy.</param>
/// <param name="colStart">The column to start copying to.</param>
/// <param name="colLength">The number of columns to copy.</param>
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;
}
}
}
/// <summary>
/// Can compute Frobenius norm.
/// </summary>
@ -515,43 +491,5 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single
var matrix = TestMatrices["Square3x3"];
Assert.IsTrue(matrix.IsSymmetric);
}
/// <summary>
/// Can get a sub-matrix.
/// </summary>
[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]);
}
}
}
}
}
}

18
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<float> 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<float> CreateSparse(int rows, int columns)
{
return new SparseMatrix(rows, columns);
@ -46,6 +56,12 @@
return new DenseVector(size);
}
protected override Vector<float> 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; }

230
src/UnitTests/LinearAlgebraTests/Single/MatrixTests.cs

@ -61,208 +61,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single
}
}
/// <summary>
/// Can insert a column.
/// </summary>
[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]);
}
}
}
}
/// <summary>
/// Insert <c>null</c> column throws <c>ArgumentNullException</c>.
/// </summary>
[Test]
public void InsertNullColumnThrowsArgumentNullException()
{
var matrix = TestMatrices["Square3x3"];
Assert.Throws<ArgumentNullException>(() => matrix.InsertColumn(0, null));
}
/// <summary>
/// Insert a column with invalid column index throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void InsertColumnWithInvalidColumnIndexThrowsArgumentOutOfRangeException()
{
var matrix = CreateMatrix(3, 3);
var column = CreateVector(matrix.RowCount);
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.InsertColumn(-1, column));
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.InsertColumn(5, column));
}
/// <summary>
/// Insert a column with invalid number of elements throws <c>ArgumentException</c>.
/// </summary>
[Test]
public void InsertColumnWithUnequalNumberOfElementsThrowsArgumentException()
{
var matrix = CreateMatrix(3, 3);
var column = CreateVector(matrix.RowCount + 1);
Assert.Throws<ArgumentException>(() => matrix.InsertColumn(0, column));
}
/// <summary>
/// Can set a submatrix.
/// </summary>
/// <param name="rowStart">The row to start copying to.</param>
/// <param name="rowLength">The number of rows to copy.</param>
/// <param name="colStart">The column to start copying to.</param>
/// <param name="colLength">The number of columns to copy.</param>
[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]);
}
}
}
}
/// <summary>
/// Set submatrix with invalid ranges throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
/// <param name="rowStart">The row to start copying to.</param>
/// <param name="rowLength">The number of rows to copy.</param>
/// <param name="colStart">The column to start copying to.</param>
/// <param name="colLength">The number of columns to copy.</param>
[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<ArgumentOutOfRangeException>(() => TestMatrices["Square3x3"].SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix));
}
/// <summary>
/// Set submatrix with invalid length throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
/// <param name="rowStart">The row to start copying to.</param>
/// <param name="rowLength">The number of rows to copy.</param>
/// <param name="colStart">The column to start copying to.</param>
/// <param name="colLength">The number of columns to copy.</param>
[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<ArgumentException>(() => TestMatrices["Square3x3"].SetSubMatrix(rowStart, rowLength, colStart, colLength, subMatrix));
}
/// <summary>
/// Set a submatrix with <c>null</c> submatrix throws <c>ArgumentNullException</c>.
/// </summary>
[Test]
public void SetSubMatrixWithNullSubMatrixThrowsArgumentNullException()
{
Matrix<float> subMatrix = null;
Assert.Throws<ArgumentNullException>(() => TestMatrices["Square3x3"].SetSubMatrix(0, 2, 0, 2, subMatrix));
}
/// <summary>
/// Can insert a row.
/// </summary>
[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]);
}
}
}
}
/// <summary>
/// Insert <c>null</c> row throws <c>ArgumentNullException</c>.
/// </summary>
[Test]
public void InsertNullRowThrowsArgumentNullException()
{
var matrix = TestMatrices["Square3x3"];
Assert.Throws<ArgumentNullException>(() => matrix.InsertRow(0, null));
}
/// <summary>
/// Insert a row with invalid row index throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void InsertRowWithInvalidRowIndexThrowsArgumentOutOfRangeException()
{
var matrix = CreateMatrix(3, 3);
var row = CreateVector(matrix.ColumnCount);
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.InsertRow(-1, row));
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.InsertRow(5, row));
}
/// <summary>
/// Insert a row with invalid number of elements throws <c>ArgumentException</c>.
/// </summary>
[Test]
public void InsertRowWithInvalidNumberOfElementsThrowsArgumentException()
{
var matrix = CreateMatrix(3, 3);
var row = CreateVector(matrix.ColumnCount + 1);
Assert.Throws<ArgumentException>(() => matrix.InsertRow(0, row));
}
/// <summary>
/// Can convert a matrix to a multidimensional array.
/// </summary>
@ -758,34 +556,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single
Assert.IsFalse(matrix.IsSymmetric);
}
/// <summary>
/// Can get a sub-matrix.
/// </summary>
[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]);
}
}
}
/// <summary>
/// Test whether we can create a matrix from a list of column vectors.
/// </summary>

2
src/UnitTests/UnitTests.csproj

@ -576,7 +576,9 @@
<Compile Include="LinearAlgebraTests\Double\VectorTests.Norm.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="LinearAlgebraTests\MatrixStructureTheory.Access.cs" />
<Compile Include="LinearAlgebraTests\MatrixStructureTheory.cs" />
<Compile Include="LinearAlgebraTests\MatrixStructureTheory.Reform.cs" />
<Compile Include="LinearAlgebraTests\Single\DenseMatrixTests.cs">
<SubType>Code</SubType>
</Compile>

Loading…
Cancel
Save