diff --git a/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs index 2cbdbe25..2a5b605c 100644 --- a/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs +++ b/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. /// /// - 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(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.OfColumnMajorList(rows, columns, columnMajor)); } /// @@ -197,20 +184,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// [Obsolete("Use SparseMatrix.OfColumnMajor instead. Scheduled for removal in v3.0.")] public SparseMatrix(int rows, int columns, Complex[] array) - : this(rows, columns) + : this(SparseCompressedRowMatrixStorage.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)]); - } - } } /// diff --git a/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs index 57cbeb79..15faf7e3 100644 --- a/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs +++ b/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. /// /// - 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(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.OfColumnMajorList(rows, columns, columnMajor)); } /// @@ -197,20 +184,8 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// [Obsolete("Use SparseMatrix.OfColumnMajor instead. Scheduled for removal in v3.0.")] public SparseMatrix(int rows, int columns, Complex32[] array) - : this(rows, columns) + : this(SparseCompressedRowMatrixStorage.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)]); - } - } } /// diff --git a/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs index 49431633..80c4e64e 100644 --- a/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs +++ b/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. /// /// - 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(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.OfColumnMajorList(rows, columns, columnMajor)); } /// @@ -196,20 +183,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// [Obsolete("Use SparseMatrix.OfColumnMajor instead. Scheduled for removal in v3.0.")] public SparseMatrix(int rows, int columns, double[] array) - : this(rows, columns) + : this(SparseCompressedRowMatrixStorage.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)]); - } - } } /// diff --git a/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs index cf42d823..d6270828 100644 --- a/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs +++ b/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. /// /// - 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(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.OfColumnMajorList(rows, columns, columnMajor)); } /// @@ -196,20 +183,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single /// [Obsolete("Use SparseMatrix.OfColumnMajor instead. Scheduled for removal in v3.0.")] public SparseMatrix(int rows, int columns, float[] array) - : this(rows, columns) + : this(SparseCompressedRowMatrixStorage.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)]); - } - } } /// diff --git a/src/Numerics/LinearAlgebra/Storage/SparseCompressedRowMatrixStorage.cs b/src/Numerics/LinearAlgebra/Storage/SparseCompressedRowMatrixStorage.cs index f6953fb0..8dd33fe5 100644 --- a/src/Numerics/LinearAlgebra/Storage/SparseCompressedRowMatrixStorage.cs +++ b/src/Numerics/LinearAlgebra/Storage/SparseCompressedRowMatrixStorage.cs @@ -434,6 +434,42 @@ namespace MathNet.Numerics.LinearAlgebra.Storage return storage; } + public static SparseCompressedRowMatrixStorage OfColumnMajorList(int rows, int columns, IList data) + { + if (data == null) + { + throw new ArgumentNullException("data"); + } + if (rows * columns != data.Count) + { + throw new ArgumentOutOfRangeException(Resources.ArgumentMatrixDimensions); + } + + var storage = new SparseCompressedRowMatrixStorage(rows, columns); + var rowPointers = storage.RowPointers; + var columnIndices = new List(); + var values = new List(); + + 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 target, bool skipClearing = false)