Browse Source

Tests: replace matrix structural tests with theory (part 1)

pull/47/head
Christoph Ruegg 14 years ago
parent
commit
9330413bcb
  1. 16
      src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs
  2. 16
      src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs
  3. 16
      src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs
  4. 16
      src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs
  5. 16
      src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs
  6. 16
      src/Numerics/LinearAlgebra/Double/SparseMatrix.cs
  7. 23
      src/Numerics/LinearAlgebra/Generic/Matrix.cs
  8. 16
      src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs
  9. 16
      src/Numerics/LinearAlgebra/Single/SparseMatrix.cs
  10. 50
      src/UnitTests/LinearAlgebraTests/Complex/MatrixStructureTheory.cs
  11. 320
      src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.cs
  12. 50
      src/UnitTests/LinearAlgebraTests/Complex32/MatrixStructureTheory.cs
  13. 320
      src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.cs
  14. 49
      src/UnitTests/LinearAlgebraTests/Double/MatrixStructureTheory.cs
  15. 320
      src/UnitTests/LinearAlgebraTests/Double/MatrixTests.cs
  16. 159
      src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs
  17. 49
      src/UnitTests/LinearAlgebraTests/Single/MatrixStructureTheory.cs
  18. 320
      src/UnitTests/LinearAlgebraTests/Single/MatrixTests.cs
  19. 5
      src/UnitTests/UnitTests.csproj

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

@ -220,17 +220,15 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
public override int GetHashCode()
{
var hashNum = Math.Min(_data.Length, 25);
long hash = 0;
for (var i = 0; i < hashNum; i++)
int hash = 17;
unchecked
{
#if PORTABLE
hash ^= Precision.DoubleToInt64Bits(_data[i].GetHashCode());
#else
hash ^= BitConverter.DoubleToInt64Bits(_data[i].GetHashCode());
#endif
for (var i = 0; i < hashNum; i++)
{
hash = hash*31 + _data[i].GetHashCode();
}
}
return BitConverter.ToInt32(BitConverter.GetBytes(hash), 4);
return hash;
}
#region Elementary operations

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

@ -623,17 +623,15 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
{
var values = _storage.Values;
var hashNum = Math.Min(_storage.ValueCount, 25);
long hash = 0;
for (var i = 0; i < hashNum; i++)
int hash = 17;
unchecked
{
#if PORTABLE
hash ^= Precision.DoubleToInt64Bits(values[i].Magnitude);
#else
hash ^= BitConverter.DoubleToInt64Bits(values[i].Magnitude);
#endif
for (var i = 0; i < hashNum; i++)
{
hash = hash*31 + values[i].GetHashCode();
}
}
return BitConverter.ToInt32(BitConverter.GetBytes(hash), 4);
return hash;
}
/// <summary>

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

@ -220,17 +220,15 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
public override int GetHashCode()
{
var hashNum = Math.Min(_data.Length, 25);
long hash = 0;
for (var i = 0; i < hashNum; i++)
int hash = 17;
unchecked
{
#if PORTABLE
hash ^= Precision.DoubleToInt64Bits(_data[i].GetHashCode());
#else
hash ^= BitConverter.DoubleToInt64Bits(_data[i].GetHashCode());
#endif
for (var i = 0; i < hashNum; i++)
{
hash = hash*31 + _data[i].GetHashCode();
}
}
return BitConverter.ToInt32(BitConverter.GetBytes(hash), 4);
return hash;
}
#region Elementary operations

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

@ -623,17 +623,15 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
{
var values = _storage.Values;
var hashNum = Math.Min(_storage.ValueCount, 25);
long hash = 0;
for (var i = 0; i < hashNum; i++)
int hash = 17;
unchecked
{
#if PORTABLE
hash ^= Precision.DoubleToInt64Bits(values[i].Magnitude);
#else
hash ^= BitConverter.DoubleToInt64Bits(values[i].Magnitude);
#endif
for (var i = 0; i < hashNum; i++)
{
hash = hash*31 + values[i].GetHashCode();
}
}
return BitConverter.ToInt32(BitConverter.GetBytes(hash), 4);
return hash;
}
/// <summary>

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

@ -219,17 +219,15 @@ namespace MathNet.Numerics.LinearAlgebra.Double
public override int GetHashCode()
{
var hashNum = Math.Min(_data.Length, 25);
long hash = 0;
for (var i = 0; i < hashNum; i++)
int hash = 17;
unchecked
{
#if PORTABLE
hash ^= Precision.DoubleToInt64Bits(_data[i]);
#else
hash ^= BitConverter.DoubleToInt64Bits(_data[i]);
#endif
for (var i = 0; i < hashNum; i++)
{
hash = hash*31 + _data[i].GetHashCode();
}
}
return BitConverter.ToInt32(BitConverter.GetBytes(hash), 4);
return hash;
}
#region Elementary operations

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

@ -622,17 +622,15 @@ namespace MathNet.Numerics.LinearAlgebra.Double
{
var values = _storage.Values;
var hashNum = Math.Min(_storage.ValueCount, 25);
long hash = 0;
for (var i = 0; i < hashNum; i++)
int hash = 17;
unchecked
{
#if PORTABLE
hash ^= Precision.DoubleToInt64Bits(values[i]);
#else
hash ^= BitConverter.DoubleToInt64Bits(values[i]);
#endif
for (var i = 0; i < hashNum; i++)
{
hash = hash*31 + values[i].GetHashCode();
}
}
return BitConverter.ToInt32(BitConverter.GetBytes(hash), 4);
return hash;
}
/// <summary>

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

@ -1430,21 +1430,18 @@ namespace MathNet.Numerics.LinearAlgebra.Generic
/// </returns>
public override int GetHashCode()
{
var hashNum = Math.Min(RowCount * ColumnCount, 25);
long hash = 0;
for (var i = 0; i < hashNum; i++)
var hashNum = Math.Min(RowCount*ColumnCount, 25);
int hash = 17;
unchecked
{
var col = i % ColumnCount;
var row = (i - col) / RowCount;
#if PORTABLE
hash ^= Precision.DoubleToInt64Bits(this[row, col].GetHashCode());
#else
hash ^= BitConverter.DoubleToInt64Bits(this[row, col].GetHashCode());
#endif
for (var i = 0; i < hashNum; i++)
{
var col = i%ColumnCount;
var row = (i - col)/RowCount;
hash = hash*31 + this[row, col].GetHashCode();
}
}
return BitConverter.ToInt32(BitConverter.GetBytes(hash), 4);
return hash;
}
#endregion

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

@ -219,17 +219,15 @@ namespace MathNet.Numerics.LinearAlgebra.Single
public override int GetHashCode()
{
var hashNum = Math.Min(_data.Length, 25);
long hash = 0;
for (var i = 0; i < hashNum; i++)
int hash = 17;
unchecked
{
#if PORTABLE
hash ^= Precision.DoubleToInt64Bits(_data[i]);
#else
hash ^= BitConverter.DoubleToInt64Bits(_data[i]);
#endif
for (var i = 0; i < hashNum; i++)
{
hash = hash*31 + _data[i].GetHashCode();
}
}
return BitConverter.ToInt32(BitConverter.GetBytes(hash), 4);
return hash;
}
#region Elementary operations

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

@ -622,17 +622,15 @@ namespace MathNet.Numerics.LinearAlgebra.Single
{
var values = _storage.Values;
var hashNum = Math.Min(_storage.ValueCount, 25);
long hash = 0;
for (var i = 0; i < hashNum; i++)
int hash = 17;
unchecked
{
#if PORTABLE
hash ^= Precision.DoubleToInt64Bits(values[i]);
#else
hash ^= BitConverter.DoubleToInt64Bits(values[i]);
#endif
for (var i = 0; i < hashNum; i++)
{
hash = hash*31 + values[i].GetHashCode();
}
}
return BitConverter.ToInt32(BitConverter.GetBytes(hash), 4);
return hash;
}
/// <summary>

50
src/UnitTests/LinearAlgebraTests/Complex/MatrixStructureTheory.cs

@ -0,0 +1,50 @@
namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex
{
using LinearAlgebra.Complex;
using LinearAlgebra.Generic;
using NUnit.Framework;
using System.Numerics;
[TestFixture]
public class MatrixStructureTheory : MatrixStructureTheory<Complex>
{
[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[,] {{-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}}),
new DenseMatrix(new[,] {{-1.1d, -2.2d}, {Complex.Zero, 1.1d}, {-4.4d, 5.5d}}),
new DenseMatrix(new[,] {{-1.1d, -2.2d, -3.3d}, {0d, new Complex(1.1d, 0.1d), 2.2d}}),
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[,] {{-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 UserDefinedMatrix(new[,] {{0d, 1d, 2d}, {-1d, 7.7d, 0d}, {-2d, Complex.Zero, 0d}})
};
[Datapoints]
Complex[] scalars = new[] {new Complex(2d, 0d), new Complex(-1.5d, 3.5d), Complex.Zero};
protected override Matrix<Complex> CreateDense(int rows, int columns)
{
return new DenseMatrix(rows, columns);
}
protected override Matrix<Complex> CreateSparse(int rows, int columns)
{
return new SparseMatrix(rows, columns);
}
protected override Vector<Complex> CreateVector(int size)
{
return new DenseVector(size);
}
}
}

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

@ -36,326 +36,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex
/// </summary>
public abstract partial class MatrixTests : MatrixLoader
{
/// <summary>
/// Can clone a matrix.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanCloneMatrix(string name)
{
var matrix = CreateMatrix(TestData2D[name]);
var clone = matrix.Clone();
Assert.AreNotSame(matrix, clone);
Assert.AreEqual(matrix.RowCount, clone.RowCount);
Assert.AreEqual(matrix.ColumnCount, clone.ColumnCount);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[i, j], clone[i, j]);
}
}
}
/// <summary>
/// Can clone a matrix using <c>ICloneable</c> interface.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanCloneMatrixUsingICloneable(string name)
{
var matrix = TestMatrices[name];
var clone = (Matrix<Complex>)((ICloneable)matrix).Clone();
Assert.AreNotSame(matrix, clone);
Assert.AreEqual(matrix.RowCount, clone.RowCount);
Assert.AreEqual(matrix.ColumnCount, clone.ColumnCount);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[i, j], clone[i, j]);
}
}
}
/// <summary>
/// Can copy a matrix to another matrix.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanCopyTo(string name)
{
var matrix = TestMatrices[name];
var copy = CreateMatrix(matrix.RowCount, matrix.ColumnCount);
matrix.CopyTo(copy);
Assert.AreNotSame(matrix, copy);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[i, j], copy[i, j]);
}
}
}
/// <summary>
/// Copy a matrix to another matrix fails when target is <c>null</c>.
/// </summary>
[Test]
public void CopyToWhenTargetIsNullThrowsArgumentNullException()
{
var matrix = TestMatrices["Singular3x3"];
Matrix<Complex> target = null;
Assert.Throws<ArgumentNullException>(() => matrix.CopyTo(target));
}
/// <summary>
/// Copy a matrix to another matrix fails when target has more rows.
/// </summary>
[Test]
public void CopyToWhenTargetHasMoreRowsThrowsArgumentException()
{
var matrix = TestMatrices["Singular3x3"];
var target = CreateMatrix(matrix.RowCount + 1, matrix.ColumnCount);
Assert.Throws<ArgumentException>(() => matrix.CopyTo(target));
}
/// <summary>
/// Copy a matrix to another matrix fails when target has more columns.
/// </summary>
[Test]
public void CopyToWhenTargetHasMoreColumnsThrowsArgumentException()
{
var matrix = TestMatrices["Singular3x3"];
var target = CreateMatrix(matrix.RowCount + 1, matrix.ColumnCount);
Assert.Throws<ArgumentException>(() => matrix.CopyTo(target));
}
/// <summary>
/// Can create a matrix.
/// </summary>
[Test]
public void CanCreateMatrix()
{
var expected = CreateMatrix(5, 6);
var actual = expected.CreateMatrix(5, 6);
Assert.AreEqual(expected.GetType(), actual.GetType(), "Matrices are same type.");
}
/// <summary>
/// Can equate matrices.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanEquateMatrices(string name)
{
var matrix1 = CreateMatrix(TestData2D[name]);
var matrix2 = CreateMatrix(TestData2D[name]);
var matrix3 = CreateMatrix(TestData2D[name].GetLength(0), TestData2D[name].GetLength(1));
Assert.IsTrue(matrix1.Equals(matrix1));
Assert.IsTrue(matrix1.Equals(matrix2));
Assert.IsFalse(matrix1.Equals(matrix3));
Assert.IsFalse(matrix1.Equals(null));
}
/// <summary>
/// Create a matrix throws <c>ArgumentOutOfRangeException</c> if size is not positive.
/// </summary>
/// <param name="rows">The number of rows.</param>
/// <param name="columns">The number of columns.</param>
[TestCase(0, 2)]
[TestCase(2, 0)]
[TestCase(0, 0)]
[TestCase(-1, 1)]
[TestCase(1, -1)]
public void IfSizeIsNotPositiveThrowsArgumentException(int rows, int columns)
{
Assert.Throws<ArgumentOutOfRangeException>(() => CreateMatrix(rows, columns));
}
/// <summary>
/// Testing for equality with non-matrix returns <c>false</c>.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void TestingForEqualityWithNonMatrixReturnsFalse(string name)
{
var matrix = CreateMatrix(TestData2D[name]);
Assert.IsFalse(matrix.Equals(2));
}
/// <summary>
/// Can test for equality using Object.Equals.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanTestForEqualityUsingObjectEquals(string name)
{
var matrix1 = CreateMatrix(TestData2D[name]);
var matrix2 = CreateMatrix(TestData2D[name]);
Assert.IsTrue(matrix1.Equals((object)matrix2));
}
/// <summary>
/// Range check fails with wrong parameters.
/// </summary>
/// <param name="i">Row index.</param>
/// <param name="j">Column index.</param>
/// <param name="name">Matrix name.</param>
[TestCase(-1, 1, "Singular3x3")]
[TestCase(1, -1, "Singular3x3")]
[TestCase(4, 2, "Square3x3")]
public void RangeCheckWithInvalidIndicesThrowsArgumentOutOfRangeException(int i, int j, string name)
{
Assert.Throws<ArgumentOutOfRangeException>(() => { var x = TestMatrices[name][i, j]; });
}
/// <summary>
/// Can get matrix hash code.
/// </summary>
[Test]
public void CanMatrixGetHashCode()
{
var hash = TestMatrices["Singular3x3"].GetHashCode();
}
/// <summary>
/// Can clear matrix.
/// </summary>
[Test]
public void CanClearMatrix()
{
var matrix = TestMatrices["Singular3x3"].Clone();
matrix.Clear();
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(Complex.Zero, matrix[i, j]);
}
}
}
/// <summary>
/// Can get a row of a matrix.
/// </summary>
/// <param name="rowIndex">Row index.</param>
/// <param name="name">Matrix name.</param>
[TestCase(0, "Singular3x3")]
[TestCase(1, "Square3x3")]
[TestCase(2, "Square3x3")]
public void CanGetRow(int rowIndex, string name)
{
var matrix = TestMatrices[name];
var row = matrix.Row(rowIndex);
Assert.AreEqual(matrix.ColumnCount, row.Count);
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[rowIndex, j], row[j]);
}
}
/// <summary>
/// Get row throws ArgumentOutOfRange with negative index.
/// </summary>
[Test]
public void GetRowWithNegativeIndexThrowsArgumentOutOfRange()
{
var matrix = TestMatrices["Singular3x3"];
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.Row(-1));
}
/// <summary>
/// Get row throws <c>ArgumentOutOfRangeException</c> with overflowing row index.
/// </summary>
[Test]
public void GetRowWithOverflowingRowIndexThrowsArgumentOutOfRange()
{
var matrix = TestMatrices["Singular3x3"];
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.Row(matrix.RowCount));
}
/// <summary>
/// Can get row of a matrix into a result vector.
/// </summary>
/// <param name="rowIndex">Row index.</param>
/// <param name="name">Matrix name.</param>
[TestCase(0, "Singular3x3")]
[TestCase(1, "Square3x3")]
[TestCase(2, "Square3x3")]
public void CanGetRowIntoResult(int rowIndex, string name)
{
var matrix = TestMatrices[name];
var row = CreateVector(matrix.ColumnCount);
matrix.Row(rowIndex, row);
Assert.AreEqual(matrix.ColumnCount, row.Count);
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[rowIndex, j], row[j]);
}
}
/// <summary>
/// Get row of a matrix into <c>null</c> result vector throws <c>ArgumentNullException</c>.
/// </summary>
[Test]
public void GetRowWhenResultIsNullThrowsArgumentNullException()
{
var matrix = TestMatrices["Singular3x3"];
Assert.Throws<ArgumentNullException>(() => matrix.Row(0, null));
}
/// <summary>
/// Get row into a result with the negative row index throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void GetRowIntoResultWithNegativeRowIndexThrowsArgumentOutOfRangeException()
{
var matrix = TestMatrices["Singular3x3"];
var row = CreateVector(matrix.ColumnCount);
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.Row(-1, row));
}
/// <summary>
/// Get row into a vector with overflowing row index throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void GetRowIntoResultWithOverflowingRowIndexThrowsArgumentOutOfRangeException()
{
var matrix = TestMatrices["Singular3x3"];
var row = CreateVector(matrix.ColumnCount);
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.Row(matrix.RowCount, row));
}
/// <summary>
/// Can get a row at specific start position and length of a matrix into a vector.
/// </summary>

50
src/UnitTests/LinearAlgebraTests/Complex32/MatrixStructureTheory.cs

@ -0,0 +1,50 @@
namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32
{
using LinearAlgebra.Complex32;
using LinearAlgebra.Generic;
using NUnit.Framework;
using Complex32 = Numerics.Complex32;
[TestFixture]
public class MatrixStructureTheory : MatrixStructureTheory<Complex32>
{
[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[,] {{-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}}),
new DenseMatrix(new[,] {{-1.1f, -2.2f}, {Complex32.Zero, 1.1f}, {-4.4f, 5.5f}}),
new DenseMatrix(new[,] {{-1.1f, -2.2f, -3.3f}, {0f, new Complex32(1.1f, 0.1f), 2.2f}}),
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[,] {{-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 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 };
protected override Matrix<Complex32> CreateDense(int rows, int columns)
{
return new DenseMatrix(rows, columns);
}
protected override Matrix<Complex32> CreateSparse(int rows, int columns)
{
return new SparseMatrix(rows, columns);
}
protected override Vector<Complex32> CreateVector(int size)
{
return new DenseVector(size);
}
}
}

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

@ -36,326 +36,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32
/// </summary>
public abstract partial class MatrixTests : MatrixLoader
{
/// <summary>
/// Can clone a matrix.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanCloneMatrix(string name)
{
var matrix = CreateMatrix(TestData2D[name]);
var clone = matrix.Clone();
Assert.AreNotSame(matrix, clone);
Assert.AreEqual(matrix.RowCount, clone.RowCount);
Assert.AreEqual(matrix.ColumnCount, clone.ColumnCount);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[i, j], clone[i, j]);
}
}
}
/// <summary>
/// Can clone a matrix using <c>ICloneable</c> interface.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanCloneMatrixUsingICloneable(string name)
{
var matrix = TestMatrices[name];
var clone = (Matrix<Complex32>)((ICloneable)matrix).Clone();
Assert.AreNotSame(matrix, clone);
Assert.AreEqual(matrix.RowCount, clone.RowCount);
Assert.AreEqual(matrix.ColumnCount, clone.ColumnCount);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[i, j], clone[i, j]);
}
}
}
/// <summary>
/// Can copy a matrix to another matrix.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanCopyTo(string name)
{
var matrix = TestMatrices[name];
var copy = CreateMatrix(matrix.RowCount, matrix.ColumnCount);
matrix.CopyTo(copy);
Assert.AreNotSame(matrix, copy);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[i, j], copy[i, j]);
}
}
}
/// <summary>
/// Copy a matrix to another matrix fails when target is <c>null</c>.
/// </summary>
[Test]
public void CopyToWhenTargetIsNullThrowsArgumentNullException()
{
var matrix = TestMatrices["Singular3x3"];
Matrix<Complex32> target = null;
Assert.Throws<ArgumentNullException>(() => matrix.CopyTo(target));
}
/// <summary>
/// Copy a matrix to another matrix fails when target has more rows.
/// </summary>
[Test]
public void CopyToWhenTargetHasMoreRowsThrowsArgumentException()
{
var matrix = TestMatrices["Singular3x3"];
var target = CreateMatrix(matrix.RowCount + 1, matrix.ColumnCount);
Assert.Throws<ArgumentException>(() => matrix.CopyTo(target));
}
/// <summary>
/// Copy a matrix to another matrix fails when target has more columns.
/// </summary>
[Test]
public void CopyToWhenTargetHasMoreColumnsThrowsArgumentException()
{
var matrix = TestMatrices["Singular3x3"];
var target = CreateMatrix(matrix.RowCount + 1, matrix.ColumnCount);
Assert.Throws<ArgumentException>(() => matrix.CopyTo(target));
}
/// <summary>
/// Can create a matrix.
/// </summary>
[Test]
public void CanCreateMatrix()
{
var expected = CreateMatrix(5, 6);
var actual = expected.CreateMatrix(5, 6);
Assert.AreEqual(expected.GetType(), actual.GetType(), "Matrices are same type.");
}
/// <summary>
/// Can equate matrices.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanEquateMatrices(string name)
{
var matrix1 = CreateMatrix(TestData2D[name]);
var matrix2 = CreateMatrix(TestData2D[name]);
var matrix3 = CreateMatrix(TestData2D[name].GetLength(0), TestData2D[name].GetLength(1));
Assert.IsTrue(matrix1.Equals(matrix1));
Assert.IsTrue(matrix1.Equals(matrix2));
Assert.IsFalse(matrix1.Equals(matrix3));
Assert.IsFalse(matrix1.Equals(null));
}
/// <summary>
/// Create a matrix throws <c>ArgumentOutOfRangeException</c> if size is not positive.
/// </summary>
/// <param name="rows">The number of rows.</param>
/// <param name="columns">The number of columns.</param>
[TestCase(0, 2)]
[TestCase(2, 0)]
[TestCase(0, 0)]
[TestCase(-1, 1)]
[TestCase(1, -1)]
public void IfSizeIsNotPositiveThrowsArgumentException(int rows, int columns)
{
Assert.Throws<ArgumentOutOfRangeException>(() => CreateMatrix(rows, columns));
}
/// <summary>
/// Testing for equality with non-matrix returns <c>false</c>.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void TestingForEqualityWithNonMatrixReturnsFalse(string name)
{
var matrix = CreateMatrix(TestData2D[name]);
Assert.IsFalse(matrix.Equals(2));
}
/// <summary>
/// Can test for equality using Object.Equals.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanTestForEqualityUsingObjectEquals(string name)
{
var matrix1 = CreateMatrix(TestData2D[name]);
var matrix2 = CreateMatrix(TestData2D[name]);
Assert.IsTrue(matrix1.Equals((object)matrix2));
}
/// <summary>
/// Range check fails with wrong parameters.
/// </summary>
/// <param name="i">Row index.</param>
/// <param name="j">Column index.</param>
/// <param name="name">Matrix name.</param>
[TestCase(-1, 1, "Singular3x3")]
[TestCase(1, -1, "Singular3x3")]
[TestCase(4, 2, "Square3x3")]
public void RangeCheckWithInvalidIndicesThrowsArgumentOutOfRangeException(int i, int j, string name)
{
Assert.Throws<ArgumentOutOfRangeException>(() => { var x = TestMatrices[name][i, j]; });
}
/// <summary>
/// Can get matrix hash code.
/// </summary>
[Test]
public void CanMatrixGetHashCode()
{
var hash = TestMatrices["Singular3x3"].GetHashCode();
}
/// <summary>
/// Can clear matrix.
/// </summary>
[Test]
public void CanClearMatrix()
{
var matrix = TestMatrices["Singular3x3"].Clone();
matrix.Clear();
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(Complex32.Zero, matrix[i, j]);
}
}
}
/// <summary>
/// Can get a row of a matrix.
/// </summary>
/// <param name="rowIndex">Row index.</param>
/// <param name="name">Matrix name.</param>
[TestCase(0, "Singular3x3")]
[TestCase(1, "Square3x3")]
[TestCase(2, "Square3x3")]
public void CanGetRow(int rowIndex, string name)
{
var matrix = TestMatrices[name];
var row = matrix.Row(rowIndex);
Assert.AreEqual(matrix.ColumnCount, row.Count);
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[rowIndex, j], row[j]);
}
}
/// <summary>
/// Get row throws ArgumentOutOfRange with negative index.
/// </summary>
[Test]
public void GetRowWithNegativeIndexThrowsArgumentOutOfRange()
{
var matrix = TestMatrices["Singular3x3"];
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.Row(-1));
}
/// <summary>
/// Get row throws <c>ArgumentOutOfRangeException</c> with overflowing row index.
/// </summary>
[Test]
public void GetRowWithOverflowingRowIndexThrowsArgumentOutOfRange()
{
var matrix = TestMatrices["Singular3x3"];
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.Row(matrix.RowCount));
}
/// <summary>
/// Can get row of a matrix into a result vector.
/// </summary>
/// <param name="rowIndex">Row index.</param>
/// <param name="name">Matrix name.</param>
[TestCase(0, "Singular3x3")]
[TestCase(1, "Square3x3")]
[TestCase(2, "Square3x3")]
public void CanGetRowIntoResult(int rowIndex, string name)
{
var matrix = TestMatrices[name];
var row = CreateVector(matrix.ColumnCount);
matrix.Row(rowIndex, row);
Assert.AreEqual(matrix.ColumnCount, row.Count);
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[rowIndex, j], row[j]);
}
}
/// <summary>
/// Get row of a matrix into <c>null</c> result vector throws <c>ArgumentNullException</c>.
/// </summary>
[Test]
public void GetRowWhenResultIsNullThrowsArgumentNullException()
{
var matrix = TestMatrices["Singular3x3"];
Assert.Throws<ArgumentNullException>(() => matrix.Row(0, null));
}
/// <summary>
/// Get row into a result with the negative row index throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void GetRowIntoResultWithNegativeRowIndexThrowsArgumentOutOfRangeException()
{
var matrix = TestMatrices["Singular3x3"];
var row = CreateVector(matrix.ColumnCount);
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.Row(-1, row));
}
/// <summary>
/// Get row into a vector with overflowing row index throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void GetRowIntoResultWithOverflowingRowIndexThrowsArgumentOutOfRangeException()
{
var matrix = TestMatrices["Singular3x3"];
var row = CreateVector(matrix.ColumnCount);
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.Row(matrix.RowCount, row));
}
/// <summary>
/// Can get a row at specific start position and length of a matrix into a vector.
/// </summary>

49
src/UnitTests/LinearAlgebraTests/Double/MatrixStructureTheory.cs

@ -0,0 +1,49 @@
namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double
{
using LinearAlgebra.Double;
using LinearAlgebra.Generic;
using NUnit.Framework;
[TestFixture]
public class MatrixStructureTheory : MatrixStructureTheory<double>
{
[Datapoints]
Matrix<double>[] _matrices = new Matrix<double>[]
{
new DenseMatrix(new[,] {{1d, 1d, 2d}, {1d, 1d, 2d}, {1d, 1d, 2d}}),
new DenseMatrix(new[,] {{-1.1d, -2.2d, -3.3d}, {0d, 1.1d, 2.2d}, {-4.4d, 5.5d, 6.6d}}),
new DenseMatrix(new[,] {{-1.1d, -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, -2.2d, -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}}),
new DenseMatrix(new[,] {{-1.1d, -2.2d}, {0d, 1.1d}, {-4.4d, 5.5d}}),
new DenseMatrix(new[,] {{-1.1d, -2.2d, -3.3d}, {0d, 1.1d, 2.2d}}),
new DenseMatrix(new[,] {{1d, 2d, 3d}, {2d, 2d, 0d}, {3d, 0d, 3d}}),
new SparseMatrix(new[,] {{7d, 1d, 2d}, {1d, 1d, 2d}, {1d, 1d, 2d}}),
new SparseMatrix(new[,] {{7d, 1d, 2d}, {1d, 0d, 0d}, {-2d, 0d, 0d}}),
new SparseMatrix(new[,] {{-1.1d, 0d, 0d}, {0d, 1.1d, 2.2d}}),
new DiagonalMatrix(3, 3, new[] {1d, -2d, 1.5d}),
new DiagonalMatrix(3, 3, new[] {1d, 0d, -1.5d}),
new UserDefinedMatrix(new[,] {{0d, 1d, 2d}, {-1d, 7.7d, 0d}, {-2d, 0d, 0d}})
};
[Datapoints]
double[] _scalars = new[] {2d, -1.5d, 0d};
protected override Matrix<double> CreateDense(int rows, int columns)
{
return new DenseMatrix(rows, columns);
}
protected override Matrix<double> CreateSparse(int rows, int columns)
{
return new SparseMatrix(rows, columns);
}
protected override Vector<double> CreateVector(int size)
{
return new DenseVector(size);
}
}
}

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

@ -35,326 +35,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double
/// </summary>
public abstract partial class MatrixTests : MatrixLoader
{
/// <summary>
/// Can clone a matrix.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanCloneMatrix(string name)
{
var matrix = CreateMatrix(TestData2D[name]);
var clone = matrix.Clone();
Assert.AreNotSame(matrix, clone);
Assert.AreEqual(matrix.RowCount, clone.RowCount);
Assert.AreEqual(matrix.ColumnCount, clone.ColumnCount);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[i, j], clone[i, j]);
}
}
}
/// <summary>
/// Can clone a matrix using <c>ICloneable</c> interface.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanCloneMatrixUsingICloneable(string name)
{
var matrix = TestMatrices[name];
var clone = (Matrix<double>)((ICloneable)matrix).Clone();
Assert.AreNotSame(matrix, clone);
Assert.AreEqual(matrix.RowCount, clone.RowCount);
Assert.AreEqual(matrix.ColumnCount, clone.ColumnCount);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[i, j], clone[i, j]);
}
}
}
/// <summary>
/// Can copy a matrix to another matrix.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanCopyTo(string name)
{
var matrix = TestMatrices[name];
var copy = CreateMatrix(matrix.RowCount, matrix.ColumnCount);
matrix.CopyTo(copy);
Assert.AreNotSame(matrix, copy);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[i, j], copy[i, j]);
}
}
}
/// <summary>
/// Copy a matrix to another matrix fails when target is <c>null</c>.
/// </summary>
[Test]
public void CopyToWhenTargetIsNullThrowsArgumentNullException()
{
var matrix = TestMatrices["Singular3x3"];
Matrix<double> target = null;
Assert.Throws<ArgumentNullException>(() => matrix.CopyTo(target));
}
/// <summary>
/// Copy a matrix to another matrix fails when target has more rows.
/// </summary>
[Test]
public void CopyToWhenTargetHasMoreRowsThrowsArgumentException()
{
var matrix = TestMatrices["Singular3x3"];
var target = CreateMatrix(matrix.RowCount + 1, matrix.ColumnCount);
Assert.Throws<ArgumentException>(() => matrix.CopyTo(target));
}
/// <summary>
/// Copy a matrix to another matrix fails when target has more columns.
/// </summary>
[Test]
public void CopyToWhenTargetHasMoreColumnsThrowsArgumentException()
{
var matrix = TestMatrices["Singular3x3"];
var target = CreateMatrix(matrix.RowCount + 1, matrix.ColumnCount);
Assert.Throws<ArgumentException>(() => matrix.CopyTo(target));
}
/// <summary>
/// Can create a matrix.
/// </summary>
[Test]
public void CanCreateMatrix()
{
var expected = CreateMatrix(5, 6);
var actual = expected.CreateMatrix(5, 6);
Assert.AreEqual(expected.GetType(), actual.GetType(), "Matrices are same type.");
}
/// <summary>
/// Can equate matrices.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanEquateMatrices(string name)
{
var matrix1 = CreateMatrix(TestData2D[name]);
var matrix2 = CreateMatrix(TestData2D[name]);
var matrix3 = CreateMatrix(TestData2D[name].GetLength(0), TestData2D[name].GetLength(1));
Assert.IsTrue(matrix1.Equals(matrix1));
Assert.IsTrue(matrix1.Equals(matrix2));
Assert.IsFalse(matrix1.Equals(matrix3));
Assert.IsFalse(matrix1.Equals(null));
}
/// <summary>
/// Create a matrix throws <c>ArgumentOutOfRangeException</c> if size is not positive.
/// </summary>
/// <param name="rows">The number of rows.</param>
/// <param name="columns">The number of columns.</param>
[TestCase(0, 2)]
[TestCase(2, 0)]
[TestCase(0, 0)]
[TestCase(-1, 1)]
[TestCase(1, -1)]
public void IfSizeIsNotPositiveThrowsArgumentException(int rows, int columns)
{
Assert.Throws<ArgumentOutOfRangeException>(() => CreateMatrix(rows, columns));
}
/// <summary>
/// Testing for equality with non-matrix returns <c>false</c>.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void TestingForEqualityWithNonMatrixReturnsFalse(string name)
{
var matrix = CreateMatrix(TestData2D[name]);
Assert.IsFalse(matrix.Equals(2));
}
/// <summary>
/// Can test for equality using Object.Equals.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanTestForEqualityUsingObjectEquals(string name)
{
var matrix1 = CreateMatrix(TestData2D[name]);
var matrix2 = CreateMatrix(TestData2D[name]);
Assert.IsTrue(matrix1.Equals((object)matrix2));
}
/// <summary>
/// Range check fails with wrong parameters.
/// </summary>
/// <param name="i">Row index.</param>
/// <param name="j">Column index.</param>
/// <param name="name">Matrix name.</param>
[TestCase(-1, 1, "Singular3x3")]
[TestCase(1, -1, "Singular3x3")]
[TestCase(4, 2, "Square3x3")]
public void RangeCheckWithInvalidIndicesThrowsArgumentOutOfRangeException(int i, int j, string name)
{
Assert.Throws<ArgumentOutOfRangeException>(() => { var x = TestMatrices[name][i, j]; });
}
/// <summary>
/// Can get matrix hash code.
/// </summary>
[Test]
public void CanMatrixGetHashCode()
{
var hash = TestMatrices["Singular3x3"].GetHashCode();
}
/// <summary>
/// Can clear matrix.
/// </summary>
[Test]
public void CanClearMatrix()
{
var matrix = TestMatrices["Singular3x3"].Clone();
matrix.Clear();
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(0, matrix[i, j]);
}
}
}
/// <summary>
/// Can get a row of a matrix.
/// </summary>
/// <param name="rowIndex">Row index.</param>
/// <param name="name">Matrix name.</param>
[TestCase(0, "Singular3x3")]
[TestCase(1, "Square3x3")]
[TestCase(2, "Square3x3")]
public void CanGetRow(int rowIndex, string name)
{
var matrix = TestMatrices[name];
var row = matrix.Row(rowIndex);
Assert.AreEqual(matrix.ColumnCount, row.Count);
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[rowIndex, j], row[j]);
}
}
/// <summary>
/// Get row throws ArgumentOutOfRange with negative index.
/// </summary>
[Test]
public void GetRowWithNegativeIndexThrowsArgumentOutOfRange()
{
var matrix = TestMatrices["Singular3x3"];
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.Row(-1));
}
/// <summary>
/// Get row throws <c>ArgumentOutOfRangeException</c> with overflowing row index.
/// </summary>
[Test]
public void GetRowWithOverflowingRowIndexThrowsArgumentOutOfRange()
{
var matrix = TestMatrices["Singular3x3"];
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.Row(matrix.RowCount));
}
/// <summary>
/// Can get row of a matrix into a result vector.
/// </summary>
/// <param name="rowIndex">Row index.</param>
/// <param name="name">Matrix name.</param>
[TestCase(0, "Singular3x3")]
[TestCase(1, "Square3x3")]
[TestCase(2, "Square3x3")]
public void CanGetRowIntoResult(int rowIndex, string name)
{
var matrix = TestMatrices[name];
var row = CreateVector(matrix.ColumnCount);
matrix.Row(rowIndex, row);
Assert.AreEqual(matrix.ColumnCount, row.Count);
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[rowIndex, j], row[j]);
}
}
/// <summary>
/// Get row of a matrix into <c>null</c> result vector throws <c>ArgumentNullException</c>.
/// </summary>
[Test]
public void GetRowWhenResultIsNullThrowsArgumentNullException()
{
var matrix = TestMatrices["Singular3x3"];
Assert.Throws<ArgumentNullException>(() => matrix.Row(0, null));
}
/// <summary>
/// Get row into a result with the negative row index throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void GetRowIntoResultWithNegativeRowIndexThrowsArgumentOutOfRangeException()
{
var matrix = TestMatrices["Singular3x3"];
var row = CreateVector(matrix.ColumnCount);
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.Row(-1, row));
}
/// <summary>
/// Get row into a vector with overflowing row index throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void GetRowIntoResultWithOverflowingRowIndexThrowsArgumentOutOfRangeException()
{
var matrix = TestMatrices["Singular3x3"];
var row = CreateVector(matrix.ColumnCount);
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.Row(matrix.RowCount, row));
}
/// <summary>
/// Can get a row at specific start position and length of a matrix into a vector.
/// </summary>

159
src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs

@ -0,0 +1,159 @@
namespace MathNet.Numerics.UnitTests.LinearAlgebraTests
{
using System;
using LinearAlgebra.Generic;
using NUnit.Framework;
[TestFixture]
public abstract class MatrixStructureTheory<T>
where T : struct, IEquatable<T>, IFormattable
{
protected abstract Matrix<T> CreateDense(int rows, int columns);
protected abstract Matrix<T> CreateSparse(int rows, int columns);
protected abstract Vector<T> CreateVector(int size);
[Theory, Timeout(200)]
public void IsEqualToItself(Matrix<T> matrix)
{
Assert.That(matrix, Is.EqualTo(matrix));
Assert.IsTrue(matrix.Equals(matrix));
Assert.IsTrue(matrix.Equals((object) matrix));
Assert.IsTrue(((object) matrix).Equals(matrix));
Assert.IsTrue(matrix == (object) matrix);
Assert.IsTrue((object) matrix == matrix);
}
[Theory, Timeout(200)]
public void IsNotEqualToOthers(Matrix<T> left, Matrix<T> right)
{
// IF (assuming we don't have duplicate data points)
Assume.That(left, Is.Not.SameAs(right));
// THEN
Assert.That(left, Is.Not.EqualTo(right));
Assert.IsFalse(left.Equals(right));
Assert.IsFalse(left.Equals((object) right));
Assert.IsFalse(((object) left).Equals(right));
Assert.IsFalse(left == (object) right);
Assert.IsFalse((object) left == right);
}
[Theory, Timeout(200)]
public void IsNotEqualToNonMatrixType(Matrix<T> matrix)
{
Assert.That(matrix, Is.Not.EqualTo(2));
Assert.IsFalse(matrix.Equals(2));
Assert.IsFalse(matrix.Equals((object)2));
Assert.IsFalse(((object)matrix).Equals(2));
Assert.IsFalse(matrix == (object)2);
}
[Theory, Timeout(200)]
public void CanClone(Matrix<T> matrix)
{
var clone = matrix.Clone();
Assert.That(clone, Is.Not.SameAs(matrix));
Assert.That(clone, Is.EqualTo(matrix));
Assert.That(clone.RowCount, Is.EqualTo(matrix.RowCount));
Assert.That(clone.ColumnCount, Is.EqualTo(matrix.ColumnCount));
}
[Theory, Timeout(200)]
public void CanCloneUsingICloneable(Matrix<T> matrix)
{
var clone = (Matrix<T>) ((ICloneable) matrix).Clone();
Assert.That(clone, Is.Not.SameAs(matrix));
Assert.That(clone, Is.EqualTo(matrix));
Assert.That(clone.RowCount, Is.EqualTo(matrix.RowCount));
Assert.That(clone.ColumnCount, Is.EqualTo(matrix.ColumnCount));
}
[Theory, Timeout(200)]
public void CanCopyTo(Matrix<T> matrix)
{
var dense = CreateDense(matrix.RowCount, matrix.ColumnCount);
matrix.CopyTo(dense);
Assert.That(dense, Is.EqualTo(matrix));
var sparse = CreateSparse(matrix.RowCount, matrix.ColumnCount);
matrix.CopyTo(sparse);
Assert.That(sparse, Is.EqualTo(matrix));
// null arg
Assert.That(() => matrix.CopyTo(null), Throws.InstanceOf<ArgumentNullException>());
// bad arg
Assert.That(() => matrix.CopyTo(CreateDense(matrix.RowCount + 1, matrix.ColumnCount)), Throws.ArgumentException);
Assert.That(() => matrix.CopyTo(CreateDense(matrix.RowCount, matrix.ColumnCount + 1)), Throws.ArgumentException);
}
[Theory, Timeout(200)]
public void CanCreateSameType(Matrix<T> matrix)
{
var empty = matrix.CreateMatrix(5, 6);
Assert.That(empty, Is.EqualTo(CreateDense(5, 6)));
Assert.That(empty.GetType(), Is.EqualTo(matrix.GetType()));
Assert.That(() => matrix.CreateMatrix(0, 2), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.CreateMatrix(2, 0), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.CreateMatrix(-1, -1), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public void CanGetHashCode(Matrix<T> matrix)
{
Assert.That(matrix.GetHashCode(), Is.Not.EqualTo(matrix.CreateMatrix(matrix.RowCount, matrix.ColumnCount).GetHashCode()));
}
[Theory, Timeout(200)]
public void CanClear(Matrix<T> matrix)
{
var cleared = matrix.Clone();
cleared.Clear();
Assert.That(cleared, Is.EqualTo(matrix.CreateMatrix(matrix.RowCount, matrix.ColumnCount)));
}
[Theory, Timeout(200)]
public void CanGetFieldsByIndex(Matrix<T> matrix)
{
Assert.That(() => { var x = matrix[0, 0]; }, Throws.Nothing);
Assert.That(() => { var x = matrix[0, matrix.ColumnCount - 1]; }, Throws.Nothing);
Assert.That(() => { var x = matrix[matrix.RowCount - 1, 0]; }, Throws.Nothing);
Assert.That(() => { var x = matrix[-1, 1]; }, Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => { var x = matrix[1, -1]; }, Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => { var x = matrix[0, matrix.ColumnCount]; }, Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Theory, Timeout(200)]
public void CanGetRow(Matrix<T> matrix, [Values(0, 1, 1000)]int rowIndex)
{
var actualRow = Math.Min(rowIndex, matrix.RowCount - 1);
var row = matrix.Row(actualRow);
Assert.That(row.Count, Is.EqualTo(matrix.ColumnCount));
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[actualRow, j], row[j]);
}
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>());
}
}
}

49
src/UnitTests/LinearAlgebraTests/Single/MatrixStructureTheory.cs

@ -0,0 +1,49 @@
namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single
{
using LinearAlgebra.Single;
using LinearAlgebra.Generic;
using NUnit.Framework;
[TestFixture]
public class MatrixStructureTheory : MatrixStructureTheory<float>
{
[Datapoints]
Matrix<float>[] _matrices = new Matrix<float>[]
{
new DenseMatrix(new[,] {{1f, 1f, 2f}, {1f, 1f, 2f}, {1f, 1f, 2f}}),
new DenseMatrix(new[,] {{-1.1f, -2.2f, -3.3f}, {0f, 1.1f, 2.2f}, {-4.4f, 5.5f, 6.6f}}),
new DenseMatrix(new[,] {{-1.1f, -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, -2.2f, -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}}),
new DenseMatrix(new[,] {{-1.1f, -2.2f}, {0f, 1.1f}, {-4.4f, 5.5f}}),
new DenseMatrix(new[,] {{-1.1f, -2.2f, -3.3f}, {0f, 1.1f, 2.2f}}),
new DenseMatrix(new[,] {{1f, 2f, 3f}, {2f, 2f, 0f}, {3f, 0f, 3f}}),
new SparseMatrix(new[,] {{7f, 1f, 2f}, {1f, 1f, 2f}, {1f, 1f, 2f}}),
new SparseMatrix(new[,] {{7f, 1f, 2f}, {1f, 0f, 0f}, {-2f, 0f, 0f}}),
new SparseMatrix(new[,] {{-1.1f, 0f, 0f}, {0f, 1.1f, 2.2f}}),
new DiagonalMatrix(3, 3, new[] {1f, -2f, 1.5f}),
new DiagonalMatrix(3, 3, new[] {1f, 0f, -1.5f}),
new UserDefinedMatrix(new[,] {{0f, 1f, 2f}, {-1f, 7.7f, 0f}, {-2f, 0f, 0f}})
};
[Datapoints]
float[] _scalars = new[] {2f, -1.5f, 0f};
protected override Matrix<float> CreateDense(int rows, int columns)
{
return new DenseMatrix(rows, columns);
}
protected override Matrix<float> CreateSparse(int rows, int columns)
{
return new SparseMatrix(rows, columns);
}
protected override Vector<float> CreateVector(int size)
{
return new DenseVector(size);
}
}
}

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

@ -35,326 +35,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single
/// </summary>
public abstract partial class MatrixTests : MatrixLoader
{
/// <summary>
/// Can clone a matrix.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanCloneMatrix(string name)
{
var matrix = CreateMatrix(TestData2D[name]);
var clone = matrix.Clone();
Assert.AreNotSame(matrix, clone);
Assert.AreEqual(matrix.RowCount, clone.RowCount);
Assert.AreEqual(matrix.ColumnCount, clone.ColumnCount);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[i, j], clone[i, j]);
}
}
}
/// <summary>
/// Can clone a matrix using <c>ICloneable</c> interface.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanCloneMatrixUsingICloneable(string name)
{
var matrix = TestMatrices[name];
var clone = (Matrix<float>)((ICloneable)matrix).Clone();
Assert.AreNotSame(matrix, clone);
Assert.AreEqual(matrix.RowCount, clone.RowCount);
Assert.AreEqual(matrix.ColumnCount, clone.ColumnCount);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[i, j], clone[i, j]);
}
}
}
/// <summary>
/// Can copy a matrix to another matrix.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanCopyTo(string name)
{
var matrix = TestMatrices[name];
var copy = CreateMatrix(matrix.RowCount, matrix.ColumnCount);
matrix.CopyTo(copy);
Assert.AreNotSame(matrix, copy);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[i, j], copy[i, j]);
}
}
}
/// <summary>
/// Copy a matrix to another matrix fails when target is <c>null</c>.
/// </summary>
[Test]
public void CopyToWhenTargetIsNullThrowsArgumentNullException()
{
var matrix = TestMatrices["Singular3x3"];
Matrix<float> target = null;
Assert.Throws<ArgumentNullException>(() => matrix.CopyTo(target));
}
/// <summary>
/// Copy a matrix to another matrix fails when target has more rows.
/// </summary>
[Test]
public void CopyToWhenTargetHasMoreRowsThrowsArgumentException()
{
var matrix = TestMatrices["Singular3x3"];
var target = CreateMatrix(matrix.RowCount + 1, matrix.ColumnCount);
Assert.Throws<ArgumentException>(() => matrix.CopyTo(target));
}
/// <summary>
/// Copy a matrix to another matrix fails when target has more columns.
/// </summary>
[Test]
public void CopyToWhenTargetHasMoreColumnsThrowsArgumentException()
{
var matrix = TestMatrices["Singular3x3"];
var target = CreateMatrix(matrix.RowCount + 1, matrix.ColumnCount);
Assert.Throws<ArgumentException>(() => matrix.CopyTo(target));
}
/// <summary>
/// Can create a matrix.
/// </summary>
[Test]
public void CanCreateMatrix()
{
var expected = CreateMatrix(5, 6);
var actual = expected.CreateMatrix(5, 6);
Assert.AreEqual(expected.GetType(), actual.GetType(), "Matrices are same type.");
}
/// <summary>
/// Can equate matrices.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanEquateMatrices(string name)
{
var matrix1 = CreateMatrix(TestData2D[name]);
var matrix2 = CreateMatrix(TestData2D[name]);
var matrix3 = CreateMatrix(TestData2D[name].GetLength(0), TestData2D[name].GetLength(1));
Assert.IsTrue(matrix1.Equals(matrix1));
Assert.IsTrue(matrix1.Equals(matrix2));
Assert.IsFalse(matrix1.Equals(matrix3));
Assert.IsFalse(matrix1.Equals(null));
}
/// <summary>
/// Create a matrix throws <c>ArgumentOutOfRangeException</c> if size is not positive.
/// </summary>
/// <param name="rows">The number of rows.</param>
/// <param name="columns">The number of columns.</param>
[TestCase(0, 2)]
[TestCase(2, 0)]
[TestCase(0, 0)]
[TestCase(-1, 1)]
[TestCase(1, -1)]
public void IfSizeIsNotPositiveThrowsArgumentException(int rows, int columns)
{
Assert.Throws<ArgumentOutOfRangeException>(() => CreateMatrix(rows, columns));
}
/// <summary>
/// Testing for equality with non-matrix returns <c>false</c>.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void TestingForEqualityWithNonMatrixReturnsFalse(string name)
{
var matrix = CreateMatrix(TestData2D[name]);
Assert.IsFalse(matrix.Equals(2));
}
/// <summary>
/// Can test for equality using Object.Equals.
/// </summary>
/// <param name="name">Matrix name.</param>
[TestCase("Singular3x3")]
[TestCase("Square3x3")]
[TestCase("Square4x4")]
[TestCase("Tall3x2")]
[TestCase("Wide2x3")]
public void CanTestForEqualityUsingObjectEquals(string name)
{
var matrix1 = CreateMatrix(TestData2D[name]);
var matrix2 = CreateMatrix(TestData2D[name]);
Assert.IsTrue(matrix1.Equals((object)matrix2));
}
/// <summary>
/// Range check fails with wrong parameters.
/// </summary>
/// <param name="i">Row index.</param>
/// <param name="j">Column index.</param>
/// <param name="name">Matrix name.</param>
[TestCase(-1, 1, "Singular3x3")]
[TestCase(1, -1, "Singular3x3")]
[TestCase(4, 2, "Square3x3")]
public void RangeCheckWithInvalidIndicesThrowsArgumentOutOfRangeException(int i, int j, string name)
{
Assert.Throws<ArgumentOutOfRangeException>(() => { var x = TestMatrices[name][i, j]; });
}
/// <summary>
/// Can get matrix hash code.
/// </summary>
[Test]
public void CanMatrixGetHashCode()
{
var hash = TestMatrices["Singular3x3"].GetHashCode();
}
/// <summary>
/// Can clear matrix.
/// </summary>
[Test]
public void CanClearMatrix()
{
var matrix = TestMatrices["Singular3x3"].Clone();
matrix.Clear();
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(0, matrix[i, j]);
}
}
}
/// <summary>
/// Can get a row of a matrix.
/// </summary>
/// <param name="rowIndex">Row index.</param>
/// <param name="name">Matrix name.</param>
[TestCase(0, "Singular3x3")]
[TestCase(1, "Square3x3")]
[TestCase(2, "Square3x3")]
public void CanGetRow(int rowIndex, string name)
{
var matrix = TestMatrices[name];
var row = matrix.Row(rowIndex);
Assert.AreEqual(matrix.ColumnCount, row.Count);
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[rowIndex, j], row[j]);
}
}
/// <summary>
/// Get row throws ArgumentOutOfRange with negative index.
/// </summary>
[Test]
public void GetRowWithNegativeIndexThrowsArgumentOutOfRange()
{
var matrix = TestMatrices["Singular3x3"];
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.Row(-1));
}
/// <summary>
/// Get row throws <c>ArgumentOutOfRangeException</c> with overflowing row index.
/// </summary>
[Test]
public void GetRowWithOverflowingRowIndexThrowsArgumentOutOfRange()
{
var matrix = TestMatrices["Singular3x3"];
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.Row(matrix.RowCount));
}
/// <summary>
/// Can get row of a matrix into a result vector.
/// </summary>
/// <param name="rowIndex">Row index.</param>
/// <param name="name">Matrix name.</param>
[TestCase(0, "Singular3x3")]
[TestCase(1, "Square3x3")]
[TestCase(2, "Square3x3")]
public void CanGetRowIntoResult(int rowIndex, string name)
{
var matrix = TestMatrices[name];
var row = CreateVector(matrix.ColumnCount);
matrix.Row(rowIndex, row);
Assert.AreEqual(matrix.ColumnCount, row.Count);
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(matrix[rowIndex, j], row[j]);
}
}
/// <summary>
/// Get row of a matrix into <c>null</c> result vector throws <c>ArgumentNullException</c>.
/// </summary>
[Test]
public void GetRowWhenResultIsNullThrowsArgumentNullException()
{
var matrix = TestMatrices["Singular3x3"];
Assert.Throws<ArgumentNullException>(() => matrix.Row(0, null));
}
/// <summary>
/// Get row into a result with the negative row index throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void GetRowIntoResultWithNegativeRowIndexThrowsArgumentOutOfRangeException()
{
var matrix = TestMatrices["Singular3x3"];
var row = CreateVector(matrix.ColumnCount);
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.Row(-1, row));
}
/// <summary>
/// Get row into a vector with overflowing row index throws <c>ArgumentOutOfRangeException</c>.
/// </summary>
[Test]
public void GetRowIntoResultWithOverflowingRowIndexThrowsArgumentOutOfRangeException()
{
var matrix = TestMatrices["Singular3x3"];
var row = CreateVector(matrix.ColumnCount);
Assert.Throws<ArgumentOutOfRangeException>(() => matrix.Row(matrix.RowCount, row));
}
/// <summary>
/// Can get a row at specific start position and length of a matrix into a vector.
/// </summary>

5
src/UnitTests/UnitTests.csproj

@ -197,6 +197,7 @@
<Compile Include="LinearAlgebraTests\Complex32\MatrixLoader.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="LinearAlgebraTests\Complex32\MatrixStructureTheory.cs" />
<Compile Include="LinearAlgebraTests\Complex32\MatrixTests.Arithmetic.cs">
<SubType>Code</SubType>
</Compile>
@ -344,6 +345,7 @@
<Compile Include="LinearAlgebraTests\Complex\MatrixLoader.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="LinearAlgebraTests\Complex\MatrixStructureTheory.cs" />
<Compile Include="LinearAlgebraTests\Complex\MatrixTests.Arithmetic.cs">
<SubType>Code</SubType>
</Compile>
@ -427,6 +429,7 @@
<Compile Include="LinearAlgebraTests\Complex\VectorTests.Norm.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="LinearAlgebraTests\Double\MatrixStructureTheory.cs" />
<Compile Include="LinearAlgebraTests\Double\SparseVectorArithmeticTheory.cs" />
<Compile Include="LinearAlgebraTests\Double\DenseMatrixTests.cs">
<SubType>Code</SubType>
@ -573,6 +576,7 @@
<Compile Include="LinearAlgebraTests\Double\VectorTests.Norm.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="LinearAlgebraTests\MatrixStructureTheory.cs" />
<Compile Include="LinearAlgebraTests\Single\DenseMatrixTests.cs">
<SubType>Code</SubType>
</Compile>
@ -637,6 +641,7 @@
<Compile Include="LinearAlgebraTests\Single\MatrixLoader.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="LinearAlgebraTests\Single\MatrixStructureTheory.cs" />
<Compile Include="LinearAlgebraTests\Single\MatrixTests.Arithmetic.cs">
<SubType>Code</SubType>
</Compile>

Loading…
Cancel
Save