diff --git a/src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs b/src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs index 3bd3c760..c52e097f 100644 --- a/src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex/DenseMatrix.cs @@ -131,15 +131,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// public static DenseMatrix OfArray(Complex[,] array) { - var storage = new DenseColumnMajorMatrixStorage(array.GetLength(0), array.GetLength(1)); - for (var i = 0; i < storage.RowCount; i++) - { - for (var j = 0; j < storage.ColumnCount; j++) - { - storage.Data[(j * storage.RowCount) + i] = array[i, j]; - } - } - return new DenseMatrix(storage); + return new DenseMatrix(DenseColumnMajorMatrixStorage.OfArray(array)); } /// diff --git a/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs index 8aaa73ea..d432a332 100644 --- a/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs @@ -109,15 +109,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// public static SparseMatrix OfArray(Complex[,] array) { - var storage = new SparseCompressedRowMatrixStorage(array.GetLength(0), array.GetLength(1)); - for (var i = 0; i < storage.RowCount; i++) - { - for (var j = 0; j < storage.ColumnCount; j++) - { - storage.At(i, j, array[i, j]); - } - } - return new SparseMatrix(storage); + return new SparseMatrix(SparseCompressedRowMatrixStorage.OfArray(array)); } /// diff --git a/src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs b/src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs index 05eff4a3..2b564d38 100644 --- a/src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex32/DenseMatrix.cs @@ -131,15 +131,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// public static DenseMatrix OfArray(Complex32[,] array) { - var storage = new DenseColumnMajorMatrixStorage(array.GetLength(0), array.GetLength(1)); - for (var i = 0; i < storage.RowCount; i++) - { - for (var j = 0; j < storage.ColumnCount; j++) - { - storage.Data[(j * storage.RowCount) + i] = array[i, j]; - } - } - return new DenseMatrix(storage); + return new DenseMatrix(DenseColumnMajorMatrixStorage.OfArray(array)); } /// diff --git a/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs index f61c12b1..aed609f0 100644 --- a/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs @@ -109,15 +109,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// public static SparseMatrix OfArray(Complex32[,] array) { - var storage = new SparseCompressedRowMatrixStorage(array.GetLength(0), array.GetLength(1)); - for (var i = 0; i < storage.RowCount; i++) - { - for (var j = 0; j < storage.ColumnCount; j++) - { - storage.At(i, j, array[i, j]); - } - } - return new SparseMatrix(storage); + return new SparseMatrix(SparseCompressedRowMatrixStorage.OfArray(array)); } /// diff --git a/src/Numerics/LinearAlgebra/Double/DenseMatrix.cs b/src/Numerics/LinearAlgebra/Double/DenseMatrix.cs index 595c0863..24c21dc1 100644 --- a/src/Numerics/LinearAlgebra/Double/DenseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Double/DenseMatrix.cs @@ -28,6 +28,8 @@ // OTHER DEALINGS IN THE SOFTWARE. // +using System.Runtime; + namespace MathNet.Numerics.LinearAlgebra.Double { using Algorithms.LinearAlgebra; @@ -131,15 +133,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// public static DenseMatrix OfArray(double[,] array) { - var storage = new DenseColumnMajorMatrixStorage(array.GetLength(0), array.GetLength(1)); - for (var i = 0; i < storage.RowCount; i++) - { - for (var j = 0; j < storage.ColumnCount; j++) - { - storage.Data[(j * storage.RowCount) + i] = array[i, j]; - } - } - return new DenseMatrix(storage); + return new DenseMatrix(DenseColumnMajorMatrixStorage.OfArray(array)); } /// diff --git a/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs index 79e2f79a..0376f71a 100644 --- a/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs @@ -108,15 +108,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// public static SparseMatrix OfArray(double[,] array) { - var storage = new SparseCompressedRowMatrixStorage(array.GetLength(0), array.GetLength(1)); - for (var i = 0; i < storage.RowCount; i++) - { - for (var j = 0; j < storage.ColumnCount; j++) - { - storage.At(i, j, array[i, j]); - } - } - return new SparseMatrix(storage); + return new SparseMatrix(SparseCompressedRowMatrixStorage.OfArray(array)); } /// diff --git a/src/Numerics/LinearAlgebra/Single/DenseMatrix.cs b/src/Numerics/LinearAlgebra/Single/DenseMatrix.cs index c124af13..4acf29ab 100644 --- a/src/Numerics/LinearAlgebra/Single/DenseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Single/DenseMatrix.cs @@ -131,15 +131,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single /// public static DenseMatrix OfArray(float[,] array) { - var storage = new DenseColumnMajorMatrixStorage(array.GetLength(0), array.GetLength(1)); - for (var i = 0; i < storage.RowCount; i++) - { - for (var j = 0; j < storage.ColumnCount; j++) - { - storage.Data[(j * storage.RowCount) + i] = array[i, j]; - } - } - return new DenseMatrix(storage); + return new DenseMatrix(DenseColumnMajorMatrixStorage.OfArray(array)); } /// diff --git a/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs index 8fa78ebe..5c3eedbb 100644 --- a/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs @@ -108,15 +108,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single /// public static SparseMatrix OfArray(float[,] array) { - var storage = new SparseCompressedRowMatrixStorage(array.GetLength(0), array.GetLength(1)); - for (var i = 0; i < storage.RowCount; i++) - { - for (var j = 0; j < storage.ColumnCount; j++) - { - storage.At(i, j, array[i, j]); - } - } - return new SparseMatrix(storage); + return new SparseMatrix(SparseCompressedRowMatrixStorage.OfArray(array)); } /// diff --git a/src/Numerics/LinearAlgebra/Storage/DenseColumnMajorMatrixStorage.cs b/src/Numerics/LinearAlgebra/Storage/DenseColumnMajorMatrixStorage.cs index 6426e3a2..74e0784e 100644 --- a/src/Numerics/LinearAlgebra/Storage/DenseColumnMajorMatrixStorage.cs +++ b/src/Numerics/LinearAlgebra/Storage/DenseColumnMajorMatrixStorage.cs @@ -108,6 +108,19 @@ namespace MathNet.Numerics.LinearAlgebra.Storage return storage; } + public static DenseColumnMajorMatrixStorage OfArray(T[,] array) + { + var storage = new DenseColumnMajorMatrixStorage(array.GetLength(0), array.GetLength(1)); + for (var i = 0; i < storage.RowCount; i++) + { + for (var j = 0; j < storage.ColumnCount; j++) + { + storage.Data[(j * storage.RowCount) + i] = array[i, j]; + } + } + return storage; + } + public static DenseColumnMajorMatrixStorage OfColumnMajorEnumerable(int rows, int columns, IEnumerable data) { if (data == null) diff --git a/src/Numerics/LinearAlgebra/Storage/SparseCompressedRowMatrixStorage.cs b/src/Numerics/LinearAlgebra/Storage/SparseCompressedRowMatrixStorage.cs index 42d5b3af..f6953fb0 100644 --- a/src/Numerics/LinearAlgebra/Storage/SparseCompressedRowMatrixStorage.cs +++ b/src/Numerics/LinearAlgebra/Storage/SparseCompressedRowMatrixStorage.cs @@ -370,6 +370,37 @@ namespace MathNet.Numerics.LinearAlgebra.Storage return storage; } + public static SparseCompressedRowMatrixStorage OfArray(T[,] array) + { + if (array == null) + { + throw new ArgumentNullException("array"); + } + + var storage = new SparseCompressedRowMatrixStorage(array.GetLength(0), array.GetLength(1)); + var rowPointers = storage.RowPointers; + var columnIndices = new List(); + var values = new List(); + + for (int row = 0; row < storage.RowCount; row++) + { + rowPointers[row] = values.Count; + for (int col = 0; col < storage.ColumnCount; col++) + { + if (!Zero.Equals(array[row,col])) + { + values.Add(array[row, col]); + columnIndices.Add(col); + } + } + } + + storage.ColumnIndices = columnIndices.ToArray(); + storage.Values = values.ToArray(); + storage.ValueCount = values.Count; + return storage; + } + public static SparseCompressedRowMatrixStorage OfRowMajorEnumerable(int rows, int columns, IEnumerable data) { if (data == null)