From 4e1d032860446dd63fd71db0531d32a67c01f7f2 Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Fri, 11 Nov 2016 13:51:43 +0100 Subject: [PATCH] LA: create dense matrix from row-major array or enumerable --- src/Numerics/LinearAlgebra/Builder.cs | 11 +++++++ .../Storage/DenseColumnMajorMatrixStorage.cs | 30 +++++++++++++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/Numerics/LinearAlgebra/Builder.cs b/src/Numerics/LinearAlgebra/Builder.cs index 8f1ac441..0c0b3033 100644 --- a/src/Numerics/LinearAlgebra/Builder.cs +++ b/src/Numerics/LinearAlgebra/Builder.cs @@ -687,6 +687,17 @@ namespace MathNet.Numerics.LinearAlgebra return Dense(DenseColumnMajorMatrixStorage.OfColumnVectors(columns.Select(c => c.Storage).ToArray())); } + /// + /// 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. + /// + public Matrix DenseOfRowMajor(int rows, int columns, IEnumerable columnMajor) + { + return Dense(DenseColumnMajorMatrixStorage.OfRowMajorEnumerable(rows, columns, columnMajor)); + } + /// /// Create a new dense matrix as a copy of the given enumerable of enumerable rows. /// Each enumerable in the master enumerable specifies a row. diff --git a/src/Numerics/LinearAlgebra/Storage/DenseColumnMajorMatrixStorage.cs b/src/Numerics/LinearAlgebra/Storage/DenseColumnMajorMatrixStorage.cs index 857f7b78..2bd522ca 100644 --- a/src/Numerics/LinearAlgebra/Storage/DenseColumnMajorMatrixStorage.cs +++ b/src/Numerics/LinearAlgebra/Storage/DenseColumnMajorMatrixStorage.cs @@ -266,6 +266,27 @@ namespace MathNet.Numerics.LinearAlgebra.Storage return new DenseColumnMajorMatrixStorage(rows, columns, array); } + public static DenseColumnMajorMatrixStorage 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(rows, columns, ret); + } + + public static DenseColumnMajorMatrixStorage 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(rows, columns, ret); + } + public static DenseColumnMajorMatrixStorage OfColumnVectors(VectorStorage[] 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(rows, columns, copy); + return OfColumnMajorArray(rows, columns, arrayData); } return new DenseColumnMajorMatrixStorage(rows, columns, data.ToArray()); } + public static DenseColumnMajorMatrixStorage OfRowMajorEnumerable(int rows, int columns, IEnumerable data) + { + return OfRowMajorArray(rows, columns, data as T[] ?? data.ToArray()); + } + public static DenseColumnMajorMatrixStorage OfColumnEnumerables(int rows, int columns, IEnumerable> data) { var array = new T[rows*columns];