Browse Source

Matrix types declare whether they are partially or fully mutable

la-knuth
Christoph Ruegg 14 years ago
parent
commit
aa5716fdb6
  1. 12
      src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs
  2. 12
      src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs
  3. 12
      src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs
  4. 18
      src/Numerics/LinearAlgebra/Generic/Matrix.cs
  5. 12
      src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs
  6. 20
      src/Numerics/LinearAlgebra/Storage/DiagonalMatrixStorage.cs
  7. 10
      src/Numerics/LinearAlgebra/Storage/MatrixStorage.cs
  8. 2
      src/Numerics/Numerics.csproj
  9. 4
      src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.Access.cs

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

@ -46,7 +46,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
[Serializable]
public class DiagonalMatrix : Matrix
{
readonly SparseDiagonalMatrixStorage<Complex> _storage;
readonly DiagonalMatrixStorage<Complex> _storage;
/// <summary>
/// Gets the matrix's data.
@ -54,12 +54,12 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <value>The matrix's data.</value>
readonly Complex[] _data;
internal SparseDiagonalMatrixStorage<Complex> Raw
internal DiagonalMatrixStorage<Complex> Raw
{
get { return _storage; }
}
internal DiagonalMatrix(SparseDiagonalMatrixStorage<Complex> storage)
internal DiagonalMatrix(DiagonalMatrixStorage<Complex> storage)
: base(storage)
{
_storage = storage;
@ -74,7 +74,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// If <paramref name="order"/> is less than one.
/// </exception>
public DiagonalMatrix(int order)
: this(new SparseDiagonalMatrixStorage<Complex>(order, order, Complex.Zero))
: this(new DiagonalMatrixStorage<Complex>(order, order, Complex.Zero))
{
}
@ -88,7 +88,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// The number of columns.
/// </param>
public DiagonalMatrix(int rows, int columns)
: this(new SparseDiagonalMatrixStorage<Complex>(rows, columns, Complex.Zero))
: this(new DiagonalMatrixStorage<Complex>(rows, columns, Complex.Zero))
{
}
@ -119,7 +119,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <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)
: this(new SparseDiagonalMatrixStorage<Complex>(rows, columns, Complex.Zero, diagonalArray))
: this(new DiagonalMatrixStorage<Complex>(rows, columns, Complex.Zero, diagonalArray))
{
}

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

@ -46,7 +46,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
[Serializable]
public class DiagonalMatrix : Matrix
{
readonly SparseDiagonalMatrixStorage<Complex32> _storage;
readonly DiagonalMatrixStorage<Complex32> _storage;
/// <summary>
/// Gets the matrix's data.
@ -54,12 +54,12 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// <value>The matrix's data.</value>
readonly Complex32[] _data;
internal SparseDiagonalMatrixStorage<Complex32> Raw
internal DiagonalMatrixStorage<Complex32> Raw
{
get { return _storage; }
}
internal DiagonalMatrix(SparseDiagonalMatrixStorage<Complex32> storage)
internal DiagonalMatrix(DiagonalMatrixStorage<Complex32> storage)
: base(storage)
{
_storage = storage;
@ -74,7 +74,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// If <paramref name="order"/> is less than one.
/// </exception>
public DiagonalMatrix(int order)
: this(new SparseDiagonalMatrixStorage<Complex32>(order, order, Complex32.Zero))
: this(new DiagonalMatrixStorage<Complex32>(order, order, Complex32.Zero))
{
}
@ -88,7 +88,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// The number of columns.
/// </param>
public DiagonalMatrix(int rows, int columns)
: this(new SparseDiagonalMatrixStorage<Complex32>(rows, columns, Complex32.Zero))
: this(new DiagonalMatrixStorage<Complex32>(rows, columns, Complex32.Zero))
{
}
@ -119,7 +119,7 @@ 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)
: this(new SparseDiagonalMatrixStorage<Complex32>(rows, columns, Complex32.Zero, diagonalArray))
: this(new DiagonalMatrixStorage<Complex32>(rows, columns, Complex32.Zero, diagonalArray))
{
}

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

@ -45,7 +45,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
[Serializable]
public class DiagonalMatrix : Matrix
{
readonly SparseDiagonalMatrixStorage<double> _storage;
readonly DiagonalMatrixStorage<double> _storage;
/// <summary>
/// Gets the matrix's data.
@ -53,12 +53,12 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <value>The matrix's data.</value>
readonly double[] _data;
internal SparseDiagonalMatrixStorage<double> Raw
internal DiagonalMatrixStorage<double> Raw
{
get { return _storage; }
}
internal DiagonalMatrix(SparseDiagonalMatrixStorage<double> storage)
internal DiagonalMatrix(DiagonalMatrixStorage<double> storage)
: base(storage)
{
_storage = storage;
@ -73,7 +73,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// If <paramref name="order"/> is less than one.
/// </exception>
public DiagonalMatrix(int order)
: this(new SparseDiagonalMatrixStorage<double>(order, order, 0d))
: this(new DiagonalMatrixStorage<double>(order, order, 0d))
{
}
@ -87,7 +87,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// The number of columns.
/// </param>
public DiagonalMatrix(int rows, int columns)
: this(new SparseDiagonalMatrixStorage<double>(rows, columns, 0d))
: this(new DiagonalMatrixStorage<double>(rows, columns, 0d))
{
}
@ -118,7 +118,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <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)
: this(new SparseDiagonalMatrixStorage<double>(rows, columns, 0d, diagonalArray))
: this(new DiagonalMatrixStorage<double>(rows, columns, 0d, diagonalArray))
{
}

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

@ -204,6 +204,24 @@ namespace MathNet.Numerics.LinearAlgebra.Generic
Storage.At(row, column, value);
}
/// <summary>
/// True if all fields of this matrix can be set to any value.
/// False if some fields are fixed, like on a diagonal matrix.
/// </summary>
public bool IsFullyMutable
{
get { return Storage.IsFullyMutable; }
}
/// <summary>
/// True if the specified field can be set to any value.
/// Fall if the field is fixed, like an off-diagonal field on a diagonal matrix.
/// </summary>
public bool IsMutable(int row, int column)
{
return Storage.IsMutable(row, column);
}
/// <summary>
/// Sets all values to zero.
/// </summary>

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

@ -45,7 +45,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
[Serializable]
public class DiagonalMatrix : Matrix
{
readonly SparseDiagonalMatrixStorage<float> _storage;
readonly DiagonalMatrixStorage<float> _storage;
/// <summary>
/// Gets the matrix's data.
@ -53,12 +53,12 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// <value>The matrix's data.</value>
readonly float[] _data;
internal SparseDiagonalMatrixStorage<float> Raw
internal DiagonalMatrixStorage<float> Raw
{
get { return _storage; }
}
internal DiagonalMatrix(SparseDiagonalMatrixStorage<float> storage)
internal DiagonalMatrix(DiagonalMatrixStorage<float> storage)
: base(storage)
{
_storage = storage;
@ -73,7 +73,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// If <paramref name="order"/> is less than one.
/// </exception>
public DiagonalMatrix(int order)
: this(new SparseDiagonalMatrixStorage<float>(order, order, 0f))
: this(new DiagonalMatrixStorage<float>(order, order, 0f))
{
}
@ -87,7 +87,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// The number of columns.
/// </param>
public DiagonalMatrix(int rows, int columns)
: this(new SparseDiagonalMatrixStorage<float>(rows, columns, 0f))
: this(new DiagonalMatrixStorage<float>(rows, columns, 0f))
{
}
@ -118,7 +118,7 @@ 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)
: this(new SparseDiagonalMatrixStorage<float>(rows, columns, 0f, diagonalArray))
: this(new DiagonalMatrixStorage<float>(rows, columns, 0f, diagonalArray))
{
}

20
src/Numerics/LinearAlgebra/Storage/SparseDiagonalMatrixStorage.cs → src/Numerics/LinearAlgebra/Storage/DiagonalMatrixStorage.cs

@ -3,7 +3,7 @@ using MathNet.Numerics.Properties;
namespace MathNet.Numerics.LinearAlgebra.Storage
{
internal class SparseDiagonalMatrixStorage<T> : MatrixStorage<T>
internal class DiagonalMatrixStorage<T> : MatrixStorage<T>
where T : struct, IEquatable<T>, IFormattable
{
// [ruegg] public fields are OK here
@ -11,14 +11,14 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
readonly T _zero;
public readonly T[] Data;
internal SparseDiagonalMatrixStorage(int rows, int columns, T zero)
internal DiagonalMatrixStorage(int rows, int columns, T zero)
: base(rows, columns)
{
_zero = zero;
Data = new T[Math.Min(rows, columns)];
}
internal SparseDiagonalMatrixStorage(int rows, int columns, T zero, T[] data)
internal DiagonalMatrixStorage(int rows, int columns, T zero, T[] data)
: base(rows, columns)
{
_zero = zero;
@ -48,6 +48,16 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
}
}
public override bool IsFullyMutable
{
get { return false; }
}
public override bool IsMutable(int row, int column)
{
return row == column;
}
public override void Clear()
{
Array.Clear(Data, 0, Data.Length);
@ -56,7 +66,7 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
/// <remarks>Parameters assumed to be validated already.</remarks>
public override void CopyTo(MatrixStorage<T> target, bool skipClearing = false)
{
var diagonalTarget = target as SparseDiagonalMatrixStorage<T>;
var diagonalTarget = target as DiagonalMatrixStorage<T>;
if (diagonalTarget != null)
{
CopyTo(diagonalTarget);
@ -90,7 +100,7 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
}
}
public void CopyTo(SparseDiagonalMatrixStorage<T> target)
public void CopyTo(DiagonalMatrixStorage<T> target)
{
if (ReferenceEquals(this, target))
{

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

@ -77,6 +77,16 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
/// <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 virtual bool IsFullyMutable
{
get { return true; }
}
public virtual bool IsMutable(int row, int column)
{
return true;
}
public virtual void Clear()
{
for (var i = 0; i < RowCount; i++)

2
src/Numerics/Numerics.csproj

@ -334,7 +334,7 @@
<Compile Include="LinearAlgebra\Storage\DenseColumnMajorMatrixStorage.cs" />
<Compile Include="LinearAlgebra\Storage\MatrixStorage.cs" />
<Compile Include="LinearAlgebra\Storage\SparseCompressedRowMatrixStorage.cs" />
<Compile Include="LinearAlgebra\Storage\SparseDiagonalMatrixStorage.cs" />
<Compile Include="LinearAlgebra\Storage\DiagonalMatrixStorage.cs" />
<Compile Include="Permutation.cs" />
<Compile Include="Distributions\Continuous\Beta.cs" />
<Compile Include="Distributions\Continuous\ContinuousUniform.cs" />

4
src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.Access.cs

@ -59,7 +59,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests
}
[Theory, Timeout(200)]
public virtual void CanGetRowWithRange(Matrix<T> matrix)
public void CanGetRowWithRange(Matrix<T> matrix)
{
// First Row, Columns 0..1
var firstrow = matrix.Row(0, 0, 2);
@ -151,7 +151,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests
}
[Theory, Timeout(200)]
public virtual void CanGetColumnWithRange(Matrix<T> matrix)
public void CanGetColumnWithRange(Matrix<T> matrix)
{
// First Column, Rows 0..1
var firstcol = matrix.Column(0, 0, 2);

Loading…
Cancel
Save