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];