From c606b329b89e2908415c722748df15a71faccdc6 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 21 Nov 2012 17:17:28 +0200 Subject: [PATCH] Add SymmetricMatrixStorage Signed-off-by: Alexander Karatarakis --- .../DenseColumnMajorSymmetricMatrixStorage.cs | 6 +-- .../Storage/SymmetricMatrixStorage.cs | 52 +++++++++++++++++++ src/Numerics/Numerics.csproj | 1 + 3 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 src/Numerics/LinearAlgebra/Storage/SymmetricMatrixStorage.cs diff --git a/src/Numerics/LinearAlgebra/Storage/DenseColumnMajorSymmetricMatrixStorage.cs b/src/Numerics/LinearAlgebra/Storage/DenseColumnMajorSymmetricMatrixStorage.cs index 0c273907..a2b52833 100644 --- a/src/Numerics/LinearAlgebra/Storage/DenseColumnMajorSymmetricMatrixStorage.cs +++ b/src/Numerics/LinearAlgebra/Storage/DenseColumnMajorSymmetricMatrixStorage.cs @@ -5,7 +5,7 @@ namespace MathNet.Numerics.LinearAlgebra.Storage using MathNet.Numerics.LinearAlgebra.Storage.Indexers.Static; using MathNet.Numerics.Properties; - public class DenseColumnMajorSymmetricMatrixStorage : MatrixStorage + public class DenseColumnMajorSymmetricMatrixStorage : SymmetricMatrixStorage where T : struct, IEquatable, IFormattable { // [ruegg] public fields are OK here @@ -15,14 +15,14 @@ namespace MathNet.Numerics.LinearAlgebra.Storage public readonly PackedStorageIndexerUpper Indexer; internal DenseColumnMajorSymmetricMatrixStorage(int order) - : base(order, order) + : base(order) { Indexer = new PackedStorageIndexerUpper(order); Data = new T[Indexer.DataLength]; } internal DenseColumnMajorSymmetricMatrixStorage(int order, T[] data) - : base(order, order) + : base(order) { if (data == null) { diff --git a/src/Numerics/LinearAlgebra/Storage/SymmetricMatrixStorage.cs b/src/Numerics/LinearAlgebra/Storage/SymmetricMatrixStorage.cs new file mode 100644 index 00000000..8ff1a641 --- /dev/null +++ b/src/Numerics/LinearAlgebra/Storage/SymmetricMatrixStorage.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MathNet.Numerics.LinearAlgebra.Storage +{ + using MathNet.Numerics.Properties; + + public abstract class SymmetricMatrixStorage : MatrixStorage + where T : struct, IEquatable, IFormattable + { + // [ruegg] public fields are OK here + + protected SymmetricMatrixStorage(int order) + : base(order, order) + { + } + + public override bool IsFullyMutable + { + get { return false; } + } + + public override bool IsMutable(int row, int column) + { + return row <= column; + } + + public override void Clear() + { + for (var i = 0; i < RowCount; i++) + { + for (var j = i; j < ColumnCount; j++) + { + At(i, j, default(T)); + } + } + } + + public override void Clear(int rowIndex, int rowCount, int columnIndex, int columnCount) + { + for (var i = rowIndex; i < rowIndex + rowCount; i++) + { + for (var j = Math.Max(columnIndex, i); j < columnIndex + columnCount; j++) + { + At(i, j, default(T)); + } + } + } + } +} diff --git a/src/Numerics/Numerics.csproj b/src/Numerics/Numerics.csproj index a744dbca..12d2ad78 100644 --- a/src/Numerics/Numerics.csproj +++ b/src/Numerics/Numerics.csproj @@ -359,6 +359,7 @@ +