Browse Source

LA: sparse matrix OfColumnMajorList

v2
Christoph Ruegg 14 years ago
parent
commit
555879bdd2
  1. 31
      src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs
  2. 31
      src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs
  3. 31
      src/Numerics/LinearAlgebra/Double/SparseMatrix.cs
  4. 31
      src/Numerics/LinearAlgebra/Single/SparseMatrix.cs
  5. 36
      src/Numerics/LinearAlgebra/Storage/SparseCompressedRowMatrixStorage.cs

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

@ -131,22 +131,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// A new memory block will be allocated for storing the matrix.
/// </summary>
/// <seealso href="http://en.wikipedia.org/wiki/Row-major_order"/>
public static SparseMatrix OfColumnMajor(int rows, int columns, Complex[] array)
public static SparseMatrix OfColumnMajor(int rows, int columns, Complex[] columnMajor)
{
if (rows * columns > array.Length)
{
throw new ArgumentOutOfRangeException(Resources.ArgumentMatrixDimensions);
}
var storage = new SparseCompressedRowMatrixStorage<Complex>(rows, columns);
for (var i = 0; i < rows; i++)
{
for (var j = 0; j < columns; j++)
{
storage.At(i, j, array[i + (j * rows)]);
}
}
return new SparseMatrix(storage);
return new SparseMatrix(SparseCompressedRowMatrixStorage<Complex>.OfColumnMajorList(rows, columns, columnMajor));
}
/// <summary>
@ -197,20 +184,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <seealso href="http://en.wikipedia.org/wiki/Row-major_order"/>
[Obsolete("Use SparseMatrix.OfColumnMajor instead. Scheduled for removal in v3.0.")]
public SparseMatrix(int rows, int columns, Complex[] array)
: this(rows, columns)
: this(SparseCompressedRowMatrixStorage<Complex>.OfColumnMajorList(rows, columns, array))
{
if (rows * columns > array.Length)
{
throw new ArgumentOutOfRangeException(Resources.ArgumentMatrixDimensions);
}
for (var i = 0; i < rows; i++)
{
for (var j = 0; j < columns; j++)
{
_storage.At(i, j, array[i + (j * rows)]);
}
}
}
/// <summary>

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

@ -131,22 +131,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// A new memory block will be allocated for storing the matrix.
/// </summary>
/// <seealso href="http://en.wikipedia.org/wiki/Row-major_order"/>
public static SparseMatrix OfColumnMajor(int rows, int columns, Complex32[] array)
public static SparseMatrix OfColumnMajor(int rows, int columns, Complex32[] columnMajor)
{
if (rows * columns > array.Length)
{
throw new ArgumentOutOfRangeException(Resources.ArgumentMatrixDimensions);
}
var storage = new SparseCompressedRowMatrixStorage<Complex32>(rows, columns);
for (var i = 0; i < rows; i++)
{
for (var j = 0; j < columns; j++)
{
storage.At(i, j, array[i + (j * rows)]);
}
}
return new SparseMatrix(storage);
return new SparseMatrix(SparseCompressedRowMatrixStorage<Complex32>.OfColumnMajorList(rows, columns, columnMajor));
}
/// <summary>
@ -197,20 +184,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// <seealso href="http://en.wikipedia.org/wiki/Row-major_order"/>
[Obsolete("Use SparseMatrix.OfColumnMajor instead. Scheduled for removal in v3.0.")]
public SparseMatrix(int rows, int columns, Complex32[] array)
: this(rows, columns)
: this(SparseCompressedRowMatrixStorage<Complex32>.OfColumnMajorList(rows, columns, array))
{
if (rows * columns > array.Length)
{
throw new ArgumentOutOfRangeException(Resources.ArgumentMatrixDimensions);
}
for (var i = 0; i < rows; i++)
{
for (var j = 0; j < columns; j++)
{
_storage.At(i, j, array[i + (j * rows)]);
}
}
}
/// <summary>

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

@ -130,22 +130,9 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// A new memory block will be allocated for storing the matrix.
/// </summary>
/// <seealso href="http://en.wikipedia.org/wiki/Row-major_order"/>
public static SparseMatrix OfColumnMajor(int rows, int columns, double[] array)
public static SparseMatrix OfColumnMajor(int rows, int columns, double[] columnMajor)
{
if (rows * columns > array.Length)
{
throw new ArgumentOutOfRangeException(Resources.ArgumentMatrixDimensions);
}
var storage = new SparseCompressedRowMatrixStorage<double>(rows, columns);
for (var i = 0; i < rows; i++)
{
for (var j = 0; j < columns; j++)
{
storage.At(i, j, array[i + (j * rows)]);
}
}
return new SparseMatrix(storage);
return new SparseMatrix(SparseCompressedRowMatrixStorage<double>.OfColumnMajorList(rows, columns, columnMajor));
}
/// <summary>
@ -196,20 +183,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <seealso href="http://en.wikipedia.org/wiki/Row-major_order"/>
[Obsolete("Use SparseMatrix.OfColumnMajor instead. Scheduled for removal in v3.0.")]
public SparseMatrix(int rows, int columns, double[] array)
: this(rows, columns)
: this(SparseCompressedRowMatrixStorage<double>.OfColumnMajorList(rows, columns, array))
{
if (rows * columns > array.Length)
{
throw new ArgumentOutOfRangeException(Resources.ArgumentMatrixDimensions);
}
for (var i = 0; i < rows; i++)
{
for (var j = 0; j < columns; j++)
{
_storage.At(i, j, array[i + (j * rows)]);
}
}
}
/// <summary>

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

@ -130,22 +130,9 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// A new memory block will be allocated for storing the matrix.
/// </summary>
/// <seealso href="http://en.wikipedia.org/wiki/Row-major_order"/>
public static SparseMatrix OfColumnMajor(int rows, int columns, float[] array)
public static SparseMatrix OfColumnMajor(int rows, int columns, float[] columnMajor)
{
if (rows * columns > array.Length)
{
throw new ArgumentOutOfRangeException(Resources.ArgumentMatrixDimensions);
}
var storage = new SparseCompressedRowMatrixStorage<float>(rows, columns);
for (var i = 0; i < rows; i++)
{
for (var j = 0; j < columns; j++)
{
storage.At(i, j, array[i + (j * rows)]);
}
}
return new SparseMatrix(storage);
return new SparseMatrix(SparseCompressedRowMatrixStorage<float>.OfColumnMajorList(rows, columns, columnMajor));
}
/// <summary>
@ -196,20 +183,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// <seealso href="http://en.wikipedia.org/wiki/Row-major_order"/>
[Obsolete("Use SparseMatrix.OfColumnMajor instead. Scheduled for removal in v3.0.")]
public SparseMatrix(int rows, int columns, float[] array)
: this(rows, columns)
: this(SparseCompressedRowMatrixStorage<float>.OfColumnMajorList(rows, columns, array))
{
if (rows * columns > array.Length)
{
throw new ArgumentOutOfRangeException(Resources.ArgumentMatrixDimensions);
}
for (var i = 0; i < rows; i++)
{
for (var j = 0; j < columns; j++)
{
_storage.At(i, j, array[i + (j * rows)]);
}
}
}
/// <summary>

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

@ -434,6 +434,42 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
return storage;
}
public static SparseCompressedRowMatrixStorage<T> OfColumnMajorList(int rows, int columns, IList<T> data)
{
if (data == null)
{
throw new ArgumentNullException("data");
}
if (rows * columns != data.Count)
{
throw new ArgumentOutOfRangeException(Resources.ArgumentMatrixDimensions);
}
var storage = new SparseCompressedRowMatrixStorage<T>(rows, columns);
var rowPointers = storage.RowPointers;
var columnIndices = new List<int>();
var values = new List<T>();
for (int row = 0; row < rows; row++)
{
rowPointers[row] = values.Count;
for (int col = 0; col < columns; col++)
{
var item = data[row + (col*rows)];
if (!Zero.Equals(item))
{
values.Add(item);
columnIndices.Add(col);
}
}
}
storage.ColumnIndices = columnIndices.ToArray();
storage.Values = values.ToArray();
storage.ValueCount = values.Count;
return storage;
}
// MATRIX COPY
internal override void CopyToUnchecked(MatrixStorage<T> target, bool skipClearing = false)

Loading…
Cancel
Save