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