From aa5716fdb6143a53629c1d2c89497b016edbf357 Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Sun, 12 Aug 2012 21:36:15 +0200 Subject: [PATCH] Matrix types declare whether they are partially or fully mutable --- .../LinearAlgebra/Complex/DiagonalMatrix.cs | 12 +++++------ .../LinearAlgebra/Complex32/DiagonalMatrix.cs | 12 +++++------ .../LinearAlgebra/Double/DiagonalMatrix.cs | 12 +++++------ src/Numerics/LinearAlgebra/Generic/Matrix.cs | 18 +++++++++++++++++ .../LinearAlgebra/Single/DiagonalMatrix.cs | 12 +++++------ ...rixStorage.cs => DiagonalMatrixStorage.cs} | 20 ++++++++++++++----- .../LinearAlgebra/Storage/MatrixStorage.cs | 10 ++++++++++ src/Numerics/Numerics.csproj | 2 +- .../MatrixStructureTheory.Access.cs | 4 ++-- 9 files changed, 70 insertions(+), 32 deletions(-) rename src/Numerics/LinearAlgebra/Storage/{SparseDiagonalMatrixStorage.cs => DiagonalMatrixStorage.cs} (94%) diff --git a/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs index 82582656..ff0a1104 100644 --- a/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs @@ -46,7 +46,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex [Serializable] public class DiagonalMatrix : Matrix { - readonly SparseDiagonalMatrixStorage _storage; + readonly DiagonalMatrixStorage _storage; /// /// Gets the matrix's data. @@ -54,12 +54,12 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// The matrix's data. readonly Complex[] _data; - internal SparseDiagonalMatrixStorage Raw + internal DiagonalMatrixStorage Raw { get { return _storage; } } - internal DiagonalMatrix(SparseDiagonalMatrixStorage storage) + internal DiagonalMatrix(DiagonalMatrixStorage storage) : base(storage) { _storage = storage; @@ -74,7 +74,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// If is less than one. /// public DiagonalMatrix(int order) - : this(new SparseDiagonalMatrixStorage(order, order, Complex.Zero)) + : this(new DiagonalMatrixStorage(order, order, Complex.Zero)) { } @@ -88,7 +88,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// The number of columns. /// public DiagonalMatrix(int rows, int columns) - : this(new SparseDiagonalMatrixStorage(rows, columns, Complex.Zero)) + : this(new DiagonalMatrixStorage(rows, columns, Complex.Zero)) { } @@ -119,7 +119,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// The number of columns. /// The one dimensional array which contain diagonal elements. public DiagonalMatrix(int rows, int columns, Complex[] diagonalArray) - : this(new SparseDiagonalMatrixStorage(rows, columns, Complex.Zero, diagonalArray)) + : this(new DiagonalMatrixStorage(rows, columns, Complex.Zero, diagonalArray)) { } diff --git a/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs index 6fb1ab91..3ea0e18b 100644 --- a/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs @@ -46,7 +46,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 [Serializable] public class DiagonalMatrix : Matrix { - readonly SparseDiagonalMatrixStorage _storage; + readonly DiagonalMatrixStorage _storage; /// /// Gets the matrix's data. @@ -54,12 +54,12 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// The matrix's data. readonly Complex32[] _data; - internal SparseDiagonalMatrixStorage Raw + internal DiagonalMatrixStorage Raw { get { return _storage; } } - internal DiagonalMatrix(SparseDiagonalMatrixStorage storage) + internal DiagonalMatrix(DiagonalMatrixStorage storage) : base(storage) { _storage = storage; @@ -74,7 +74,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// If is less than one. /// public DiagonalMatrix(int order) - : this(new SparseDiagonalMatrixStorage(order, order, Complex32.Zero)) + : this(new DiagonalMatrixStorage(order, order, Complex32.Zero)) { } @@ -88,7 +88,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// The number of columns. /// public DiagonalMatrix(int rows, int columns) - : this(new SparseDiagonalMatrixStorage(rows, columns, Complex32.Zero)) + : this(new DiagonalMatrixStorage(rows, columns, Complex32.Zero)) { } @@ -119,7 +119,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// The number of columns. /// The one dimensional array which contain diagonal elements. public DiagonalMatrix(int rows, int columns, Complex32[] diagonalArray) - : this(new SparseDiagonalMatrixStorage(rows, columns, Complex32.Zero, diagonalArray)) + : this(new DiagonalMatrixStorage(rows, columns, Complex32.Zero, diagonalArray)) { } diff --git a/src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs index 5e1b9c8d..0d05b6e1 100644 --- a/src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs @@ -45,7 +45,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double [Serializable] public class DiagonalMatrix : Matrix { - readonly SparseDiagonalMatrixStorage _storage; + readonly DiagonalMatrixStorage _storage; /// /// Gets the matrix's data. @@ -53,12 +53,12 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// The matrix's data. readonly double[] _data; - internal SparseDiagonalMatrixStorage Raw + internal DiagonalMatrixStorage Raw { get { return _storage; } } - internal DiagonalMatrix(SparseDiagonalMatrixStorage storage) + internal DiagonalMatrix(DiagonalMatrixStorage storage) : base(storage) { _storage = storage; @@ -73,7 +73,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// If is less than one. /// public DiagonalMatrix(int order) - : this(new SparseDiagonalMatrixStorage(order, order, 0d)) + : this(new DiagonalMatrixStorage(order, order, 0d)) { } @@ -87,7 +87,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// The number of columns. /// public DiagonalMatrix(int rows, int columns) - : this(new SparseDiagonalMatrixStorage(rows, columns, 0d)) + : this(new DiagonalMatrixStorage(rows, columns, 0d)) { } @@ -118,7 +118,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// The number of columns. /// The one dimensional array which contain diagonal elements. public DiagonalMatrix(int rows, int columns, double[] diagonalArray) - : this(new SparseDiagonalMatrixStorage(rows, columns, 0d, diagonalArray)) + : this(new DiagonalMatrixStorage(rows, columns, 0d, diagonalArray)) { } diff --git a/src/Numerics/LinearAlgebra/Generic/Matrix.cs b/src/Numerics/LinearAlgebra/Generic/Matrix.cs index 0bbe4999..dfbc22ca 100644 --- a/src/Numerics/LinearAlgebra/Generic/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Generic/Matrix.cs @@ -204,6 +204,24 @@ namespace MathNet.Numerics.LinearAlgebra.Generic Storage.At(row, column, value); } + /// + /// True if all fields of this matrix can be set to any value. + /// False if some fields are fixed, like on a diagonal matrix. + /// + public bool IsFullyMutable + { + get { return Storage.IsFullyMutable; } + } + + /// + /// 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. + /// + public bool IsMutable(int row, int column) + { + return Storage.IsMutable(row, column); + } + /// /// Sets all values to zero. /// diff --git a/src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs index 92ea1134..526d729f 100644 --- a/src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs @@ -45,7 +45,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single [Serializable] public class DiagonalMatrix : Matrix { - readonly SparseDiagonalMatrixStorage _storage; + readonly DiagonalMatrixStorage _storage; /// /// Gets the matrix's data. @@ -53,12 +53,12 @@ namespace MathNet.Numerics.LinearAlgebra.Single /// The matrix's data. readonly float[] _data; - internal SparseDiagonalMatrixStorage Raw + internal DiagonalMatrixStorage Raw { get { return _storage; } } - internal DiagonalMatrix(SparseDiagonalMatrixStorage storage) + internal DiagonalMatrix(DiagonalMatrixStorage storage) : base(storage) { _storage = storage; @@ -73,7 +73,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single /// If is less than one. /// public DiagonalMatrix(int order) - : this(new SparseDiagonalMatrixStorage(order, order, 0f)) + : this(new DiagonalMatrixStorage(order, order, 0f)) { } @@ -87,7 +87,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single /// The number of columns. /// public DiagonalMatrix(int rows, int columns) - : this(new SparseDiagonalMatrixStorage(rows, columns, 0f)) + : this(new DiagonalMatrixStorage(rows, columns, 0f)) { } @@ -118,7 +118,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single /// The number of columns. /// The one dimensional array which contain diagonal elements. public DiagonalMatrix(int rows, int columns, float[] diagonalArray) - : this(new SparseDiagonalMatrixStorage(rows, columns, 0f, diagonalArray)) + : this(new DiagonalMatrixStorage(rows, columns, 0f, diagonalArray)) { } diff --git a/src/Numerics/LinearAlgebra/Storage/SparseDiagonalMatrixStorage.cs b/src/Numerics/LinearAlgebra/Storage/DiagonalMatrixStorage.cs similarity index 94% rename from src/Numerics/LinearAlgebra/Storage/SparseDiagonalMatrixStorage.cs rename to src/Numerics/LinearAlgebra/Storage/DiagonalMatrixStorage.cs index a5ce6575..fb97ae3c 100644 --- a/src/Numerics/LinearAlgebra/Storage/SparseDiagonalMatrixStorage.cs +++ b/src/Numerics/LinearAlgebra/Storage/DiagonalMatrixStorage.cs @@ -3,7 +3,7 @@ using MathNet.Numerics.Properties; namespace MathNet.Numerics.LinearAlgebra.Storage { - internal class SparseDiagonalMatrixStorage : MatrixStorage + internal class DiagonalMatrixStorage : MatrixStorage where T : struct, IEquatable, 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 /// Parameters assumed to be validated already. public override void CopyTo(MatrixStorage target, bool skipClearing = false) { - var diagonalTarget = target as SparseDiagonalMatrixStorage; + var diagonalTarget = target as DiagonalMatrixStorage; if (diagonalTarget != null) { CopyTo(diagonalTarget); @@ -90,7 +100,7 @@ namespace MathNet.Numerics.LinearAlgebra.Storage } } - public void CopyTo(SparseDiagonalMatrixStorage target) + public void CopyTo(DiagonalMatrixStorage target) { if (ReferenceEquals(this, target)) { diff --git a/src/Numerics/LinearAlgebra/Storage/MatrixStorage.cs b/src/Numerics/LinearAlgebra/Storage/MatrixStorage.cs index 394b6990..99dbe5aa 100644 --- a/src/Numerics/LinearAlgebra/Storage/MatrixStorage.cs +++ b/src/Numerics/LinearAlgebra/Storage/MatrixStorage.cs @@ -77,6 +77,16 @@ namespace MathNet.Numerics.LinearAlgebra.Storage /// WARNING: This method is not thread safe. Use "lock" with it and be sure to avoid deadlocks. 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++) diff --git a/src/Numerics/Numerics.csproj b/src/Numerics/Numerics.csproj index 591677ef..2d505507 100644 --- a/src/Numerics/Numerics.csproj +++ b/src/Numerics/Numerics.csproj @@ -334,7 +334,7 @@ - + diff --git a/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.Access.cs b/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.Access.cs index ffbd1ebf..4e2a54c7 100644 --- a/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.Access.cs +++ b/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.Access.cs @@ -59,7 +59,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests } [Theory, Timeout(200)] - public virtual void CanGetRowWithRange(Matrix matrix) + public void CanGetRowWithRange(Matrix 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 matrix) + public void CanGetColumnWithRange(Matrix matrix) { // First Column, Rows 0..1 var firstcol = matrix.Column(0, 0, 2);