Browse Source

LA Storage: enforce MatrixStorage

pull/47/head
Christoph Ruegg 14 years ago
parent
commit
55d50fb8fd
  1. 58
      src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs
  2. 54
      src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs
  3. 15
      src/Numerics/LinearAlgebra/Complex/Matrix.cs
  4. 62
      src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs
  5. 58
      src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs
  6. 43
      src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs
  7. 21
      src/Numerics/LinearAlgebra/Complex32/Matrix.cs
  8. 62
      src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs
  9. 58
      src/Numerics/LinearAlgebra/Double/DenseMatrix.cs
  10. 54
      src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs
  11. 22
      src/Numerics/LinearAlgebra/Double/Matrix.cs
  12. 64
      src/Numerics/LinearAlgebra/Double/SparseMatrix.cs
  13. 55
      src/Numerics/LinearAlgebra/Generic/Matrix.cs
  14. 58
      src/Numerics/LinearAlgebra/Single/DenseMatrix.cs
  15. 43
      src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs
  16. 21
      src/Numerics/LinearAlgebra/Single/Matrix.cs
  17. 62
      src/Numerics/LinearAlgebra/Single/SparseMatrix.cs
  18. 77
      src/Numerics/LinearAlgebra/Storage/DenseColumnMajorMatrixStorage.cs
  19. 51
      src/Numerics/LinearAlgebra/Storage/IMatrixStorage.cs
  20. 100
      src/Numerics/LinearAlgebra/Storage/MatrixStorage.cs
  21. 71
      src/Numerics/LinearAlgebra/Storage/SparseCompressedRowMatrixStorage.cs
  22. 76
      src/Numerics/LinearAlgebra/Storage/SparseDiagonalMatrixStorage.cs
  23. 2
      src/Numerics/Numerics.csproj
  24. 4
      src/Portable/Portable.csproj
  25. 60
      src/UnitTests/LinearAlgebraTests/Complex/UserDefinedMatrix.cs
  26. 60
      src/UnitTests/LinearAlgebraTests/Complex32/UserDefinedMatrix.cs
  27. 60
      src/UnitTests/LinearAlgebraTests/Double/UserDefinedMatrix.cs
  28. 60
      src/UnitTests/LinearAlgebraTests/Single/UserDefinedMatrix.cs

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

@ -61,6 +61,20 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <value>The matrix's data.</value>
readonly Complex[] _data;
internal DenseColumnMajorMatrixStorage<Complex> Raw
{
get { return _storage; }
}
internal DenseMatrix(DenseColumnMajorMatrixStorage<Complex> storage)
: base(storage)
{
_storage = storage;
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
}
/// <summary>
/// Initializes a new instance of the <see cref="DenseMatrix"/> class. This matrix is square with a given size.
/// </summary>
@ -69,13 +83,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// If <paramref name="order"/> is less than one.
/// </exception>
public DenseMatrix(int order)
: base(order)
: this(new DenseColumnMajorMatrixStorage<Complex>(order, order))
{
_storage = new DenseColumnMajorMatrixStorage<Complex>(order, order);
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
}
/// <summary>
@ -88,13 +97,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// The number of columns.
/// </param>
public DenseMatrix(int rows, int columns)
: base(rows, columns)
: this(new DenseColumnMajorMatrixStorage<Complex>(rows, columns))
{
_storage = new DenseColumnMajorMatrixStorage<Complex>(rows, columns);
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
}
/// <summary>
@ -108,14 +112,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// </param>
/// <param name="value">The value which we assign to each element of the matrix.</param>
public DenseMatrix(int rows, int columns, Complex value)
: base(rows, columns)
: this(rows, columns)
{
_storage = new DenseColumnMajorMatrixStorage<Complex>(rows, columns);
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
for (var i = 0; i < _data.Length; i++)
{
_data[i] = value;
@ -130,13 +128,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <param name="columns">The number of columns.</param>
/// <param name="array">The one dimensional array to create this matrix from. This array should store the matrix in column-major order. see: http://en.wikipedia.org/wiki/Row-major_order </param>
public DenseMatrix(int rows, int columns, Complex[] array)
: base(rows, columns)
: this(new DenseColumnMajorMatrixStorage<Complex>(rows, columns, array))
{
_storage = new DenseColumnMajorMatrixStorage<Complex>(rows, columns, array);
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
}
/// <summary>
@ -145,14 +138,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// </summary>
/// <param name="array">The 2D array to create this matrix from.</param>
public DenseMatrix(Complex[,] array)
: base(array.GetLength(0), array.GetLength(1))
: this(array.GetLength(0), array.GetLength(1))
{
_storage = new DenseColumnMajorMatrixStorage<Complex>(array.GetLength(0), array.GetLength(1));
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
for (var i = 0; i < _rowCount; i++)
{
for (var j = 0; j < _columnCount; j++)
@ -162,11 +149,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
}
}
internal DenseColumnMajorMatrixStorage<Complex> Storage
{
get { return _storage; }
}
/// <summary>
/// Gets the matrix's data.
/// </summary>
@ -222,7 +204,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
var denseTarget = target as DenseMatrix;
if (denseTarget != null)
{
_storage.CopyTo(denseTarget.Storage);
_storage.CopyTo(denseTarget.Raw);
return;
}

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

@ -54,6 +54,18 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <value>The matrix's data.</value>
readonly Complex[] _data;
internal SparseDiagonalMatrixStorage<Complex> Raw
{
get { return _storage; }
}
internal DiagonalMatrix(SparseDiagonalMatrixStorage<Complex> storage)
: base(storage)
{
_storage = storage;
_data = _storage.Data;
}
/// <summary>
/// Initializes a new instance of the <see cref="DiagonalMatrix"/> class. This matrix is square with a given size.
/// </summary>
@ -61,11 +73,10 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <exception cref="ArgumentException">
/// If <paramref name="order"/> is less than one.
/// </exception>
public DiagonalMatrix(int order) : base(order)
{
_storage = new SparseDiagonalMatrixStorage<Complex>(order, order, Complex.Zero);
_data = _storage.Data;
}
public DiagonalMatrix(int order)
: this(new SparseDiagonalMatrixStorage<Complex>(order, order, Complex.Zero))
{
}
/// <summary>
/// Initializes a new instance of the <see cref="DiagonalMatrix"/> class.
@ -76,10 +87,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <param name="columns">
/// The number of columns.
/// </param>
public DiagonalMatrix(int rows, int columns) : base(rows, columns)
public DiagonalMatrix(int rows, int columns)
: this(new SparseDiagonalMatrixStorage<Complex>(rows, columns, Complex.Zero))
{
_storage = new SparseDiagonalMatrixStorage<Complex>(rows, columns, Complex.Zero);
_data = _storage.Data;
}
/// <summary>
@ -92,11 +102,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// The number of columns.
/// </param>
/// <param name="value">The value which we assign to each diagonal element of the matrix.</param>
public DiagonalMatrix(int rows, int columns, Complex value) : base(rows, columns)
public DiagonalMatrix(int rows, int columns, Complex value)
: this(rows, columns)
{
_storage = new SparseDiagonalMatrixStorage<Complex>(rows, columns, Complex.Zero);
_data = _storage.Data;
for (var i = 0; i < _data.Length; i++)
{
_data[i] = value;
@ -110,10 +118,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <param name="rows">The number of rows.</param>
/// <param name="columns">The number of columns.</param>
/// <param name="diagonalArray">The one dimensional array which contain diagonal elements.</param>
public DiagonalMatrix(int rows, int columns, Complex[] diagonalArray) : base(rows, columns)
public DiagonalMatrix(int rows, int columns, Complex[] diagonalArray)
: this(new SparseDiagonalMatrixStorage<Complex>(rows, columns, Complex.Zero, diagonalArray))
{
_storage = new SparseDiagonalMatrixStorage<Complex>(rows, columns, Complex.Zero, diagonalArray);
_data = _storage.Data;
}
/// <summary>
@ -123,11 +130,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <exception cref="IndexOutOfRangeException">When <paramref name="array"/> contains an off-diagonal element.</exception>
/// <exception cref="IndexOutOfRangeException">Depending on the implementation, an <see cref="IndexOutOfRangeException"/>
/// may be thrown if one of the indices is outside the dimensions of the matrix.</exception>
public DiagonalMatrix(Complex[,] array) : this(array.GetLength(0), array.GetLength(1))
public DiagonalMatrix(Complex[,] array)
: this(array.GetLength(0), array.GetLength(1))
{
_storage = new SparseDiagonalMatrixStorage<Complex>(array.GetLength(0), array.GetLength(1), Complex.Zero);
_data = _storage.Data;
for (var i = 0; i < RowCount; i++)
{
for (var j = 0; j < ColumnCount; j++)
@ -144,11 +149,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
}
}
internal SparseDiagonalMatrixStorage<Complex> Storage
{
get { return _storage; }
}
/// <summary>
/// Gets or sets the value at the given row and column, with range checking.
/// </summary>
@ -806,21 +806,21 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
var diagonalTarget = target as DiagonalMatrix;
if (diagonalTarget != null)
{
_storage.CopyTo(diagonalTarget.Storage);
_storage.CopyTo(diagonalTarget.Raw);
return;
}
var denseTarget = target as DenseMatrix;
if (denseTarget != null)
{
_storage.CopyTo(denseTarget.Storage);
_storage.CopyTo(denseTarget.Raw);
return;
}
var sparseTarget = target as SparseMatrix;
if (sparseTarget != null)
{
_storage.CopyTo(sparseTarget.Storage);
_storage.CopyTo(sparseTarget.Raw);
return;
}

15
src/Numerics/LinearAlgebra/Complex/Matrix.cs

@ -31,6 +31,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
using Distributions;
using Generic;
using Properties;
using Storage;
/// <summary>
/// <c>Complex</c> version of the <see cref="Matrix{T}"/> class.
@ -47,18 +48,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <param name="columns">
/// The number of columns.
/// </param>
protected Matrix(int rows, int columns) : base(rows, columns)
{
}
/// <summary>
/// Initializes a new instance of the Matrix class.
/// </summary>
/// <param name="order">
/// The order of the matrix.
/// </param>
protected Matrix(int order)
: base(order)
protected Matrix(MatrixStorage<Complex> storage)
: base(storage)
{
}

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

@ -56,8 +56,13 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
get { return _storage.ValueCount; }
}
internal SparseCompressedRowMatrixStorage<Complex> Raw
{
get { return _storage; }
}
internal SparseMatrix(SparseCompressedRowMatrixStorage<Complex> storage)
: base(storage.RowCount, storage.ColumnCount)
: base(storage)
{
_storage = storage;
}
@ -72,9 +77,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// The number of columns.
/// </param>
public SparseMatrix(int rows, int columns)
: base(rows, columns)
: this(new SparseCompressedRowMatrixStorage<Complex>(rows, columns, Complex.Zero))
{
_storage = new SparseCompressedRowMatrixStorage<Complex>(rows, columns, Complex.Zero);
}
/// <summary>
@ -85,9 +89,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// If <paramref name="order"/> is less than one.
/// </exception>
public SparseMatrix(int order)
: base(order, order)
: this(order, order)
{
_storage = new SparseCompressedRowMatrixStorage<Complex>(order, order, Complex.Zero);
}
/// <summary>
@ -101,10 +104,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// </param>
/// <param name="value">The value which we assign to each element of the matrix.</param>
public SparseMatrix(int rows, int columns, Complex value)
: base(rows, columns)
: this(rows, columns)
{
_storage = new SparseCompressedRowMatrixStorage<Complex>(rows, columns, Complex.Zero);
if (value.IsZero())
{
return;
@ -143,10 +144,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="array"/> length is less than <paramref name="rows"/> * <paramref name="columns"/>.
/// </exception>
public SparseMatrix(int rows, int columns, Complex[] array)
: base(rows, columns)
: this(rows, columns)
{
_storage = new SparseCompressedRowMatrixStorage<Complex>(rows, columns, Complex.Zero);
if (rows * columns > array.Length)
{
throw new ArgumentOutOfRangeException(Resources.ArgumentMatrixDimensions);
@ -166,10 +165,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// </summary>
/// <param name="array">The 2D array to create this matrix from.</param>
public SparseMatrix(Complex[,] array)
: base(array.GetLength(0), array.GetLength(1))
: this(array.GetLength(0), array.GetLength(1))
{
_storage = new SparseCompressedRowMatrixStorage<Complex>(array.GetLength(0), array.GetLength(1), Complex.Zero);
for (var i = 0; i < _storage.RowCount; i++)
{
for (var j = 0; j < _storage.ColumnCount; j++)
@ -185,10 +182,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// </summary>
/// <param name="matrix">The matrix to copy.</param>
public SparseMatrix(Matrix<Complex> matrix)
: base(matrix.RowCount, matrix.ColumnCount)
: this(matrix.RowCount, matrix.ColumnCount)
{
_storage = new SparseCompressedRowMatrixStorage<Complex>(matrix.RowCount, matrix.ColumnCount, Complex.Zero);
var sparseMatrix = matrix as SparseMatrix;
var rows = matrix.RowCount;
@ -206,7 +201,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
}
else
{
var matrixStorage = sparseMatrix.Storage;
var matrixStorage = sparseMatrix.Raw;
var valueCount = _storage.ValueCount = matrixStorage.ValueCount;
_storage.ColumnIndices = new int[valueCount];
_storage.Values = new Complex[valueCount];
@ -217,11 +212,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
}
}
internal SparseCompressedRowMatrixStorage<Complex> Storage
{
get { return _storage; }
}
/// <summary>
/// Creates a <c>SparseMatrix</c> for the given number of rows and columns.
/// </summary>
@ -700,14 +690,14 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
var sparseTarget = target as SparseMatrix;
if (sparseTarget != null)
{
_storage.CopyTo(sparseTarget.Storage);
_storage.CopyTo(sparseTarget.Raw);
return;
}
var denseTarget = target as DenseMatrix;
if (denseTarget != null)
{
_storage.CopyTo(denseTarget.Storage);
_storage.CopyTo(denseTarget.Raw);
return;
}
@ -749,7 +739,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
var valueCount = _storage.ValueCount;
var ret = new SparseMatrix(ColumnCount, RowCount);
var retStorage = ret.Storage;
var retStorage = ret.Raw;
retStorage.ColumnIndices = new int[valueCount];
retStorage.Values = new Complex[valueCount];
@ -781,7 +771,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
public override Complex FrobeniusNorm()
{
var transpose = (SparseMatrix)Transpose();
var aat = (this * transpose).Storage;
var aat = (this * transpose).Raw;
var norm = 0d;
@ -936,8 +926,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
}
else
{
var resultStorage = resultSparseMatrix.Storage;
var lowerStorage = lowerSparseMatrix.Storage;
var resultStorage = resultSparseMatrix.Raw;
var lowerStorage = lowerSparseMatrix.Raw;
if (resultSparseMatrix.RowCount != RowCount + lowerSparseMatrix.RowCount || resultSparseMatrix.ColumnCount != ColumnCount + lowerSparseMatrix.ColumnCount)
{
@ -979,7 +969,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
public static SparseMatrix Identity(int order)
{
var m = new SparseMatrix(order);
var mStorage = m.Storage;
var mStorage = m.Raw;
mStorage.ValueCount = order;
mStorage.Values = new Complex[order];
@ -1029,7 +1019,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
return base.Equals(other);
}
var otherStorage = sparseMatrix.Storage;
var otherStorage = sparseMatrix.Raw;
if (_storage.ValueCount != otherStorage.ValueCount)
{
return false;
@ -1091,7 +1081,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
left = sparseOther;
}
var leftStorage = left.Storage;
var leftStorage = left.Raw;
for (var i = 0; i < leftStorage.RowCount; i++)
{
// Get the begin / end index for the current row
@ -1131,7 +1121,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
return;
}
var otherStorage = sparseOther.Storage;
var otherStorage = sparseOther.Raw;
if (ReferenceEquals(this, sparseResult))
{
@ -1231,7 +1221,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
CopyTo(sparseResult);
}
CommonParallel.For(0, NonZerosCount, index => sparseResult.Storage.Values[index] *= scalar);
CommonParallel.For(0, NonZerosCount, index => sparseResult.Raw.Values[index] *= scalar);
}
}
@ -1330,7 +1320,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
var values = _storage.Values;
var valueCount = _storage.ValueCount;
var otherStorage = otherSparse.Storage;
var otherStorage = otherSparse.Raw;
for (var j = 0; j < RowCount; j++)
{
@ -1363,7 +1353,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
}
}
resultSparse.Storage.At(i, j, sum + result.At(i, j));
resultSparse.Raw.At(i, j, sum + result.At(i, j));
}
}
}

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

@ -61,6 +61,20 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// <value>The matrix's data.</value>
readonly Complex32[] _data;
internal DenseColumnMajorMatrixStorage<Complex32> Raw
{
get { return _storage; }
}
internal DenseMatrix(DenseColumnMajorMatrixStorage<Complex32> storage)
: base(storage)
{
_storage = storage;
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
}
/// <summary>
/// Initializes a new instance of the <see cref="DenseMatrix"/> class. This matrix is square with a given size.
/// </summary>
@ -69,13 +83,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// If <paramref name="order"/> is less than one.
/// </exception>
public DenseMatrix(int order)
: base(order)
: this(new DenseColumnMajorMatrixStorage<Complex32>(order, order))
{
_storage = new DenseColumnMajorMatrixStorage<Complex32>(order, order);
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
}
/// <summary>
@ -88,13 +97,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// The number of columns.
/// </param>
public DenseMatrix(int rows, int columns)
: base(rows, columns)
: this(new DenseColumnMajorMatrixStorage<Complex32>(rows, columns))
{
_storage = new DenseColumnMajorMatrixStorage<Complex32>(rows, columns);
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
}
/// <summary>
@ -108,14 +112,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// </param>
/// <param name="value">The value which we assign to each element of the matrix.</param>
public DenseMatrix(int rows, int columns, Complex32 value)
: base(rows, columns)
: this(rows, columns)
{
_storage = new DenseColumnMajorMatrixStorage<Complex32>(rows, columns);
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
for (var i = 0; i < _data.Length; i++)
{
_data[i] = value;
@ -130,13 +128,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// <param name="columns">The number of columns.</param>
/// <param name="array">The one dimensional array to create this matrix from. This array should store the matrix in column-major order. see: http://en.wikipedia.org/wiki/Row-major_order </param>
public DenseMatrix(int rows, int columns, Complex32[] array)
: base(rows, columns)
: this(new DenseColumnMajorMatrixStorage<Complex32>(rows, columns, array))
{
_storage = new DenseColumnMajorMatrixStorage<Complex32>(rows, columns, array);
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
}
/// <summary>
@ -145,14 +138,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// </summary>
/// <param name="array">The 2D array to create this matrix from.</param>
public DenseMatrix(Complex32[,] array)
: base(array.GetLength(0), array.GetLength(1))
: this(array.GetLength(0), array.GetLength(1))
{
_storage = new DenseColumnMajorMatrixStorage<Complex32>(array.GetLength(0), array.GetLength(1));
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
for (var i = 0; i < _rowCount; i++)
{
for (var j = 0; j < _columnCount; j++)
@ -162,11 +149,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
}
}
internal DenseColumnMajorMatrixStorage<Complex32> Storage
{
get { return _storage; }
}
/// <summary>
/// Gets the matrix's data.
/// </summary>
@ -222,7 +204,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
var denseTarget = target as DenseMatrix;
if (denseTarget != null)
{
_storage.CopyTo(denseTarget.Storage);
_storage.CopyTo(denseTarget.Raw);
return;
}

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

@ -54,6 +54,18 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// <value>The matrix's data.</value>
readonly Complex32[] _data;
internal SparseDiagonalMatrixStorage<Complex32> Raw
{
get { return _storage; }
}
internal DiagonalMatrix(SparseDiagonalMatrixStorage<Complex32> storage)
: base(storage)
{
_storage = storage;
_data = _storage.Data;
}
/// <summary>
/// Initializes a new instance of the <see cref="DiagonalMatrix"/> class. This matrix is square with a given size.
/// </summary>
@ -62,10 +74,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// If <paramref name="order"/> is less than one.
/// </exception>
public DiagonalMatrix(int order)
: base(order)
: this(new SparseDiagonalMatrixStorage<Complex32>(order, order, Complex32.Zero))
{
_storage = new SparseDiagonalMatrixStorage<Complex32>(order, order, Complex32.Zero);
_data = _storage.Data;
}
/// <summary>
@ -78,10 +88,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// The number of columns.
/// </param>
public DiagonalMatrix(int rows, int columns)
: base(rows, columns)
: this(new SparseDiagonalMatrixStorage<Complex32>(rows, columns, Complex32.Zero))
{
_storage = new SparseDiagonalMatrixStorage<Complex32>(rows, columns, Complex32.Zero);
_data = _storage.Data;
}
/// <summary>
@ -95,11 +103,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// </param>
/// <param name="value">The value which we assign to each diagonal element of the matrix.</param>
public DiagonalMatrix(int rows, int columns, Complex32 value)
: base(rows, columns)
: this(rows, columns)
{
_storage = new SparseDiagonalMatrixStorage<Complex32>(rows, columns, Complex32.Zero);
_data = _storage.Data;
for (var i = 0; i < _data.Length; i++)
{
_data[i] = value;
@ -114,10 +119,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// <param name="columns">The number of columns.</param>
/// <param name="diagonalArray">The one dimensional array which contain diagonal elements.</param>
public DiagonalMatrix(int rows, int columns, Complex32[] diagonalArray)
: base(rows, columns)
: this(new SparseDiagonalMatrixStorage<Complex32>(rows, columns, Complex32.Zero, diagonalArray))
{
_storage = new SparseDiagonalMatrixStorage<Complex32>(rows, columns, Complex32.Zero, diagonalArray);
_data = _storage.Data;
}
/// <summary>
@ -130,9 +133,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
public DiagonalMatrix(Complex32[,] array)
: this(array.GetLength(0), array.GetLength(1))
{
_storage = new SparseDiagonalMatrixStorage<Complex32>(array.GetLength(0), array.GetLength(1), Complex32.Zero);
_data = _storage.Data;
for (var i = 0; i < RowCount; i++)
{
for (var j = 0; j < ColumnCount; j++)
@ -149,11 +149,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
}
}
internal SparseDiagonalMatrixStorage<Complex32> Storage
{
get { return _storage; }
}
/// <summary>
/// Gets or sets the value at the given row and column, with range checking.
/// </summary>
@ -811,21 +806,21 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
var diagonalTarget = target as DiagonalMatrix;
if (diagonalTarget != null)
{
_storage.CopyTo(diagonalTarget.Storage);
_storage.CopyTo(diagonalTarget.Raw);
return;
}
var denseTarget = target as DenseMatrix;
if (denseTarget != null)
{
_storage.CopyTo(denseTarget.Storage);
_storage.CopyTo(denseTarget.Raw);
return;
}
var sparseTarget = target as SparseMatrix;
if (sparseTarget != null)
{
_storage.CopyTo(sparseTarget.Storage);
_storage.CopyTo(sparseTarget.Raw);
return;
}

21
src/Numerics/LinearAlgebra/Complex32/Matrix.cs

@ -31,6 +31,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
using Generic;
using Numerics;
using Properties;
using Storage;
/// <summary>
/// <c>Complex32</c> version of the <see cref="Matrix{T}"/> class.
@ -41,24 +42,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// <summary>
/// Initializes a new instance of the Matrix class.
/// </summary>
/// <param name="rows">
/// The number of rows.
/// </param>
/// <param name="columns">
/// The number of columns.
/// </param>
protected Matrix(int rows, int columns) : base(rows, columns)
{
}
/// <summary>
/// Initializes a new instance of the Matrix class.
/// </summary>
/// <param name="order">
/// The order of the matrix.
/// </param>
protected Matrix(int order)
: base(order)
protected Matrix(MatrixStorage<Complex32> storage)
: base(storage)
{
}

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

@ -56,8 +56,13 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
get { return _storage.ValueCount; }
}
internal SparseCompressedRowMatrixStorage<Complex32> Raw
{
get { return _storage; }
}
internal SparseMatrix(SparseCompressedRowMatrixStorage<Complex32> storage)
: base(storage.RowCount, storage.ColumnCount)
: base(storage)
{
_storage = storage;
}
@ -72,9 +77,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// The number of columns.
/// </param>
public SparseMatrix(int rows, int columns)
: base(rows, columns)
: this(new SparseCompressedRowMatrixStorage<Complex32>(rows, columns, Complex32.Zero))
{
_storage = new SparseCompressedRowMatrixStorage<Complex32>(rows, columns, Complex32.Zero);
}
/// <summary>
@ -85,9 +89,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// If <paramref name="order"/> is less than one.
/// </exception>
public SparseMatrix(int order)
: base(order, order)
: this(order, order)
{
_storage = new SparseCompressedRowMatrixStorage<Complex32>(order, order, Complex32.Zero);
}
/// <summary>
@ -101,10 +104,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// </param>
/// <param name="value">The value which we assign to each element of the matrix.</param>
public SparseMatrix(int rows, int columns, Complex32 value)
: base(rows, columns)
: this(rows, columns)
{
_storage = new SparseCompressedRowMatrixStorage<Complex32>(rows, columns, Complex32.Zero);
if (value.IsZero())
{
return;
@ -143,10 +144,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="array"/> length is less than <paramref name="rows"/> * <paramref name="columns"/>.
/// </exception>
public SparseMatrix(int rows, int columns, Complex32[] array)
: base(rows, columns)
: this(rows, columns)
{
_storage = new SparseCompressedRowMatrixStorage<Complex32>(rows, columns, Complex32.Zero);
if (rows * columns > array.Length)
{
throw new ArgumentOutOfRangeException(Resources.ArgumentMatrixDimensions);
@ -166,10 +165,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// </summary>
/// <param name="array">The 2D array to create this matrix from.</param>
public SparseMatrix(Complex32[,] array)
: base(array.GetLength(0), array.GetLength(1))
: this(array.GetLength(0), array.GetLength(1))
{
_storage = new SparseCompressedRowMatrixStorage<Complex32>(array.GetLength(0), array.GetLength(1), Complex32.Zero);
for (var i = 0; i < _storage.RowCount; i++)
{
for (var j = 0; j < _storage.ColumnCount; j++)
@ -185,10 +182,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// </summary>
/// <param name="matrix">The matrix to copy.</param>
public SparseMatrix(Matrix<Complex32> matrix)
: base(matrix.RowCount, matrix.ColumnCount)
: this(matrix.RowCount, matrix.ColumnCount)
{
_storage = new SparseCompressedRowMatrixStorage<Complex32>(matrix.RowCount, matrix.ColumnCount, Complex32.Zero);
var sparseMatrix = matrix as SparseMatrix;
var rows = matrix.RowCount;
@ -206,7 +201,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
}
else
{
var matrixStorage = sparseMatrix.Storage;
var matrixStorage = sparseMatrix.Raw;
var valueCount = _storage.ValueCount = matrixStorage.ValueCount;
_storage.ColumnIndices = new int[valueCount];
_storage.Values = new Complex32[valueCount];
@ -217,11 +212,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
}
}
internal SparseCompressedRowMatrixStorage<Complex32> Storage
{
get { return _storage; }
}
/// <summary>
/// Creates a <c>SparseMatrix</c> for the given number of rows and columns.
/// </summary>
@ -700,14 +690,14 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
var sparseTarget = target as SparseMatrix;
if (sparseTarget != null)
{
_storage.CopyTo(sparseTarget.Storage);
_storage.CopyTo(sparseTarget.Raw);
return;
}
var denseTarget = target as DenseMatrix;
if (denseTarget != null)
{
_storage.CopyTo(denseTarget.Storage);
_storage.CopyTo(denseTarget.Raw);
return;
}
@ -749,7 +739,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
var valueCount = _storage.ValueCount;
var ret = new SparseMatrix(ColumnCount, RowCount);
var retStorage = ret.Storage;
var retStorage = ret.Raw;
retStorage.ColumnIndices = new int[valueCount];
retStorage.Values = new Complex32[valueCount];
@ -781,7 +771,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
public override Complex32 FrobeniusNorm()
{
var transpose = (SparseMatrix)Transpose();
var aat = (this * transpose).Storage;
var aat = (this * transpose).Raw;
var norm = 0f;
@ -936,8 +926,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
}
else
{
var resultStorage = resultSparseMatrix.Storage;
var lowerStorage = lowerSparseMatrix.Storage;
var resultStorage = resultSparseMatrix.Raw;
var lowerStorage = lowerSparseMatrix.Raw;
if (resultSparseMatrix.RowCount != RowCount + lowerSparseMatrix.RowCount || resultSparseMatrix.ColumnCount != ColumnCount + lowerSparseMatrix.ColumnCount)
{
@ -979,7 +969,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
public static SparseMatrix Identity(int order)
{
var m = new SparseMatrix(order);
var mStorage = m.Storage;
var mStorage = m.Raw;
mStorage.ValueCount = order;
mStorage.Values = new Complex32[order];
@ -1029,7 +1019,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
return base.Equals(other);
}
var otherStorage = sparseMatrix.Storage;
var otherStorage = sparseMatrix.Raw;
if (_storage.ValueCount != otherStorage.ValueCount)
{
return false;
@ -1091,7 +1081,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
left = sparseOther;
}
var leftStorage = left.Storage;
var leftStorage = left.Raw;
for (var i = 0; i < leftStorage.RowCount; i++)
{
// Get the begin / end index for the current row
@ -1130,7 +1120,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
return;
}
var otherStorage = sparseOther.Storage;
var otherStorage = sparseOther.Raw;
if (ReferenceEquals(this, sparseResult))
{
@ -1230,7 +1220,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
CopyTo(sparseResult);
}
CommonParallel.For(0, NonZerosCount, index => sparseResult.Storage.Values[index] *= scalar);
CommonParallel.For(0, NonZerosCount, index => sparseResult.Raw.Values[index] *= scalar);
}
}
@ -1329,7 +1319,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
var values = _storage.Values;
var valueCount = _storage.ValueCount;
var otherStorage = otherSparse.Storage;
var otherStorage = otherSparse.Raw;
for (var j = 0; j < RowCount; j++)
{
@ -1362,7 +1352,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
}
}
resultSparse.Storage.At(i, j, sum + result.At(i, j));
resultSparse.Raw.At(i, j, sum + result.At(i, j));
}
}
}

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

@ -61,6 +61,20 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <value>The matrix's data.</value>
readonly double[] _data;
internal DenseColumnMajorMatrixStorage<double> Raw
{
get { return _storage; }
}
internal DenseMatrix(DenseColumnMajorMatrixStorage<double> storage)
: base(storage)
{
_storage = storage;
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
}
/// <summary>
/// Initializes a new instance of the <see cref="DenseMatrix"/> class. This matrix is square with a given size.
/// </summary>
@ -69,13 +83,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// If <paramref name="order"/> is less than one.
/// </exception>
public DenseMatrix(int order)
: base(order)
: this(new DenseColumnMajorMatrixStorage<double>(order, order))
{
_storage = new DenseColumnMajorMatrixStorage<double>(order, order);
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
}
/// <summary>
@ -88,13 +97,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// The number of columns.
/// </param>
public DenseMatrix(int rows, int columns)
: base(rows, columns)
: this(new DenseColumnMajorMatrixStorage<double>(rows, columns))
{
_storage = new DenseColumnMajorMatrixStorage<double>(rows, columns);
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
}
/// <summary>
@ -108,14 +112,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// </param>
/// <param name="value">The value which we assign to each element of the matrix.</param>
public DenseMatrix(int rows, int columns, double value)
: base(rows, columns)
: this(rows, columns)
{
_storage = new DenseColumnMajorMatrixStorage<double>(rows, columns);
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
for (var i = 0; i < _data.Length; i++)
{
_data[i] = value;
@ -130,13 +128,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <param name="columns">The number of columns.</param>
/// <param name="array">The one dimensional array to create this matrix from. This array should store the matrix in column-major order. see: http://en.wikipedia.org/wiki/Row-major_order </param>
public DenseMatrix(int rows, int columns, double[] array)
: base(rows, columns)
: this(new DenseColumnMajorMatrixStorage<double>(rows, columns, array))
{
_storage = new DenseColumnMajorMatrixStorage<double>(rows, columns, array);
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
}
/// <summary>
@ -145,14 +138,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// </summary>
/// <param name="array">The 2D array to create this matrix from.</param>
public DenseMatrix(double[,] array)
: base(array.GetLength(0), array.GetLength(1))
: this(array.GetLength(0), array.GetLength(1))
{
_storage = new DenseColumnMajorMatrixStorage<double>(array.GetLength(0), array.GetLength(1));
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
for (var i = 0; i < _rowCount; i++)
{
for (var j = 0; j < _columnCount; j++)
@ -162,11 +149,6 @@ namespace MathNet.Numerics.LinearAlgebra.Double
}
}
internal DenseColumnMajorMatrixStorage<double> Storage
{
get { return _storage; }
}
/// <summary>
/// Gets the matrix's data.
/// </summary>
@ -222,7 +204,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
var denseTarget = target as DenseMatrix;
if (denseTarget != null)
{
_storage.CopyTo(denseTarget.Storage);
_storage.CopyTo(denseTarget.Raw);
return;
}

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

@ -53,6 +53,18 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <value>The matrix's data.</value>
readonly double[] _data;
internal SparseDiagonalMatrixStorage<double> Raw
{
get { return _storage; }
}
internal DiagonalMatrix(SparseDiagonalMatrixStorage<double> storage)
: base(storage)
{
_storage = storage;
_data = _storage.Data;
}
/// <summary>
/// Initializes a new instance of the <see cref="DiagonalMatrix"/> class. This matrix is square with a given size.
/// </summary>
@ -60,11 +72,10 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <exception cref="ArgumentException">
/// If <paramref name="order"/> is less than one.
/// </exception>
public DiagonalMatrix(int order) : base(order)
{
_storage = new SparseDiagonalMatrixStorage<double>(order, order, 0d);
_data = _storage.Data;
}
public DiagonalMatrix(int order)
: this(new SparseDiagonalMatrixStorage<double>(order, order, 0d))
{
}
/// <summary>
/// Initializes a new instance of the <see cref="DiagonalMatrix"/> class.
@ -75,10 +86,9 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <param name="columns">
/// The number of columns.
/// </param>
public DiagonalMatrix(int rows, int columns) : base(rows, columns)
public DiagonalMatrix(int rows, int columns)
: this(new SparseDiagonalMatrixStorage<double>(rows, columns, 0d))
{
_storage = new SparseDiagonalMatrixStorage<double>(rows, columns, 0d);
_data = _storage.Data;
}
/// <summary>
@ -91,11 +101,9 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// The number of columns.
/// </param>
/// <param name="value">The value which we assign to each diagonal element of the matrix.</param>
public DiagonalMatrix(int rows, int columns, double value) : base(rows, columns)
public DiagonalMatrix(int rows, int columns, double value)
: this(rows, columns)
{
_storage = new SparseDiagonalMatrixStorage<double>(rows, columns, 0d);
_data = _storage.Data;
for (var i = 0; i < _data.Length; i++)
{
_data[i] = value;
@ -109,10 +117,9 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <param name="rows">The number of rows.</param>
/// <param name="columns">The number of columns.</param>
/// <param name="diagonalArray">The one dimensional array which contain diagonal elements.</param>
public DiagonalMatrix(int rows, int columns, double[] diagonalArray) : base(rows, columns)
public DiagonalMatrix(int rows, int columns, double[] diagonalArray)
: this(new SparseDiagonalMatrixStorage<double>(rows, columns, 0d, diagonalArray))
{
_storage = new SparseDiagonalMatrixStorage<double>(rows, columns, 0d, diagonalArray);
_data = _storage.Data;
}
/// <summary>
@ -122,11 +129,9 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <exception cref="IndexOutOfRangeException">When <paramref name="array"/> contains an off-diagonal element.</exception>
/// <exception cref="IndexOutOfRangeException">Depending on the implementation, an <see cref="IndexOutOfRangeException"/>
/// may be thrown if one of the indices is outside the dimensions of the matrix.</exception>
public DiagonalMatrix(double[,] array) : this(array.GetLength(0), array.GetLength(1))
public DiagonalMatrix(double[,] array)
: this(array.GetLength(0), array.GetLength(1))
{
_storage = new SparseDiagonalMatrixStorage<double>(array.GetLength(0), array.GetLength(1), 0d);
_data = _storage.Data;
for (var i = 0; i < RowCount; i++)
{
for (var j = 0; j < ColumnCount; j++)
@ -143,11 +148,6 @@ namespace MathNet.Numerics.LinearAlgebra.Double
}
}
internal SparseDiagonalMatrixStorage<double> Storage
{
get { return _storage; }
}
/// <summary>
/// Gets or sets the value at the given row and column, with range checking.
/// </summary>
@ -800,21 +800,21 @@ namespace MathNet.Numerics.LinearAlgebra.Double
var diagonalTarget = target as DiagonalMatrix;
if (diagonalTarget != null)
{
_storage.CopyTo(diagonalTarget.Storage);
_storage.CopyTo(diagonalTarget.Raw);
return;
}
var denseTarget = target as DenseMatrix;
if (denseTarget != null)
{
_storage.CopyTo(denseTarget.Storage);
_storage.CopyTo(denseTarget.Raw);
return;
}
var sparseTarget = target as SparseMatrix;
if (sparseTarget != null)
{
_storage.CopyTo(sparseTarget.Storage);
_storage.CopyTo(sparseTarget.Raw);
return;
}

22
src/Numerics/LinearAlgebra/Double/Matrix.cs

@ -24,6 +24,8 @@
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
using MathNet.Numerics.LinearAlgebra.Storage;
namespace MathNet.Numerics.LinearAlgebra.Double
{
using System;
@ -40,24 +42,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <summary>
/// Initializes a new instance of the Matrix class.
/// </summary>
/// <param name="rows">
/// The number of rows.
/// </param>
/// <param name="columns">
/// The number of columns.
/// </param>
protected Matrix(int rows, int columns) : base(rows, columns)
{
}
/// <summary>
/// Initializes a new instance of the Matrix class.
/// </summary>
/// <param name="order">
/// The order of the matrix.
/// </param>
protected Matrix(int order)
: base(order)
protected Matrix(MatrixStorage<double> storage)
: base(storage)
{
}

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

@ -55,8 +55,13 @@ namespace MathNet.Numerics.LinearAlgebra.Double
get { return _storage.ValueCount; }
}
internal SparseCompressedRowMatrixStorage<double> Raw
{
get { return _storage; }
}
internal SparseMatrix(SparseCompressedRowMatrixStorage<double> storage)
: base(storage.RowCount, storage.ColumnCount)
: base(storage)
{
_storage = storage;
}
@ -71,9 +76,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// The number of columns.
/// </param>
public SparseMatrix(int rows, int columns)
: base(rows, columns)
: this(new SparseCompressedRowMatrixStorage<double>(rows, columns, 0d))
{
_storage = new SparseCompressedRowMatrixStorage<double>(rows, columns, 0d);
}
/// <summary>
@ -84,9 +88,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// If <paramref name="order"/> is less than one.
/// </exception>
public SparseMatrix(int order)
: base(order, order)
: this(order, order)
{
_storage = new SparseCompressedRowMatrixStorage<double>(order, order, 0d);
}
/// <summary>
@ -100,10 +103,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// </param>
/// <param name="value">The value which we assign to each element of the matrix.</param>
public SparseMatrix(int rows, int columns, double value)
: base(rows, columns)
: this(rows, columns)
{
_storage = new SparseCompressedRowMatrixStorage<double>(rows, columns, 0d);
if (value == 0.0)
{
return;
@ -142,10 +143,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="array"/> length is less than <paramref name="rows"/> * <paramref name="columns"/>.
/// </exception>
public SparseMatrix(int rows, int columns, double[] array)
: base(rows, columns)
: this(rows, columns)
{
_storage = new SparseCompressedRowMatrixStorage<double>(rows, columns, 0d);
if (rows * columns > array.Length)
{
throw new ArgumentOutOfRangeException(Resources.ArgumentMatrixDimensions);
@ -165,10 +164,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// </summary>
/// <param name="array">The 2D array to create this matrix from.</param>
public SparseMatrix(double[,] array)
: base(array.GetLength(0), array.GetLength(1))
: this(array.GetLength(0), array.GetLength(1))
{
_storage = new SparseCompressedRowMatrixStorage<double>(array.GetLength(0), array.GetLength(1), 0d);
for (var i = 0; i < _storage.RowCount; i++)
{
for (var j = 0; j < _storage.ColumnCount; j++)
@ -184,10 +181,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// </summary>
/// <param name="matrix">The matrix to copy.</param>
public SparseMatrix(Matrix<double> matrix)
: base(matrix.RowCount, matrix.ColumnCount)
: this(matrix.RowCount, matrix.ColumnCount)
{
_storage = new SparseCompressedRowMatrixStorage<double>(matrix.RowCount, matrix.ColumnCount, 0d);
var sparseMatrix = matrix as SparseMatrix;
var rows = matrix.RowCount;
@ -205,7 +200,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
}
else
{
var matrixStorage = sparseMatrix.Storage;
var matrixStorage = sparseMatrix.Raw;
var valueCount = _storage.ValueCount = matrixStorage.ValueCount;
_storage.ColumnIndices = new int[valueCount];
_storage.Values = new double[valueCount];
@ -216,11 +211,6 @@ namespace MathNet.Numerics.LinearAlgebra.Double
}
}
internal SparseCompressedRowMatrixStorage<double> Storage
{
get { return _storage; }
}
/// <summary>
/// Creates a <c>SparseMatrix</c> for the given number of rows and columns.
/// </summary>
@ -699,14 +689,14 @@ namespace MathNet.Numerics.LinearAlgebra.Double
var sparseTarget = target as SparseMatrix;
if (sparseTarget != null)
{
_storage.CopyTo(sparseTarget.Storage);
_storage.CopyTo(sparseTarget.Raw);
return;
}
var denseTarget = target as DenseMatrix;
if (denseTarget != null)
{
_storage.CopyTo(denseTarget.Storage);
_storage.CopyTo(denseTarget.Raw);
return;
}
@ -748,7 +738,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
var valueCount = _storage.ValueCount;
var ret = new SparseMatrix(ColumnCount, RowCount);
var retStorage = ret.Storage;
var retStorage = ret.Raw;
retStorage.ColumnIndices = new int[valueCount];
retStorage.Values = new double[valueCount];
@ -780,7 +770,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
public override double FrobeniusNorm()
{
var transpose = (SparseMatrix)Transpose();
var aat = (this * transpose).Storage;
var aat = (this * transpose).Raw;
var norm = 0d;
@ -934,8 +924,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double
}
else
{
var resultStorage = resultSparseMatrix.Storage;
var lowerStorage = lowerSparseMatrix.Storage;
var resultStorage = resultSparseMatrix.Raw;
var lowerStorage = lowerSparseMatrix.Raw;
if (resultStorage.RowCount != RowCount + lowerStorage.RowCount || resultStorage.ColumnCount != ColumnCount + lowerSparseMatrix.ColumnCount)
{
@ -977,7 +967,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
public static SparseMatrix Identity(int order)
{
var m = new SparseMatrix(order);
var mStorage = m.Storage;
var mStorage = m.Raw;
mStorage.ValueCount = order;
mStorage.Values = new double[order];
@ -1027,7 +1017,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
return base.Equals(other);
}
var otherStorage = sparseMatrix.Storage;
var otherStorage = sparseMatrix.Raw;
if (_storage.ValueCount != otherStorage.ValueCount)
{
return false;
@ -1089,7 +1079,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
left = sparseOther;
}
var leftStorage = left.Storage;
var leftStorage = left.Raw;
for (var i = 0; i < leftStorage.RowCount; i++)
{
// Get the begin / end index for the current row
@ -1129,7 +1119,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
return;
}
var otherStorage = sparseOther.Storage;
var otherStorage = sparseOther.Raw;
if (ReferenceEquals(this, sparseResult))
{
@ -1229,7 +1219,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
CopyTo(sparseResult);
}
CommonParallel.For(0, _storage.ValueCount, index => sparseResult.Storage.Values[index] *= scalar);
CommonParallel.For(0, _storage.ValueCount, index => sparseResult.Raw.Values[index] *= scalar);
}
}
@ -1328,7 +1318,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
var values = _storage.Values;
var valueCount = _storage.ValueCount;
var otherStorage = otherSparse.Storage;
var otherStorage = otherSparse.Raw;
for (var j = 0; j < RowCount; j++)
{
@ -1361,7 +1351,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
}
}
resultSparse.Storage.At(i, j, sum + result.At(i, j));
resultSparse.Raw.At(i, j, sum + result.At(i, j));
}
}
}
@ -1457,7 +1447,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
CopyTo(result);
}
var resultStorage = sparseResult.Storage;
var resultStorage = sparseResult.Raw;
for (var index = 0; index < resultStorage.Values.Length; index++)
{
resultStorage.Values[index] %= divisor;

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

@ -24,6 +24,8 @@
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
using MathNet.Numerics.LinearAlgebra.Storage;
namespace MathNet.Numerics.LinearAlgebra.Generic
{
using System;
@ -42,7 +44,7 @@ namespace MathNet.Numerics.LinearAlgebra.Generic
[Serializable]
public abstract partial class Matrix<T> :
#if PORTABLE
IFormattable, IEquatable<Matrix<T>>
IFormattable, IEquatable<Matrix<T>>
#else
IFormattable, IEquatable<Matrix<T>>, ICloneable
#endif
@ -51,64 +53,29 @@ namespace MathNet.Numerics.LinearAlgebra.Generic
/// <summary>
/// Initializes a new instance of the Matrix class.
/// </summary>
/// <param name="rows">
/// The number of rows.
/// </param>
/// <param name="columns">
/// The number of columns.
/// </param>
protected Matrix(int rows, int columns)
protected Matrix(MatrixStorage<T> storage)
{
if (rows <= 0)
{
throw new ArgumentOutOfRangeException(Resources.MatrixRowsMustBePositive);
}
if (columns <= 0)
{
throw new ArgumentOutOfRangeException(Resources.MatrixColumnsMustBePositive);
}
RowCount = rows;
ColumnCount = columns;
Storage = storage;
RowCount = storage.RowCount;
ColumnCount = storage.ColumnCount;
}
/// <summary>
/// Initializes a new instance of the Matrix class.
/// Gets the raw matrix data storage.
/// </summary>
/// <param name="order">
/// The order of the matrix.
/// </param>
protected Matrix(int order)
{
if (order <= 0)
{
throw new ArgumentOutOfRangeException(Resources.MatrixRowsOrColumnsMustBePositive);
}
RowCount = order;
ColumnCount = order;
}
public MatrixStorage<T> Storage { get; private set; }
/// <summary>
/// Gets the number of columns.
/// </summary>
/// <value>The number of columns.</value>
public int ColumnCount
{
get;
private set;
}
public int ColumnCount { get; private set; }
/// <summary>
/// Gets the number of rows.
/// </summary>
/// <value>The number of rows.</value>
public int RowCount
{
get;
private set;
}
public int RowCount { get; private set; }
/// <summary>
/// Constructs matrix from a list of column vectors.

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

@ -61,6 +61,20 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// <value>The matrix's data.</value>
readonly float[] _data;
internal DenseColumnMajorMatrixStorage<float> Raw
{
get { return _storage; }
}
internal DenseMatrix(DenseColumnMajorMatrixStorage<float> storage)
: base(storage)
{
_storage = storage;
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
}
/// <summary>
/// Initializes a new instance of the <see cref="DenseMatrix"/> class. This matrix is square with a given size.
/// </summary>
@ -69,13 +83,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// If <paramref name="order"/> is less than one.
/// </exception>
public DenseMatrix(int order)
: base(order)
: this(new DenseColumnMajorMatrixStorage<float>(order, order))
{
_storage = new DenseColumnMajorMatrixStorage<float>(order, order);
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
}
/// <summary>
@ -88,13 +97,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// The number of columns.
/// </param>
public DenseMatrix(int rows, int columns)
: base(rows, columns)
: this(new DenseColumnMajorMatrixStorage<float>(rows, columns))
{
_storage = new DenseColumnMajorMatrixStorage<float>(rows, columns);
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
}
/// <summary>
@ -108,14 +112,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// </param>
/// <param name="value">The value which we assign to each element of the matrix.</param>
public DenseMatrix(int rows, int columns, float value)
: base(rows, columns)
: this(rows, columns)
{
_storage = new DenseColumnMajorMatrixStorage<float>(rows, columns);
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
for (var i = 0; i < _data.Length; i++)
{
_data[i] = value;
@ -130,13 +128,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// <param name="columns">The number of columns.</param>
/// <param name="array">The one dimensional array to create this matrix from. This array should store the matrix in column-major order. see: http://en.wikipedia.org/wiki/Row-major_order </param>
public DenseMatrix(int rows, int columns, float[] array)
: base(rows, columns)
: this(new DenseColumnMajorMatrixStorage<float>(rows, columns, array))
{
_storage = new DenseColumnMajorMatrixStorage<float>(rows, columns, array);
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
}
/// <summary>
@ -145,14 +138,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// </summary>
/// <param name="array">The 2D array to create this matrix from.</param>
public DenseMatrix(float[,] array)
: base(array.GetLength(0), array.GetLength(1))
: this(array.GetLength(0), array.GetLength(1))
{
_storage = new DenseColumnMajorMatrixStorage<float>(array.GetLength(0), array.GetLength(1));
_rowCount = _storage.RowCount;
_columnCount = _storage.ColumnCount;
_data = _storage.Data;
for (var i = 0; i < _rowCount; i++)
{
for (var j = 0; j < _columnCount; j++)
@ -162,11 +149,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single
}
}
internal DenseColumnMajorMatrixStorage<float> Storage
{
get { return _storage; }
}
/// <summary>
/// Gets the matrix's data.
/// </summary>
@ -222,7 +204,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
var denseTarget = target as DenseMatrix;
if (denseTarget != null)
{
_storage.CopyTo(denseTarget.Storage);
_storage.CopyTo(denseTarget.Raw);
return;
}

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

@ -53,6 +53,18 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// <value>The matrix's data.</value>
readonly float[] _data;
internal SparseDiagonalMatrixStorage<float> Raw
{
get { return _storage; }
}
internal DiagonalMatrix(SparseDiagonalMatrixStorage<float> storage)
: base(storage)
{
_storage = storage;
_data = _storage.Data;
}
/// <summary>
/// Initializes a new instance of the <see cref="DiagonalMatrix"/> class. This matrix is square with a given size.
/// </summary>
@ -61,10 +73,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// If <paramref name="order"/> is less than one.
/// </exception>
public DiagonalMatrix(int order)
: base(order)
: this(new SparseDiagonalMatrixStorage<float>(order, order, 0f))
{
_storage = new SparseDiagonalMatrixStorage<float>(order, order, 0f);
_data = _storage.Data;
}
/// <summary>
@ -77,10 +87,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// The number of columns.
/// </param>
public DiagonalMatrix(int rows, int columns)
: base(rows, columns)
: this(new SparseDiagonalMatrixStorage<float>(rows, columns, 0f))
{
_storage = new SparseDiagonalMatrixStorage<float>(rows, columns, 0f);
_data = _storage.Data;
}
/// <summary>
@ -94,11 +102,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// </param>
/// <param name="value">The value which we assign to each diagonal element of the matrix.</param>
public DiagonalMatrix(int rows, int columns, float value)
: base(rows, columns)
: this(rows, columns)
{
_storage = new SparseDiagonalMatrixStorage<float>(rows, columns, 0f);
_data = _storage.Data;
for (var i = 0; i < _data.Length; i++)
{
_data[i] = value;
@ -113,10 +118,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// <param name="columns">The number of columns.</param>
/// <param name="diagonalArray">The one dimensional array which contain diagonal elements.</param>
public DiagonalMatrix(int rows, int columns, float[] diagonalArray)
: base(rows, columns)
: this(new SparseDiagonalMatrixStorage<float>(rows, columns, 0f, diagonalArray))
{
_storage = new SparseDiagonalMatrixStorage<float>(rows, columns, 0f, diagonalArray);
_data = _storage.Data;
}
/// <summary>
@ -129,9 +132,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single
public DiagonalMatrix(float[,] array)
: this(array.GetLength(0), array.GetLength(1))
{
_storage = new SparseDiagonalMatrixStorage<float>(array.GetLength(0), array.GetLength(1), 0f);
_data = _storage.Data;
for (var i = 0; i < RowCount; i++)
{
for (var j = 0; j < ColumnCount; j++)
@ -148,11 +148,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single
}
}
internal SparseDiagonalMatrixStorage<float> Storage
{
get { return _storage; }
}
/// <summary>
/// Gets or sets the value at the given row and column, with range checking.
/// </summary>
@ -805,21 +800,21 @@ namespace MathNet.Numerics.LinearAlgebra.Single
var diagonalTarget = target as DiagonalMatrix;
if (diagonalTarget != null)
{
_storage.CopyTo(diagonalTarget.Storage);
_storage.CopyTo(diagonalTarget.Raw);
return;
}
var denseTarget = target as DenseMatrix;
if (denseTarget != null)
{
_storage.CopyTo(denseTarget.Storage);
_storage.CopyTo(denseTarget.Raw);
return;
}
var sparseTarget = target as SparseMatrix;
if (sparseTarget != null)
{
_storage.CopyTo(sparseTarget.Storage);
_storage.CopyTo(sparseTarget.Raw);
return;
}

21
src/Numerics/LinearAlgebra/Single/Matrix.cs

@ -30,6 +30,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
using Distributions;
using Generic;
using Properties;
using Storage;
/// <summary>
/// <c>float</c> version of the <see cref="Matrix{T}"/> class.
@ -40,24 +41,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// <summary>
/// Initializes a new instance of the Matrix class.
/// </summary>
/// <param name="rows">
/// The number of rows.
/// </param>
/// <param name="columns">
/// The number of columns.
/// </param>
protected Matrix(int rows, int columns) : base(rows, columns)
{
}
/// <summary>
/// Initializes a new instance of the Matrix class.
/// </summary>
/// <param name="order">
/// The order of the matrix.
/// </param>
protected Matrix(int order)
: base(order)
protected Matrix(MatrixStorage<float> storage)
: base(storage)
{
}

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

@ -55,8 +55,13 @@ namespace MathNet.Numerics.LinearAlgebra.Single
get { return _storage.ValueCount; }
}
internal SparseCompressedRowMatrixStorage<float> Raw
{
get { return _storage; }
}
internal SparseMatrix(SparseCompressedRowMatrixStorage<float> storage)
: base(storage.RowCount, storage.ColumnCount)
: base(storage)
{
_storage = storage;
}
@ -71,9 +76,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// The number of columns.
/// </param>
public SparseMatrix(int rows, int columns)
: base(rows, columns)
: this(new SparseCompressedRowMatrixStorage<float>(rows, columns, 0f))
{
_storage = new SparseCompressedRowMatrixStorage<float>(rows, columns, 0f);
}
/// <summary>
@ -84,9 +88,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// If <paramref name="order"/> is less than one.
/// </exception>
public SparseMatrix(int order)
: base(order, order)
: this(order, order)
{
_storage = new SparseCompressedRowMatrixStorage<float>(order, order, 0f);
}
/// <summary>
@ -100,10 +103,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// </param>
/// <param name="value">The value which we assign to each element of the matrix.</param>
public SparseMatrix(int rows, int columns, float value)
: base(rows, columns)
: this(rows, columns)
{
_storage = new SparseCompressedRowMatrixStorage<float>(rows, columns, 0f);
if (value == 0.0)
{
return;
@ -142,10 +143,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="array"/> length is less than <paramref name="rows"/> * <paramref name="columns"/>.
/// </exception>
public SparseMatrix(int rows, int columns, float[] array)
: base(rows, columns)
: this(rows, columns)
{
_storage = new SparseCompressedRowMatrixStorage<float>(rows, columns, 0f);
if (rows * columns > array.Length)
{
throw new ArgumentOutOfRangeException(Resources.ArgumentMatrixDimensions);
@ -165,10 +164,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// </summary>
/// <param name="array">The 2D array to create this matrix from.</param>
public SparseMatrix(float[,] array)
: base(array.GetLength(0), array.GetLength(1))
: this(array.GetLength(0), array.GetLength(1))
{
_storage = new SparseCompressedRowMatrixStorage<float>(array.GetLength(0), array.GetLength(1), 0f);
for (var i = 0; i < _storage.RowCount; i++)
{
for (var j = 0; j < _storage.ColumnCount; j++)
@ -186,8 +183,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single
public SparseMatrix(Matrix<float> matrix)
: this(matrix.RowCount, matrix.ColumnCount)
{
_storage = new SparseCompressedRowMatrixStorage<float>(matrix.RowCount, matrix.ColumnCount, 0f);
var sparseMatrix = matrix as SparseMatrix;
var rows = matrix.RowCount;
@ -205,7 +200,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
}
else
{
var matrixStorage = sparseMatrix.Storage;
var matrixStorage = sparseMatrix.Raw;
var valueCount = _storage.ValueCount = matrixStorage.ValueCount;
_storage.ColumnIndices = new int[valueCount];
_storage.Values = new float[valueCount];
@ -216,11 +211,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single
}
}
internal SparseCompressedRowMatrixStorage<float> Storage
{
get { return _storage; }
}
/// <summary>
/// Creates a <c>SparseMatrix</c> for the given number of rows and columns.
/// </summary>
@ -699,14 +689,14 @@ namespace MathNet.Numerics.LinearAlgebra.Single
var sparseTarget = target as SparseMatrix;
if (sparseTarget != null)
{
_storage.CopyTo(sparseTarget.Storage);
_storage.CopyTo(sparseTarget.Raw);
return;
}
var denseTarget = target as DenseMatrix;
if (denseTarget != null)
{
_storage.CopyTo(denseTarget.Storage);
_storage.CopyTo(denseTarget.Raw);
return;
}
@ -748,7 +738,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
var valueCount = _storage.ValueCount;
var ret = new SparseMatrix(ColumnCount, RowCount);
var retStorage = ret.Storage;
var retStorage = ret.Raw;
retStorage.ColumnIndices = new int[valueCount];
retStorage.Values = new float[valueCount];
@ -780,7 +770,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
public override float FrobeniusNorm()
{
var transpose = (SparseMatrix)Transpose();
var aat = (this * transpose).Storage;
var aat = (this * transpose).Raw;
var norm = 0f;
@ -934,8 +924,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single
}
else
{
var resultStorage = resultSparseMatrix.Storage;
var lowerStorage = lowerSparseMatrix.Storage;
var resultStorage = resultSparseMatrix.Raw;
var lowerStorage = lowerSparseMatrix.Raw;
if (resultStorage.RowCount != RowCount + lowerStorage.RowCount || resultStorage.ColumnCount != ColumnCount + lowerSparseMatrix.ColumnCount)
{
@ -977,7 +967,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
public static SparseMatrix Identity(int order)
{
var m = new SparseMatrix(order);
var mStorage = m.Storage;
var mStorage = m.Raw;
mStorage.ValueCount = order;
mStorage.Values = new float[order];
@ -1027,7 +1017,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
return base.Equals(other);
}
var otherStorage = sparseMatrix.Storage;
var otherStorage = sparseMatrix.Raw;
if (_storage.ValueCount != otherStorage.ValueCount)
{
return false;
@ -1089,7 +1079,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
left = sparseOther;
}
var leftStorage = left.Storage;
var leftStorage = left.Raw;
for (var i = 0; i < leftStorage.RowCount; i++)
{
// Get the begin / end index for the current row
@ -1128,7 +1118,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
return;
}
var otherStorage = sparseOther.Storage;
var otherStorage = sparseOther.Raw;
if (ReferenceEquals(this, sparseResult))
{
@ -1228,7 +1218,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
CopyTo(sparseResult);
}
CommonParallel.For(0, NonZerosCount, index => sparseResult.Storage.Values[index] *= scalar);
CommonParallel.For(0, NonZerosCount, index => sparseResult.Raw.Values[index] *= scalar);
}
}
@ -1327,7 +1317,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
var values = _storage.Values;
var valueCount = _storage.ValueCount;
var otherStorage = otherSparse.Storage;
var otherStorage = otherSparse.Raw;
for (var j = 0; j < RowCount; j++)
{
@ -1360,7 +1350,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
}
}
resultSparse.Storage.At(i, j, sum + result.At(i, j));
resultSparse.Raw.At(i, j, sum + result.At(i, j));
}
}
}
@ -1456,7 +1446,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
CopyTo(result);
}
var resultStorage = sparseResult.Storage;
var resultStorage = sparseResult.Raw;
for (var index = 0; index < resultStorage.Values.Length; index++)
{
resultStorage.Values[index] %= divisor;

77
src/Numerics/LinearAlgebra/Storage/DenseColumnMajorMatrixStorage.cs

@ -1,84 +1,31 @@
using System;
using MathNet.Numerics.Properties;
using MathNet.Numerics.Threading;
namespace MathNet.Numerics.LinearAlgebra.Storage
{
internal class DenseColumnMajorMatrixStorage<T> : IMatrixStorage<T>
internal class DenseColumnMajorMatrixStorage<T> : MatrixStorage<T>
where T : struct, IEquatable<T>, IFormattable
{
// [ruegg] public fields are OK here
public readonly int RowCount;
public readonly int ColumnCount;
public readonly T[] Data;
internal DenseColumnMajorMatrixStorage(int rows, int columns)
: base(rows, columns)
{
RowCount = rows;
ColumnCount = columns;
Data = new T[rows * columns];
}
internal DenseColumnMajorMatrixStorage(int rows, int columns, T[] data)
: base(rows, columns)
{
RowCount = rows;
ColumnCount = columns;
Data = data;
}
/// <summary>
/// Gets or sets the value at the given row and column, with range checking.
/// </summary>
/// <param name="row">
/// The row of the element.
/// </param>
/// <param name="column">
/// The column of the element.
/// </param>
/// <value>The value to get or set.</value>
/// <remarks>This method is ranged checked. <see cref="At(int,int)"/> and <see cref="At(int,int,T)"/>
/// to get and set values without range checking.</remarks>
public T this[int row, int column]
{
get
{
if (row < 0 || row >= RowCount)
{
throw new ArgumentOutOfRangeException("row");
}
if (column < 0 || column >= ColumnCount)
{
throw new ArgumentOutOfRangeException("column");
}
return At(row, column);
}
set
{
if (row < 0 || row >= RowCount)
{
throw new ArgumentOutOfRangeException("row");
}
if (column < 0 || column >= ColumnCount)
{
throw new ArgumentOutOfRangeException("column");
}
At(row, column, value);
}
}
/// <summary>
/// Retrieves the requested element without range checking.
/// </summary>
public T At(int row, int column)
public override T At(int row, int column)
{
return Data[(column * RowCount) + row];
}
@ -86,17 +33,17 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
/// <summary>
/// Sets the element without range checking.
/// </summary>
public void At(int row, int column, T value)
public override void At(int row, int column, T value)
{
Data[(column * RowCount) + row] = value;
}
public void Clear()
public override void Clear()
{
Array.Clear(Data, 0, Data.Length);
}
public void CopyTo(IMatrixStorage<T> target, bool skipClearing = false)
public void CopyTo(MatrixStorage<T> target, bool skipClearing = false)
{
var denseTarget = target as DenseColumnMajorMatrixStorage<T>;
if (denseTarget != null)
@ -179,15 +126,5 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
Array.Copy(Data, j*RowCount + sourceRowIndex, target.Data, jj*target.RowCount + targetRowIndex, rowCount);
}
}
int IMatrixStorage<T>.RowCount
{
get { return RowCount; }
}
int IMatrixStorage<T>.ColumnCount
{
get { return ColumnCount; }
}
}
}

51
src/Numerics/LinearAlgebra/Storage/IMatrixStorage.cs

@ -1,51 +0,0 @@
using System;
namespace MathNet.Numerics.LinearAlgebra.Storage
{
public interface IMatrixStorage<T> where T : struct, IEquatable<T>, IFormattable
{
int RowCount { get; }
int ColumnCount { get; }
/// <summary>
/// Gets or sets the value at the given row and column, with range checking.
/// </summary>
/// <param name="row">
/// The row of the element.
/// </param>
/// <param name="column">
/// The column of the element.
/// </param>
/// <value>The value to get or set.</value>
/// <remarks>This method is ranged checked. <see cref="At(int,int)"/> and <see cref="At(int,int,T)"/>
/// to get and set values without range checking.</remarks>
T this[int row, int column] { get; set; }
/// <summary>
/// Retrieves the requested element without range checking.
/// </summary>
/// <param name="row">
/// The row of the element.
/// </param>
/// <param name="column">
/// The column of the element.
/// </param>
/// <returns>
/// The requested element.
/// </returns>
/// <remarks>Not range-checked.</remarks>
T At(int row, int column);
/// <summary>
/// Sets the element without range checking.
/// </summary>
/// <param name="row"> The row of the element. </param>
/// <param name="column"> The column of the element. </param>
/// <param name="value"> The value to set the element to. </param>
/// <remarks>WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks.</remarks>
void At(int row, int column, T value);
void Clear();
void CopyTo(IMatrixStorage<T> target, bool skipClearing = false);
}
}

100
src/Numerics/LinearAlgebra/Storage/MatrixStorage.cs

@ -0,0 +1,100 @@
using System;
using MathNet.Numerics.Properties;
namespace MathNet.Numerics.LinearAlgebra.Storage
{
public abstract class MatrixStorage<T> where T : struct, IEquatable<T>, IFormattable
{
// [ruegg] public fields are OK here
public readonly int RowCount;
public readonly int ColumnCount;
protected MatrixStorage(int rowCount, int columnCount)
{
if (rowCount <= 0)
{
throw new ArgumentOutOfRangeException(Resources.MatrixRowsMustBePositive);
}
if (columnCount <= 0)
{
throw new ArgumentOutOfRangeException(Resources.MatrixColumnsMustBePositive);
}
RowCount = rowCount;
ColumnCount = columnCount;
}
/// <summary>
/// Gets or sets the value at the given row and column, with range checking.
/// </summary>
/// <param name="row">
/// The row of the element.
/// </param>
/// <param name="column">
/// The column of the element.
/// </param>
/// <value>The value to get or set.</value>
/// <remarks>This method is ranged checked. <see cref="At(int,int)"/> and <see cref="At(int,int,T)"/>
/// to get and set values without range checking.</remarks>
public T this[int row, int column]
{
get
{
if (row < 0 || row >= RowCount)
{
throw new ArgumentOutOfRangeException("row");
}
if (column < 0 || column >= ColumnCount)
{
throw new ArgumentOutOfRangeException("column");
}
return At(row, column);
}
set
{
if (row < 0 || row >= RowCount)
{
throw new ArgumentOutOfRangeException("row");
}
if (column < 0 || column >= ColumnCount)
{
throw new ArgumentOutOfRangeException("column");
}
At(row, column, value);
}
}
/// <summary>
/// Retrieves the requested element without range checking.
/// </summary>
/// <param name="row">
/// The row of the element.
/// </param>
/// <param name="column">
/// The column of the element.
/// </param>
/// <returns>
/// The requested element.
/// </returns>
/// <remarks>Not range-checked.</remarks>
public abstract T At(int row, int column);
/// <summary>
/// Sets the element without range checking.
/// </summary>
/// <param name="row"> The row of the element. </param>
/// <param name="column"> The column of the element. </param>
/// <param name="value"> The value to set the element to. </param>
/// <remarks>WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks.</remarks>
public abstract void At(int row, int column, T value);
public abstract void Clear();
}
}

71
src/Numerics/LinearAlgebra/Storage/SparseCompressedRowMatrixStorage.cs

@ -3,13 +3,11 @@ using MathNet.Numerics.Properties;
namespace MathNet.Numerics.LinearAlgebra.Storage
{
internal class SparseCompressedRowMatrixStorage<T> : IMatrixStorage<T>
internal class SparseCompressedRowMatrixStorage<T> : MatrixStorage<T>
where T : struct, IEquatable<T>, IFormattable
{
// [ruegg] public fields are OK here
public readonly int RowCount;
public readonly int ColumnCount;
readonly T _zero;
/// <summary>
@ -37,62 +35,15 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
public int ValueCount;
internal SparseCompressedRowMatrixStorage(int rows, int columns, T zero)
: base(rows, columns)
{
RowCount = rows;
ColumnCount = columns;
_zero = zero;
RowPointers = new int[rows];
ColumnIndices = new int[0];
Values = new T[0];
ValueCount = 0;
}
/// <summary>
/// Gets or sets the value at the given row and column, with range checking.
/// </summary>
/// <param name="row">
/// The row of the element.
/// </param>
/// <param name="column">
/// The column of the element.
/// </param>
/// <value>The value to get or set.</value>
/// <remarks>This method is ranged checked. <see cref="At(int,int)"/> and <see cref="At(int,int,T)"/>
/// to get and set values without range checking.</remarks>
public T this[int row, int column]
{
get
{
if (row < 0 || row >= RowCount)
{
throw new ArgumentOutOfRangeException("row");
}
if (column < 0 || column >= ColumnCount)
{
throw new ArgumentOutOfRangeException("column");
}
return At(row, column);
}
set
{
if (row < 0 || row >= RowCount)
{
throw new ArgumentOutOfRangeException("row");
}
if (column < 0 || column >= ColumnCount)
{
throw new ArgumentOutOfRangeException("column");
}
At(row, column, value);
}
}
/// <summary>
/// Retrieves the requested element without range checking.
/// </summary>
@ -106,7 +57,7 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
/// The requested element.
/// </returns>
/// <remarks>Not range-checked.</remarks>
public T At(int row, int column)
public override T At(int row, int column)
{
var index = FindItem(row, column);
return index >= 0 ? Values[index] : _zero;
@ -119,7 +70,7 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
/// <param name="column"> The column of the element. </param>
/// <param name="value"> The value to set the element to. </param>
/// <remarks>WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks.</remarks>
public void At(int row, int column, T value)
public override void At(int row, int column, T value)
{
var index = FindItem(row, column);
if (index >= 0)
@ -185,7 +136,7 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
}
}
public void Clear()
public override void Clear()
{
ValueCount = 0;
Array.Clear(RowPointers, 0, RowPointers.Length);
@ -266,7 +217,7 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
return delta;
}
public void CopyTo(IMatrixStorage<T> target, bool skipClearing = false)
public void CopyTo(MatrixStorage<T> target, bool skipClearing = false)
{
var sparseTarget = target as SparseCompressedRowMatrixStorage<T>;
if (sparseTarget != null)
@ -375,15 +326,5 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
}
}
}
int IMatrixStorage<T>.RowCount
{
get { return RowCount; }
}
int IMatrixStorage<T>.ColumnCount
{
get { return ColumnCount; }
}
}
}

76
src/Numerics/LinearAlgebra/Storage/SparseDiagonalMatrixStorage.cs

@ -3,84 +3,32 @@ using MathNet.Numerics.Properties;
namespace MathNet.Numerics.LinearAlgebra.Storage
{
internal class SparseDiagonalMatrixStorage<T> : IMatrixStorage<T>
internal class SparseDiagonalMatrixStorage<T> : MatrixStorage<T>
where T : struct, IEquatable<T>, IFormattable
{
// [ruegg] public fields are OK here
public readonly int RowCount;
public readonly int ColumnCount;
readonly T _zero;
public readonly T[] Data;
internal SparseDiagonalMatrixStorage(int rows, int columns, T zero)
: base(rows, columns)
{
RowCount = rows;
ColumnCount = columns;
_zero = zero;
Data = new T[Math.Min(rows, columns)];
}
internal SparseDiagonalMatrixStorage(int rows, int columns, T zero, T[] data)
: base(rows, columns)
{
RowCount = rows;
ColumnCount = columns;
_zero = zero;
Data = data;
}
/// <summary>
/// Gets or sets the value at the given row and column, with range checking.
/// </summary>
/// <param name="row">
/// The row of the element.
/// </param>
/// <param name="column">
/// The column of the element.
/// </param>
/// <value>The value to get or set.</value>
/// <remarks>This method is ranged checked. <see cref="At(int,int)"/> and <see cref="At(int,int,T)"/>
/// to get and set values without range checking.</remarks>
public T this[int row, int column]
{
get
{
if (row < 0 || row >= RowCount)
{
throw new ArgumentOutOfRangeException("row");
}
if (column < 0 || column >= ColumnCount)
{
throw new ArgumentOutOfRangeException("column");
}
return At(row, column);
}
set
{
if (row < 0 || row >= RowCount)
{
throw new ArgumentOutOfRangeException("row");
}
if (column < 0 || column >= ColumnCount)
{
throw new ArgumentOutOfRangeException("column");
}
At(row, column, value);
}
}
/// <summary>
/// Retrieves the requested element without range checking.
/// </summary>
public T At(int row, int column)
public override T At(int row, int column)
{
return row == column ? Data[row] : _zero;
}
@ -88,7 +36,7 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
/// <summary>
/// Sets the element without range checking.
/// </summary>
public void At(int row, int column, T value)
public override void At(int row, int column, T value)
{
if (row == column)
{
@ -100,12 +48,12 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
}
}
public void Clear()
public override void Clear()
{
Array.Clear(Data, 0, Data.Length);
}
public void CopyTo(IMatrixStorage<T> target, bool skipClearing = false)
public void CopyTo(MatrixStorage<T> target, bool skipClearing = false)
{
var diagonalTarget = target as SparseDiagonalMatrixStorage<T>;
if (diagonalTarget != null)
@ -329,15 +277,5 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
}
}
}
int IMatrixStorage<T>.RowCount
{
get { return RowCount; }
}
int IMatrixStorage<T>.ColumnCount
{
get { return ColumnCount; }
}
}
}

2
src/Numerics/Numerics.csproj

@ -332,7 +332,7 @@
<Compile Include="LinearAlgebra\Generic\Vector.cs" />
<Compile Include="LinearAlgebra\Single\Vector.cs" />
<Compile Include="LinearAlgebra\Storage\DenseColumnMajorMatrixStorage.cs" />
<Compile Include="LinearAlgebra\Storage\IMatrixStorage.cs" />
<Compile Include="LinearAlgebra\Storage\MatrixStorage.cs" />
<Compile Include="LinearAlgebra\Storage\SparseCompressedRowMatrixStorage.cs" />
<Compile Include="LinearAlgebra\Storage\SparseDiagonalMatrixStorage.cs" />
<Compile Include="Permutation.cs" />

4
src/Portable/Portable.csproj

@ -894,8 +894,8 @@
<Compile Include="..\Numerics\LinearAlgebra\Storage\DenseColumnMajorMatrixStorage.cs">
<Link>LinearAlgebra\Storage\DenseColumnMajorMatrixStorage.cs</Link>
</Compile>
<Compile Include="..\Numerics\LinearAlgebra\Storage\IMatrixStorage.cs">
<Link>LinearAlgebra\Storage\IMatrixStorage.cs</Link>
<Compile Include="..\Numerics\LinearAlgebra\Storage\MatrixStorage.cs">
<Link>LinearAlgebra\Storage\MatrixStorage.cs</Link>
</Compile>
<Compile Include="..\Numerics\LinearAlgebra\Storage\SparseCompressedRowMatrixStorage.cs">
<Link>LinearAlgebra\Storage\SparseCompressedRowMatrixStorage.cs</Link>

60
src/UnitTests/LinearAlgebraTests/Complex/UserDefinedMatrix.cs

@ -24,6 +24,9 @@
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
using System;
using MathNet.Numerics.LinearAlgebra.Storage;
namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex
{
using System.Numerics;
@ -35,18 +38,55 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex
/// </summary>
internal class UserDefinedMatrix : Matrix
{
/// <summary>
/// Values storage
/// </summary>
private readonly Complex[,] _data;
class UserDefinedMatrixStorage : MatrixStorage<Complex>
{
public readonly Complex[,] Data;
public UserDefinedMatrixStorage(int rowCount, int columnCount)
: base(rowCount, columnCount)
{
Data = new Complex[rowCount, columnCount];
}
public UserDefinedMatrixStorage(int rowCount, int columnCount, Complex[,] data)
: base(rowCount, columnCount)
{
Data = data;
}
public override Complex At(int row, int column)
{
return Data[row, column];
}
public override void At(int row, int column, Complex value)
{
Data[row, column] = value;
}
public override void Clear()
{
Array.Clear(Data, 0, RowCount * ColumnCount);
}
}
readonly UserDefinedMatrixStorage _storage;
readonly Complex[,] _data;
private UserDefinedMatrix(UserDefinedMatrixStorage storage)
: base(storage)
{
_storage = storage;
_data = _storage.Data;
}
/// <summary>
/// Initializes a new instance of the <see cref="UserDefinedMatrix"/> class. This matrix is square with a given size.
/// </summary>
/// <param name="order">the size of the square matrix.</param>
public UserDefinedMatrix(int order) : base(order, order)
public UserDefinedMatrix(int order)
: this(new UserDefinedMatrixStorage(order, order))
{
_data = new Complex[order, order];
}
/// <summary>
@ -54,18 +94,18 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex
/// </summary>
/// <param name="rows">The number of rows.</param>
/// <param name="columns">The number of columns.</param>
public UserDefinedMatrix(int rows, int columns) : base(rows, columns)
public UserDefinedMatrix(int rows, int columns)
: this(new UserDefinedMatrixStorage(rows, columns))
{
_data = new Complex[rows, columns];
}
/// <summary>
/// Initializes a new instance of the <see cref="UserDefinedMatrix"/> class from a 2D array.
/// </summary>
/// <param name="data">The 2D array to create this matrix from.</param>
public UserDefinedMatrix(Complex[,] data) : base(data.GetLength(0), data.GetLength(1))
public UserDefinedMatrix(Complex[,] data)
: this(new UserDefinedMatrixStorage(data.GetLength(0), data.GetLength(1), (Complex[,]) data.Clone()))
{
_data = (Complex[,])data.Clone();
}
/// <summary>

60
src/UnitTests/LinearAlgebraTests/Complex32/UserDefinedMatrix.cs

@ -24,6 +24,9 @@
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
using System;
using MathNet.Numerics.LinearAlgebra.Storage;
namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32
{
using LinearAlgebra.Complex32;
@ -35,18 +38,55 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32
/// </summary>
internal class UserDefinedMatrix : Matrix
{
/// <summary>
/// Values storage
/// </summary>
private readonly Complex32[,] _data;
class UserDefinedMatrixStorage : MatrixStorage<Complex32>
{
public readonly Complex32[,] Data;
public UserDefinedMatrixStorage(int rowCount, int columnCount)
: base(rowCount, columnCount)
{
Data = new Complex32[rowCount, columnCount];
}
public UserDefinedMatrixStorage(int rowCount, int columnCount, Complex32[,] data)
: base(rowCount, columnCount)
{
Data = data;
}
public override Complex32 At(int row, int column)
{
return Data[row, column];
}
public override void At(int row, int column, Complex32 value)
{
Data[row, column] = value;
}
public override void Clear()
{
Array.Clear(Data, 0, RowCount * ColumnCount);
}
}
readonly UserDefinedMatrixStorage _storage;
readonly Complex32[,] _data;
private UserDefinedMatrix(UserDefinedMatrixStorage storage)
: base(storage)
{
_storage = storage;
_data = _storage.Data;
}
/// <summary>
/// Initializes a new instance of the <see cref="UserDefinedMatrix"/> class. This matrix is square with a given size.
/// </summary>
/// <param name="order">the size of the square matrix.</param>
public UserDefinedMatrix(int order) : base(order, order)
public UserDefinedMatrix(int order)
: this(new UserDefinedMatrixStorage(order, order))
{
_data = new Complex32[order, order];
}
/// <summary>
@ -54,18 +94,18 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32
/// </summary>
/// <param name="rows">The number of rows.</param>
/// <param name="columns">The number of columns.</param>
public UserDefinedMatrix(int rows, int columns) : base(rows, columns)
public UserDefinedMatrix(int rows, int columns)
: this(new UserDefinedMatrixStorage(rows, columns))
{
_data = new Complex32[rows, columns];
}
/// <summary>
/// Initializes a new instance of the <see cref="UserDefinedMatrix"/> class from a 2D array.
/// </summary>
/// <param name="data">The 2D array to create this matrix from.</param>
public UserDefinedMatrix(Complex32[,] data) : base(data.GetLength(0), data.GetLength(1))
public UserDefinedMatrix(Complex32[,] data)
: this(new UserDefinedMatrixStorage(data.GetLength(0), data.GetLength(1), (Complex32[,])data.Clone()))
{
_data = (Complex32[,])data.Clone();
}
/// <summary>

60
src/UnitTests/LinearAlgebraTests/Double/UserDefinedMatrix.cs

@ -24,6 +24,9 @@
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
using System;
using MathNet.Numerics.LinearAlgebra.Storage;
namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double
{
using LinearAlgebra.Double;
@ -34,18 +37,55 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double
/// </summary>
internal class UserDefinedMatrix : Matrix
{
/// <summary>
/// Values storage
/// </summary>
private readonly double[,] _data;
private class UserDefinedMatrixStorage : MatrixStorage<double>
{
public readonly double[,] Data;
public UserDefinedMatrixStorage(int rowCount, int columnCount)
: base(rowCount, columnCount)
{
Data = new double[rowCount,columnCount];
}
public UserDefinedMatrixStorage(int rowCount, int columnCount, double[,] data)
: base(rowCount, columnCount)
{
Data = data;
}
public override double At(int row, int column)
{
return Data[row, column];
}
public override void At(int row, int column, double value)
{
Data[row, column] = value;
}
public override void Clear()
{
Array.Clear(Data, 0, RowCount * ColumnCount);
}
}
readonly UserDefinedMatrixStorage _storage;
readonly double[,] _data;
private UserDefinedMatrix(UserDefinedMatrixStorage storage)
: base(storage)
{
_storage = storage;
_data = _storage.Data;
}
/// <summary>
/// Initializes a new instance of the <see cref="UserDefinedMatrix"/> class. This matrix is square with a given size.
/// </summary>
/// <param name="order">the size of the square matrix.</param>
public UserDefinedMatrix(int order) : base(order, order)
public UserDefinedMatrix(int order)
: this(new UserDefinedMatrixStorage(order, order))
{
_data = new double[order, order];
}
/// <summary>
@ -53,18 +93,18 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double
/// </summary>
/// <param name="rows">The number of rows.</param>
/// <param name="columns">The number of columns.</param>
public UserDefinedMatrix(int rows, int columns) : base(rows, columns)
public UserDefinedMatrix(int rows, int columns)
: this(new UserDefinedMatrixStorage(rows, columns))
{
_data = new double[rows, columns];
}
/// <summary>
/// Initializes a new instance of the <see cref="UserDefinedMatrix"/> class from a 2D array.
/// </summary>
/// <param name="data">The 2D array to create this matrix from.</param>
public UserDefinedMatrix(double[,] data) : base(data.GetLength(0), data.GetLength(1))
public UserDefinedMatrix(double[,] data)
: this(new UserDefinedMatrixStorage(data.GetLength(0), data.GetLength(1), (double[,])data.Clone()))
{
_data = (double[,])data.Clone();
}
/// <summary>

60
src/UnitTests/LinearAlgebraTests/Single/UserDefinedMatrix.cs

@ -24,6 +24,9 @@
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>
using System;
using MathNet.Numerics.LinearAlgebra.Storage;
namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single
{
using LinearAlgebra.Generic;
@ -34,18 +37,55 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single
/// </summary>
internal class UserDefinedMatrix : Matrix
{
/// <summary>
/// Values storage
/// </summary>
private readonly float[,] _data;
class UserDefinedMatrixStorage : MatrixStorage<float>
{
public readonly float[,] Data;
public UserDefinedMatrixStorage(int rowCount, int columnCount)
: base(rowCount, columnCount)
{
Data = new float[rowCount, columnCount];
}
public UserDefinedMatrixStorage(int rowCount, int columnCount, float[,] data)
: base(rowCount, columnCount)
{
Data = data;
}
public override float At(int row, int column)
{
return Data[row, column];
}
public override void At(int row, int column, float value)
{
Data[row, column] = value;
}
public override void Clear()
{
Array.Clear(Data, 0, RowCount*ColumnCount);
}
}
readonly UserDefinedMatrixStorage _storage;
readonly float[,] _data;
private UserDefinedMatrix(UserDefinedMatrixStorage storage)
: base(storage)
{
_storage = storage;
_data = _storage.Data;
}
/// <summary>
/// Initializes a new instance of the <see cref="UserDefinedMatrix"/> class. This matrix is square with a given size.
/// </summary>
/// <param name="order">the size of the square matrix.</param>
public UserDefinedMatrix(int order) : base(order, order)
public UserDefinedMatrix(int order)
: this(new UserDefinedMatrixStorage(order, order))
{
_data = new float[order, order];
}
/// <summary>
@ -53,18 +93,18 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single
/// </summary>
/// <param name="rows">The number of rows.</param>
/// <param name="columns">The number of columns.</param>
public UserDefinedMatrix(int rows, int columns) : base(rows, columns)
public UserDefinedMatrix(int rows, int columns)
: this(new UserDefinedMatrixStorage(rows, columns))
{
_data = new float[rows, columns];
}
/// <summary>
/// Initializes a new instance of the <see cref="UserDefinedMatrix"/> class from a 2D array.
/// </summary>
/// <param name="data">The 2D array to create this matrix from.</param>
public UserDefinedMatrix(float[,] data) : base(data.GetLength(0), data.GetLength(1))
public UserDefinedMatrix(float[,] data)
: this(new UserDefinedMatrixStorage(data.GetLength(0), data.GetLength(1), (float[,])data.Clone()))
{
_data = (float[,])data.Clone();
}
/// <summary>

Loading…
Cancel
Save