Browse Source

LA: create dense matrix from row-major array or enumerable

pull/450/head
Christoph Ruegg 10 years ago
parent
commit
4e1d032860
  1. 11
      src/Numerics/LinearAlgebra/Builder.cs
  2. 30
      src/Numerics/LinearAlgebra/Storage/DenseColumnMajorMatrixStorage.cs

11
src/Numerics/LinearAlgebra/Builder.cs

@ -687,6 +687,17 @@ namespace MathNet.Numerics.LinearAlgebra
return Dense(DenseColumnMajorMatrixStorage<T>.OfColumnVectors(columns.Select(c => c.Storage).ToArray()));
}
/// <summary>
/// Create a new dense matrix as a copy of the given enumerable.
/// The enumerable is assumed to be in row-major order (row by row).
/// This new matrix will be independent from the enumerable.
/// A new memory block will be allocated for storing the matrix.
/// </summary>
public Matrix<T> DenseOfRowMajor(int rows, int columns, IEnumerable<T> columnMajor)
{
return Dense(DenseColumnMajorMatrixStorage<T>.OfRowMajorEnumerable(rows, columns, columnMajor));
}
/// <summary>
/// Create a new dense matrix as a copy of the given enumerable of enumerable rows.
/// Each enumerable in the master enumerable specifies a row.

30
src/Numerics/LinearAlgebra/Storage/DenseColumnMajorMatrixStorage.cs

@ -266,6 +266,27 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
return new DenseColumnMajorMatrixStorage<T>(rows, columns, array);
}
public static DenseColumnMajorMatrixStorage<T> OfColumnMajorArray(int rows, int columns, T[] data)
{
T[] ret = new T[rows*columns];
Array.Copy(data, 0, ret, 0, Math.Min(ret.Length, data.Length));
return new DenseColumnMajorMatrixStorage<T>(rows, columns, ret);
}
public static DenseColumnMajorMatrixStorage<T> OfRowMajorArray(int rows, int columns, T[] data)
{
T[] ret = new T[rows*columns];
for (int i = 0; i < rows; i++)
{
int offset = i*columns;
for (int j = 0; j < columns; j++)
{
ret[(j*rows) + i] = data[offset + j];
}
}
return new DenseColumnMajorMatrixStorage<T>(rows, columns, ret);
}
public static DenseColumnMajorMatrixStorage<T> OfColumnVectors(VectorStorage<T>[] data)
{
if (data.Length <= 0)
@ -333,14 +354,17 @@ namespace MathNet.Numerics.LinearAlgebra.Storage
var arrayData = data as T[];
if (arrayData != null)
{
var copy = new T[arrayData.Length];
Array.Copy(arrayData, 0, copy, 0, arrayData.Length);
return new DenseColumnMajorMatrixStorage<T>(rows, columns, copy);
return OfColumnMajorArray(rows, columns, arrayData);
}
return new DenseColumnMajorMatrixStorage<T>(rows, columns, data.ToArray());
}
public static DenseColumnMajorMatrixStorage<T> OfRowMajorEnumerable(int rows, int columns, IEnumerable<T> data)
{
return OfRowMajorArray(rows, columns, data as T[] ?? data.ToArray());
}
public static DenseColumnMajorMatrixStorage<T> OfColumnEnumerables(int rows, int columns, IEnumerable<IEnumerable<T>> data)
{
var array = new T[rows*columns];

Loading…
Cancel
Save