Browse Source

Add new class: DenseColumnMajorSymmetricMatrixStorage

Signed-off-by: Alexander Karatarakis <alex@karatarakis.com>
la-symmetric^2
Alexander Karatarakis 14 years ago
parent
commit
708a4d3820
  1. 77
      src/Numerics/LinearAlgebra/Storage/DenseColumnMajorSymmetricMatrixStorage.cs
  2. 2
      src/Numerics/LinearAlgebra/Storage/Indexers/Static/PackedStorageIndexer.cs
  3. 2
      src/Numerics/LinearAlgebra/Storage/Indexers/Static/PackedStorageIndexerUpper.cs
  4. 1
      src/Numerics/Numerics.csproj

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

@ -0,0 +1,77 @@
using System;
namespace MathNet.Numerics.LinearAlgebra.Storage
{
using MathNet.Numerics.LinearAlgebra.Storage.Indexers.Static;
using MathNet.Numerics.Properties;
public class DenseColumnMajorSymmetricMatrixStorage<T> : MatrixStorage<T>
where T : struct, IEquatable<T>, IFormattable
{
// [ruegg] public fields are OK here
public readonly T[] Data;
public readonly PackedStorageIndexerUpper Indexer;
internal DenseColumnMajorSymmetricMatrixStorage(int order)
: base(order, order)
{
Indexer = new PackedStorageIndexerUpper(order);
Data = new T[Indexer.DataLength];
}
internal DenseColumnMajorSymmetricMatrixStorage(int order, T[] data)
: base(order, order)
{
if (data == null)
{
throw new ArgumentNullException("data");
}
Indexer = new PackedStorageIndexerUpper(order);
if (data.Length != Indexer.DataLength)
{
throw new ArgumentOutOfRangeException("data", string.Format(Resources.ArgumentArrayWrongLength, Indexer.DataLength));
}
Data = data;
}
/// <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 override T At(int row, int column)
{
return Data[Indexer.IndexOf(row, 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 override void At(int row, int column, T value)
{
Data[Indexer.IndexOf(row, column)] = value;
}
public override void Clear()
{
Array.Clear(Data, 0, Data.Length);
}
}
}

2
src/Numerics/LinearAlgebra/Storage/Indexers/Static/PackedStorageIndexer.cs

@ -4,7 +4,7 @@
using Properties;
/// <summary>
/// A class for managing indexing when using Packed Storage indexer, which is a column-major packing scheme for dense Symmetric, Hermitian or Triangular square matrices.
/// A class for managing indexing when using Packed Storage, which is a column-major packing scheme for dense Symmetric, Hermitian or Triangular square matrices.
/// </summary>
public abstract class PackedStorageIndexer : StaticStorageIndexer
{

2
src/Numerics/LinearAlgebra/Storage/Indexers/Static/PackedStorageIndexerUpper.cs

@ -3,7 +3,7 @@
using System;
/// <summary>
/// A class for managing indexing when using Packed Storage scheme, which is a column-Wise packing scheme for Symmetric, Hermitian or Triangular square matrices.
/// A class for managing indexes when using Packed Storage, which is a column-major packing scheme for Symmetric, Hermitian or Triangular square matrices.
/// This variation provides indexes for storing the upper triangle of a matrix (row less than or equal to column).
/// </summary>
public class PackedStorageIndexerUpper : PackedStorageIndexer

1
src/Numerics/Numerics.csproj

@ -140,6 +140,7 @@
<Compile Include="Distributions\Multivariate\InverseWishart.cs" />
<Compile Include="Distributions\Multivariate\MatrixNormal.cs" />
<Compile Include="Distributions\Multivariate\Wishart.cs" />
<Compile Include="LinearAlgebra\Storage\DenseColumnMajorSymmetricMatrixStorage.cs" />
<Compile Include="LinearAlgebra\Storage\DenseVectorStorage.cs" />
<Compile Include="LinearAlgebra\Storage\Indexers\IStorageIndexer.cs" />
<Compile Include="LinearAlgebra\Storage\Indexers\Static\PackedStorageIndexer.cs" />

Loading…
Cancel
Save