From 7f7120ea6083854e995f79edcf6064cad123c299 Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Mon, 2 Dec 2013 20:50:58 +0100 Subject: [PATCH] LA: phase out Matrix.CreateMatrix/CreateVector (no longer needed) --- src/FSharp/LinearAlgebra.Matrix.fs | 8 +- src/Numerics/Distributions/InverseWishart.cs | 16 ++-- src/Numerics/Distributions/Wishart.cs | 12 +-- src/Numerics/LinearAlgebra/Builder.cs | 74 ++++++++++++---- .../Complex/Factorization/UserEvd.cs | 2 +- .../Complex/Factorization/UserGramSchmidt.cs | 2 +- .../Complex/Factorization/UserLU.cs | 2 +- .../Complex/Factorization/UserQR.cs | 2 +- .../Complex/Factorization/UserSvd.cs | 8 +- src/Numerics/LinearAlgebra/Complex/Matrix.cs | 2 +- .../LinearAlgebra/Complex/SparseMatrix.cs | 16 ++-- .../Complex32/Factorization/UserEvd.cs | 2 +- .../Factorization/UserGramSchmidt.cs | 2 +- .../Complex32/Factorization/UserLU.cs | 2 +- .../Complex32/Factorization/UserQR.cs | 2 +- .../Complex32/Factorization/UserSvd.cs | 8 +- .../LinearAlgebra/Complex32/Matrix.cs | 2 +- .../LinearAlgebra/Complex32/SparseMatrix.cs | 16 ++-- .../Double/Factorization/UserEvd.cs | 4 +- .../Double/Factorization/UserGramSchmidt.cs | 2 +- .../Double/Factorization/UserLU.cs | 2 +- .../Double/Factorization/UserQR.cs | 2 +- .../Double/Factorization/UserSvd.cs | 8 +- .../LinearAlgebra/Double/SparseMatrix.cs | 16 ++-- .../LinearAlgebra/Factorization/Cholesky.cs | 4 +- .../LinearAlgebra/Factorization/Evd.cs | 8 +- .../LinearAlgebra/Factorization/LU.cs | 4 +- .../LinearAlgebra/Factorization/QR.cs | 8 +- .../LinearAlgebra/Factorization/Svd.cs | 10 +-- .../LinearAlgebra/Matrix.Arithmetic.cs | 62 +++++++------- src/Numerics/LinearAlgebra/Matrix.Solve.cs | 8 +- src/Numerics/LinearAlgebra/Matrix.cs | 84 ++++++------------- .../Single/Factorization/UserEvd.cs | 4 +- .../Single/Factorization/UserGramSchmidt.cs | 2 +- .../Single/Factorization/UserLU.cs | 2 +- .../Single/Factorization/UserQR.cs | 2 +- .../Single/Factorization/UserSvd.cs | 8 +- .../LinearAlgebra/Single/SparseMatrix.cs | 16 ++-- .../MatrixStructureTheory.cs | 12 +-- 39 files changed, 218 insertions(+), 228 deletions(-) diff --git a/src/FSharp/LinearAlgebra.Matrix.fs b/src/FSharp/LinearAlgebra.Matrix.fs index 6b11f055..8f634399 100644 --- a/src/FSharp/LinearAlgebra.Matrix.fs +++ b/src/FSharp/LinearAlgebra.Matrix.fs @@ -304,8 +304,8 @@ module Matrix = A.MapIndexedInplace((fun i j x -> f i j), true) /// Fold all columns into one row vector. - let inline foldByCol f acc (A: #Matrix<_>) = - let v = A.CreateVector(A.ColumnCount) + let inline foldByCol f acc (A: #Matrix<'T>) = + let v = Vector<'T>.Build.SameAs(A, A.ColumnCount) for k=0 to A.ColumnCount-1 do let mutable macc = acc for i=0 to A.RowCount-1 do @@ -314,8 +314,8 @@ module Matrix = v :> _ Vector /// Fold all rows into one column vector. - let inline foldByRow f acc (A: #Matrix<_>) = - let v = A.CreateVector(A.RowCount) + let inline foldByRow f acc (A: #Matrix<'T>) = + let v = Vector<'T>.Build.SameAs(A, A.RowCount) for k=0 to A.RowCount-1 do let mutable macc = acc for i=0 to A.ColumnCount-1 do diff --git a/src/Numerics/Distributions/InverseWishart.cs b/src/Numerics/Distributions/InverseWishart.cs index 47d5ac8a..6afbeb4a 100644 --- a/src/Numerics/Distributions/InverseWishart.cs +++ b/src/Numerics/Distributions/InverseWishart.cs @@ -187,18 +187,12 @@ namespace MathNet.Numerics.Distributions { get { - var res = _scale.CreateMatrix(_scale.RowCount, _scale.ColumnCount); - for (var i = 0; i < res.RowCount; i++) + return Matrix.Build.Dense(_scale.RowCount, _scale.ColumnCount, (i, j) => { - for (var j = 0; j < res.ColumnCount; j++) - { - var num1 = ((_freedom - _scale.RowCount + 1)*_scale.At(i, j)*_scale.At(i, j)) + ((_freedom - _scale.RowCount - 1)*_scale.At(i, i)*_scale.At(j, j)); - var num2 = (_freedom - _scale.RowCount)*(_freedom - _scale.RowCount - 1)*(_freedom - _scale.RowCount - 1)*(_freedom - _scale.RowCount - 3); - res.At(i, j, num1/num2); - } - } - - return res; + var num1 = ((_freedom - _scale.RowCount + 1)*_scale.At(i, j)*_scale.At(i, j)) + ((_freedom - _scale.RowCount - 1)*_scale.At(i, i)*_scale.At(j, j)); + var num2 = (_freedom - _scale.RowCount)*(_freedom - _scale.RowCount - 1)*(_freedom - _scale.RowCount - 1)*(_freedom - _scale.RowCount - 3); + return num1/num2; + }); } } diff --git a/src/Numerics/Distributions/Wishart.cs b/src/Numerics/Distributions/Wishart.cs index c850fe5f..b7fe2987 100644 --- a/src/Numerics/Distributions/Wishart.cs +++ b/src/Numerics/Distributions/Wishart.cs @@ -207,16 +207,8 @@ namespace MathNet.Numerics.Distributions { get { - var res = _scale.CreateMatrix(_scale.RowCount, _scale.ColumnCount); - for (var i = 0; i < res.RowCount; i++) - { - for (var j = 0; j < res.ColumnCount; j++) - { - res.At(i, j, _degreesOfFreedom*((_scale.At(i, j)*_scale.At(i, j)) + (_scale.At(i, i)*_scale.At(j, j)))); - } - } - - return res; + return Matrix.Build.Dense(_scale.RowCount, _scale.ColumnCount, + (i, j) => _degreesOfFreedom*((_scale.At(i, j)*_scale.At(i, j)) + (_scale.At(i, i)*_scale.At(j, j)))); } } diff --git a/src/Numerics/LinearAlgebra/Builder.cs b/src/Numerics/LinearAlgebra/Builder.cs index 811dd961..615c6552 100644 --- a/src/Numerics/LinearAlgebra/Builder.cs +++ b/src/Numerics/LinearAlgebra/Builder.cs @@ -39,8 +39,6 @@ using MathNet.Numerics.LinearAlgebra.Storage; namespace MathNet.Numerics.LinearAlgebra.Double { - using Solvers; - internal class MatrixBuilder : MatrixBuilder { public override double Zero @@ -116,8 +114,6 @@ namespace MathNet.Numerics.LinearAlgebra.Double namespace MathNet.Numerics.LinearAlgebra.Single { - using Solvers; - internal class MatrixBuilder : MatrixBuilder { public override float Zero @@ -193,8 +189,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single namespace MathNet.Numerics.LinearAlgebra.Complex { - using Solvers; - #if NOSYSNUMERICS using Complex = Numerics.Complex; #else @@ -276,8 +270,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex namespace MathNet.Numerics.LinearAlgebra.Complex32 { - using Solvers; - internal class MatrixBuilder : MatrixBuilder { public override Numerics.Complex32 Zero @@ -399,28 +391,52 @@ namespace MathNet.Numerics.LinearAlgebra /// /// Create a new matrix with the same kind of the provided example. /// - public Matrix SameType(Matrix example, int rows, int columns) + public Matrix SameAs(Matrix example, int rows, int columns, bool fullyMutable = false) { var storage = example.Storage; if (storage is DenseColumnMajorMatrixStorage) return Dense(rows, columns); - if (storage is DiagonalMatrixStorage) return Diagonal(rows, columns); + if (!fullyMutable && storage is DiagonalMatrixStorage) return Diagonal(rows, columns); if (storage is SparseCompressedRowMatrixStorage) return Sparse(rows, columns); return Dense(rows, columns); } + /// + /// Create a new matrix with the same kind and dimensions of the provided example. + /// + public Matrix SameAs(Matrix example) + { + return SameAs(example, example.RowCount, example.ColumnCount); + } + + /// + /// Create a new matrix with the same kind of the provided example. + /// + public Matrix SameAs(Vector example, int rows, int columns) + { + return example.Storage.IsDense ? Dense(rows, columns) : Sparse(rows, columns); + } + /// /// Create a new matrix with a type that can represent and is closest to both provided samples. /// - public Matrix SameType(Matrix example1, Matrix example2 , int rows, int columns) + public Matrix SameAs(Matrix example, Matrix otherExample, int rows, int columns, bool fullyMutable = false) { - var storage1 = example1.Storage; - var storage2 = example2.Storage; + var storage1 = example.Storage; + var storage2 = otherExample.Storage; if (storage1 is DenseColumnMajorMatrixStorage || storage2 is DenseColumnMajorMatrixStorage) return Dense(rows, columns); - if (storage1 is DiagonalMatrixStorage && storage2 is DiagonalMatrixStorage) return Diagonal(rows, columns); + if (!fullyMutable && storage1 is DiagonalMatrixStorage && storage2 is DiagonalMatrixStorage) return Diagonal(rows, columns); if (storage1 is SparseCompressedRowMatrixStorage || storage2 is SparseCompressedRowMatrixStorage) return Sparse(rows, columns); return Dense(rows, columns); } + /// + /// Create a new matrix with a type that can represent and is closest to both provided samples and the dimensions of example. + /// + public Matrix SameAs(Matrix example, Matrix otherExample) + { + return SameAs(example, otherExample, example.RowCount, example.ColumnCount); + } + /// /// Create a new dense matrix with values sampled from the provided random distribution. /// @@ -1278,7 +1294,23 @@ namespace MathNet.Numerics.LinearAlgebra /// /// Create a new vector with the same kind of the provided example. /// - public Vector SameType(Vector example, int length) + public Vector SameAs(Vector example, int length) + { + return example.Storage.IsDense ? Dense(length) : Sparse(length); + } + + /// + /// Create a new vector with the same kind and dimension of the provided example. + /// + public Vector SameAs(Vector example) + { + return example.Storage.IsDense ? Dense(example.Count) : Sparse(example.Count); + } + + /// + /// Create a new vector with the same kind of the provided example. + /// + public Vector SameAs(Matrix example, int length) { return example.Storage.IsDense ? Dense(length) : Sparse(length); } @@ -1286,9 +1318,17 @@ namespace MathNet.Numerics.LinearAlgebra /// /// Create a new vector with a type that can represent and is closest to both provided samples. /// - public Vector SameType(Vector example1, Vector example2, int length) + public Vector SameAs(Vector example, Vector otherExample, int length) + { + return example.Storage.IsDense || otherExample.Storage.IsDense ? Dense(length) : Sparse(length); + } + + /// + /// Create a new vector with a type that can represent and is closest to both provided samples and the dimensions of example. + /// + public Vector SameAs(Vector example, Vector otherExample) { - return example1.Storage.IsDense || example2.Storage.IsDense ? Dense(length) : Sparse(length); + return example.Storage.IsDense || otherExample.Storage.IsDense ? Dense(example.Count) : Sparse(example.Count); } /// diff --git a/src/Numerics/LinearAlgebra/Complex/Factorization/UserEvd.cs b/src/Numerics/LinearAlgebra/Complex/Factorization/UserEvd.cs index 5a700087..3a145ae3 100644 --- a/src/Numerics/LinearAlgebra/Complex/Factorization/UserEvd.cs +++ b/src/Numerics/LinearAlgebra/Complex/Factorization/UserEvd.cs @@ -75,7 +75,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Factorization // Initialize matricies for eigenvalues and eigenvectors var eigenVectors = DenseMatrix.CreateIdentity(order); - var blockDiagonal = matrix.CreateMatrix(order, order); + var blockDiagonal = Matrix.Build.SameAs(matrix, order, order); var eigenValues = new DenseVector(order); var isSymmetric = true; diff --git a/src/Numerics/LinearAlgebra/Complex/Factorization/UserGramSchmidt.cs b/src/Numerics/LinearAlgebra/Complex/Factorization/UserGramSchmidt.cs index b22953c0..0ef5cdd0 100644 --- a/src/Numerics/LinearAlgebra/Complex/Factorization/UserGramSchmidt.cs +++ b/src/Numerics/LinearAlgebra/Complex/Factorization/UserGramSchmidt.cs @@ -65,7 +65,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Factorization } var q = matrix.Clone(); - var r = matrix.CreateMatrix(matrix.ColumnCount, matrix.ColumnCount); + var r = Matrix.Build.SameAs(matrix, matrix.ColumnCount, matrix.ColumnCount); for (var k = 0; k < q.ColumnCount; k++) { diff --git a/src/Numerics/LinearAlgebra/Complex/Factorization/UserLU.cs b/src/Numerics/LinearAlgebra/Complex/Factorization/UserLU.cs index 94ce71f5..7c8245ce 100644 --- a/src/Numerics/LinearAlgebra/Complex/Factorization/UserLU.cs +++ b/src/Numerics/LinearAlgebra/Complex/Factorization/UserLU.cs @@ -302,7 +302,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Factorization public override Matrix Inverse() { var order = Factors.RowCount; - var inverse = Factors.CreateMatrix(order, order); + var inverse = Matrix.Build.SameAs(Factors, order, order); for (var i = 0; i < order; i++) { inverse.At(i, i, 1.0); diff --git a/src/Numerics/LinearAlgebra/Complex/Factorization/UserQR.cs b/src/Numerics/LinearAlgebra/Complex/Factorization/UserQR.cs index cd4ca63d..5726ebf1 100644 --- a/src/Numerics/LinearAlgebra/Complex/Factorization/UserQR.cs +++ b/src/Numerics/LinearAlgebra/Complex/Factorization/UserQR.cs @@ -77,7 +77,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Factorization if (method == QRMethod.Full) { r = matrix.Clone(); - q = matrix.CreateMatrix(matrix.RowCount, matrix.RowCount); + q = Matrix.Build.SameAs(matrix, matrix.RowCount, matrix.RowCount); for (var i = 0; i < matrix.RowCount; i++) { diff --git a/src/Numerics/LinearAlgebra/Complex/Factorization/UserSvd.cs b/src/Numerics/LinearAlgebra/Complex/Factorization/UserSvd.cs index fae5f588..3e433691 100644 --- a/src/Numerics/LinearAlgebra/Complex/Factorization/UserSvd.cs +++ b/src/Numerics/LinearAlgebra/Complex/Factorization/UserSvd.cs @@ -69,9 +69,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Factorization var nm = Math.Min(matrix.RowCount + 1, matrix.ColumnCount); var matrixCopy = matrix.Clone(); - var s = matrixCopy.CreateVector(nm); - var u = matrixCopy.CreateMatrix(matrixCopy.RowCount, matrixCopy.RowCount); - var vt = matrixCopy.CreateMatrix(matrixCopy.ColumnCount, matrixCopy.ColumnCount); + var s = Vector.Build.SameAs(matrixCopy, nm); + var u = Matrix.Build.SameAs(matrixCopy, matrixCopy.RowCount, matrixCopy.RowCount); + var vt = Matrix.Build.SameAs(matrixCopy, matrixCopy.ColumnCount, matrixCopy.ColumnCount); const int maxiter = 1000; var e = new Complex[matrixCopy.ColumnCount]; @@ -592,7 +592,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Factorization if (matrixCopy.RowCount < matrixCopy.ColumnCount) { nm--; - var tmp = matrixCopy.CreateVector(nm); + var tmp = Vector.Build.SameAs(matrixCopy, nm); for (i = 0; i < nm; i++) { tmp[i] = s[i]; diff --git a/src/Numerics/LinearAlgebra/Complex/Matrix.cs b/src/Numerics/LinearAlgebra/Complex/Matrix.cs index a15cd12c..771391fb 100644 --- a/src/Numerics/LinearAlgebra/Complex/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Complex/Matrix.cs @@ -112,7 +112,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// The conjugate transpose of this matrix. public override Matrix ConjugateTranspose() { - var ret = CreateMatrix(ColumnCount, RowCount); + var ret = Build.SameAs(this, ColumnCount, RowCount); for (var j = 0; j < ColumnCount; j++) { for (var i = 0; i < RowCount; i++) diff --git a/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs index 02daadea..1891fbb9 100644 --- a/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs @@ -382,7 +382,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// The lower triangle of this matrix. public override Matrix LowerTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); LowerTriangleImpl(result); return result; } @@ -407,7 +407,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex if (ReferenceEquals(this, result)) { - var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); LowerTriangle(tmp); tmp.CopyTo(result); } @@ -447,7 +447,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// The upper triangle of this matrix. public override Matrix UpperTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); UpperTriangleImpl(result); return result; } @@ -472,7 +472,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex if (ReferenceEquals(this, result)) { - var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); UpperTriangle(tmp); tmp.CopyTo(result); } @@ -513,7 +513,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// The lower triangle of this matrix. public override Matrix StrictlyLowerTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); StrictlyLowerTriangleImpl(result); return result; } @@ -538,7 +538,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex if (ReferenceEquals(this, result)) { - var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); StrictlyLowerTriangle(tmp); tmp.CopyTo(result); } @@ -579,7 +579,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// The upper triangle of this matrix. public override Matrix StrictlyUpperTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); StrictlyUpperTriangleImpl(result); return result; } @@ -604,7 +604,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex if (ReferenceEquals(this, result)) { - var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); StrictlyUpperTriangle(tmp); tmp.CopyTo(result); } diff --git a/src/Numerics/LinearAlgebra/Complex32/Factorization/UserEvd.cs b/src/Numerics/LinearAlgebra/Complex32/Factorization/UserEvd.cs index 087bc5ca..69078437 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Factorization/UserEvd.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Factorization/UserEvd.cs @@ -74,7 +74,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Factorization // Initialize matricies for eigenvalues and eigenvectors var eigenVectors = DenseMatrix.CreateIdentity(order); - var blockDiagonal = matrix.CreateMatrix(order, order); + var blockDiagonal = Matrix.Build.SameAs(matrix, order, order); var eigenValues = new LinearAlgebra.Complex.DenseVector(order); var isSymmetric = true; diff --git a/src/Numerics/LinearAlgebra/Complex32/Factorization/UserGramSchmidt.cs b/src/Numerics/LinearAlgebra/Complex32/Factorization/UserGramSchmidt.cs index e1dac658..175b2140 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Factorization/UserGramSchmidt.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Factorization/UserGramSchmidt.cs @@ -60,7 +60,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Factorization } var q = matrix.Clone(); - var r = matrix.CreateMatrix(matrix.ColumnCount, matrix.ColumnCount); + var r = Matrix.Build.SameAs(matrix, matrix.ColumnCount, matrix.ColumnCount); for (var k = 0; k < q.ColumnCount; k++) { diff --git a/src/Numerics/LinearAlgebra/Complex32/Factorization/UserLU.cs b/src/Numerics/LinearAlgebra/Complex32/Factorization/UserLU.cs index a1e32b88..ad51b57a 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Factorization/UserLU.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Factorization/UserLU.cs @@ -297,7 +297,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Factorization public override Matrix Inverse() { var order = Factors.RowCount; - var inverse = Factors.CreateMatrix(order, order); + var inverse = Matrix.Build.SameAs(Factors, order, order); for (var i = 0; i < order; i++) { inverse.At(i, i, 1.0f); diff --git a/src/Numerics/LinearAlgebra/Complex32/Factorization/UserQR.cs b/src/Numerics/LinearAlgebra/Complex32/Factorization/UserQR.cs index 94542d00..6fab031d 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Factorization/UserQR.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Factorization/UserQR.cs @@ -72,7 +72,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Factorization if (method == QRMethod.Full) { r = matrix.Clone(); - q = matrix.CreateMatrix(matrix.RowCount, matrix.RowCount); + q = Matrix.Build.SameAs(matrix, matrix.RowCount, matrix.RowCount); for (var i = 0; i < matrix.RowCount; i++) { diff --git a/src/Numerics/LinearAlgebra/Complex32/Factorization/UserSvd.cs b/src/Numerics/LinearAlgebra/Complex32/Factorization/UserSvd.cs index b2acf111..0caedd73 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Factorization/UserSvd.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Factorization/UserSvd.cs @@ -64,9 +64,9 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Factorization var nm = Math.Min(matrix.RowCount + 1, matrix.ColumnCount); var matrixCopy = matrix.Clone(); - var s = matrixCopy.CreateVector(nm); - var u = matrixCopy.CreateMatrix(matrixCopy.RowCount, matrixCopy.RowCount); - var vt = matrixCopy.CreateMatrix(matrixCopy.ColumnCount, matrixCopy.ColumnCount); + var s = Vector.Build.SameAs(matrixCopy, nm); + var u = Matrix.Build.SameAs(matrixCopy, matrixCopy.RowCount, matrixCopy.RowCount); + var vt = Matrix.Build.SameAs(matrixCopy, matrixCopy.ColumnCount, matrixCopy.ColumnCount); const int maxiter = 1000; var e = new Complex32[matrixCopy.ColumnCount]; @@ -587,7 +587,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Factorization if (matrixCopy.RowCount < matrixCopy.ColumnCount) { nm--; - var tmp = matrixCopy.CreateVector(nm); + var tmp = Vector.Build.SameAs(matrixCopy, nm); for (i = 0; i < nm; i++) { tmp[i] = s[i]; diff --git a/src/Numerics/LinearAlgebra/Complex32/Matrix.cs b/src/Numerics/LinearAlgebra/Complex32/Matrix.cs index dae6f558..b9f248d2 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Matrix.cs @@ -106,7 +106,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// The conjugate transpose of this matrix. public override Matrix ConjugateTranspose() { - var ret = CreateMatrix(ColumnCount, RowCount); + var ret = Build.SameAs(this, ColumnCount, RowCount); for (var j = 0; j < ColumnCount; j++) { for (var i = 0; i < RowCount; i++) diff --git a/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs index 2b6a13bf..311aec5a 100644 --- a/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs @@ -377,7 +377,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// The lower triangle of this matrix. public override Matrix LowerTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); LowerTriangleImpl(result); return result; } @@ -402,7 +402,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 if (ReferenceEquals(this, result)) { - var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); LowerTriangle(tmp); tmp.CopyTo(result); } @@ -442,7 +442,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// The upper triangle of this matrix. public override Matrix UpperTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); UpperTriangleImpl(result); return result; } @@ -467,7 +467,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 if (ReferenceEquals(this, result)) { - var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); UpperTriangle(tmp); tmp.CopyTo(result); } @@ -508,7 +508,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// The lower triangle of this matrix. public override Matrix StrictlyLowerTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); StrictlyLowerTriangleImpl(result); return result; } @@ -533,7 +533,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 if (ReferenceEquals(this, result)) { - var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); StrictlyLowerTriangle(tmp); tmp.CopyTo(result); } @@ -574,7 +574,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// The upper triangle of this matrix. public override Matrix StrictlyUpperTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); StrictlyUpperTriangleImpl(result); return result; } @@ -599,7 +599,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 if (ReferenceEquals(this, result)) { - var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); StrictlyUpperTriangle(tmp); tmp.CopyTo(result); } diff --git a/src/Numerics/LinearAlgebra/Double/Factorization/UserEvd.cs b/src/Numerics/LinearAlgebra/Double/Factorization/UserEvd.cs index c0a4c97d..4ee3a7dd 100644 --- a/src/Numerics/LinearAlgebra/Double/Factorization/UserEvd.cs +++ b/src/Numerics/LinearAlgebra/Double/Factorization/UserEvd.cs @@ -74,8 +74,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Factorization var order = matrix.RowCount; // Initialize matricies for eigenvalues and eigenvectors - var eigenVectors = matrix.CreateMatrix(order, order); - var blockDiagonal = matrix.CreateMatrix(order, order); + var eigenVectors = Matrix.Build.SameAs(matrix, order, order); + var blockDiagonal = Matrix.Build.SameAs(matrix, order, order); var eigenValues = new LinearAlgebra.Complex.DenseVector(order); var isSymmetric = true; diff --git a/src/Numerics/LinearAlgebra/Double/Factorization/UserGramSchmidt.cs b/src/Numerics/LinearAlgebra/Double/Factorization/UserGramSchmidt.cs index 7736651f..569585c9 100644 --- a/src/Numerics/LinearAlgebra/Double/Factorization/UserGramSchmidt.cs +++ b/src/Numerics/LinearAlgebra/Double/Factorization/UserGramSchmidt.cs @@ -58,7 +58,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Factorization } var q = matrix.Clone(); - var r = matrix.CreateMatrix(matrix.ColumnCount, matrix.ColumnCount); + var r = Matrix.Build.SameAs(matrix, matrix.ColumnCount, matrix.ColumnCount); for (var k = 0; k < q.ColumnCount; k++) { diff --git a/src/Numerics/LinearAlgebra/Double/Factorization/UserLU.cs b/src/Numerics/LinearAlgebra/Double/Factorization/UserLU.cs index 860ba0d2..a04041e0 100644 --- a/src/Numerics/LinearAlgebra/Double/Factorization/UserLU.cs +++ b/src/Numerics/LinearAlgebra/Double/Factorization/UserLU.cs @@ -295,7 +295,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Factorization public override Matrix Inverse() { var order = Factors.RowCount; - var inverse = Factors.CreateMatrix(order, order); + var inverse = Matrix.Build.SameAs(Factors, order, order); for (var i = 0; i < order; i++) { inverse.At(i, i, 1.0); diff --git a/src/Numerics/LinearAlgebra/Double/Factorization/UserQR.cs b/src/Numerics/LinearAlgebra/Double/Factorization/UserQR.cs index 7fefa0ff..47459ccb 100644 --- a/src/Numerics/LinearAlgebra/Double/Factorization/UserQR.cs +++ b/src/Numerics/LinearAlgebra/Double/Factorization/UserQR.cs @@ -70,7 +70,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Factorization if (method == QRMethod.Full) { r = matrix.Clone(); - q = matrix.CreateMatrix(matrix.RowCount, matrix.RowCount); + q = Matrix.Build.SameAs(matrix, matrix.RowCount, matrix.RowCount); for (var i = 0; i < matrix.RowCount; i++) { diff --git a/src/Numerics/LinearAlgebra/Double/Factorization/UserSvd.cs b/src/Numerics/LinearAlgebra/Double/Factorization/UserSvd.cs index 186b799d..9aa2397b 100644 --- a/src/Numerics/LinearAlgebra/Double/Factorization/UserSvd.cs +++ b/src/Numerics/LinearAlgebra/Double/Factorization/UserSvd.cs @@ -62,9 +62,9 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Factorization var nm = Math.Min(matrix.RowCount + 1, matrix.ColumnCount); var matrixCopy = matrix.Clone(); - var s = matrixCopy.CreateVector(nm); - var u = matrixCopy.CreateMatrix(matrixCopy.RowCount, matrixCopy.RowCount); - var vt = matrixCopy.CreateMatrix(matrixCopy.ColumnCount, matrixCopy.ColumnCount); + var s = Vector.Build.SameAs(matrixCopy, nm); + var u = Matrix.Build.SameAs(matrixCopy, matrixCopy.RowCount, matrixCopy.RowCount); + var vt = Matrix.Build.SameAs(matrixCopy, matrixCopy.ColumnCount, matrixCopy.ColumnCount); const int maxiter = 1000; var e = new double[matrixCopy.ColumnCount]; @@ -570,7 +570,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Factorization if (matrixCopy.RowCount < matrixCopy.ColumnCount) { nm--; - var tmp = matrixCopy.CreateVector(nm); + var tmp = Vector.Build.SameAs(matrixCopy, nm); for (i = 0; i < nm; i++) { tmp[i] = s[i]; diff --git a/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs index 80a1cf4b..8ccb916a 100644 --- a/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs @@ -375,7 +375,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// The lower triangle of this matrix. public override Matrix LowerTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); LowerTriangleImpl(result); return result; } @@ -400,7 +400,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double if (ReferenceEquals(this, result)) { - var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); LowerTriangle(tmp); tmp.CopyTo(result); } @@ -440,7 +440,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// The upper triangle of this matrix. public override Matrix UpperTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); UpperTriangleImpl(result); return result; } @@ -465,7 +465,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double if (ReferenceEquals(this, result)) { - var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); UpperTriangle(tmp); tmp.CopyTo(result); } @@ -506,7 +506,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// The lower triangle of this matrix. public override Matrix StrictlyLowerTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); StrictlyLowerTriangleImpl(result); return result; } @@ -531,7 +531,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double if (ReferenceEquals(this, result)) { - var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); StrictlyLowerTriangle(tmp); tmp.CopyTo(result); } @@ -572,7 +572,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// The upper triangle of this matrix. public override Matrix StrictlyUpperTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); StrictlyUpperTriangleImpl(result); return result; } @@ -597,7 +597,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double if (ReferenceEquals(this, result)) { - var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); StrictlyUpperTriangle(tmp); tmp.CopyTo(result); } diff --git a/src/Numerics/LinearAlgebra/Factorization/Cholesky.cs b/src/Numerics/LinearAlgebra/Factorization/Cholesky.cs index 07939b4a..40398ba9 100644 --- a/src/Numerics/LinearAlgebra/Factorization/Cholesky.cs +++ b/src/Numerics/LinearAlgebra/Factorization/Cholesky.cs @@ -72,7 +72,7 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization /// The left hand side , X. public virtual Matrix Solve(Matrix input) { - var x = input.CreateMatrix(input.RowCount, input.ColumnCount); + var x = Matrix.Build.SameAs(input, input.RowCount, input.ColumnCount); Solve(input, x); return x; } @@ -91,7 +91,7 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization /// The left hand side , x. public virtual Vector Solve(Vector input) { - var x = input.CreateVector(input.Count); + var x = Vector.Build.SameAs(input, input.Count); Solve(input, x); return x; } diff --git a/src/Numerics/LinearAlgebra/Factorization/Evd.cs b/src/Numerics/LinearAlgebra/Factorization/Evd.cs index 28785ef5..dd9260a1 100644 --- a/src/Numerics/LinearAlgebra/Factorization/Evd.cs +++ b/src/Numerics/LinearAlgebra/Factorization/Evd.cs @@ -109,9 +109,9 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization /// The left hand side , X. public virtual Matrix Solve(Matrix input) { - var result = EigenVectors.CreateMatrix(EigenVectors.ColumnCount, input.ColumnCount); - Solve(input, result); - return result; + var x = Matrix.Build.SameAs(EigenVectors, EigenVectors.ColumnCount, input.ColumnCount); + Solve(input, x); + return x; } /// @@ -128,7 +128,7 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization /// The left hand side , x. public virtual Vector Solve(Vector input) { - var x = EigenVectors.CreateVector(EigenVectors.ColumnCount); + var x = Vector.Build.SameAs(EigenVectors, EigenVectors.ColumnCount); Solve(input, x); return x; } diff --git a/src/Numerics/LinearAlgebra/Factorization/LU.cs b/src/Numerics/LinearAlgebra/Factorization/LU.cs index abcf0ff2..9161e13c 100644 --- a/src/Numerics/LinearAlgebra/Factorization/LU.cs +++ b/src/Numerics/LinearAlgebra/Factorization/LU.cs @@ -111,7 +111,7 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization /// The left hand side , X. public virtual Matrix Solve(Matrix input) { - var x = input.CreateMatrix(input.RowCount, input.ColumnCount); + var x = Matrix.Build.SameAs(input, input.RowCount, input.ColumnCount); Solve(input, x); return x; } @@ -130,7 +130,7 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization /// The left hand side , x. public virtual Vector Solve(Vector input) { - var x = input.CreateVector(input.Count); + var x = Vector.Build.SameAs(input, input.Count); Solve(input, x); return x; } diff --git a/src/Numerics/LinearAlgebra/Factorization/QR.cs b/src/Numerics/LinearAlgebra/Factorization/QR.cs index 6535b0c6..d7b069a1 100644 --- a/src/Numerics/LinearAlgebra/Factorization/QR.cs +++ b/src/Numerics/LinearAlgebra/Factorization/QR.cs @@ -109,9 +109,9 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization /// The left hand side , X. public virtual Matrix Solve(Matrix input) { - var matrixX = input.CreateMatrix(FullR.ColumnCount, input.ColumnCount); - Solve(input, matrixX); - return matrixX; + var x = Matrix.Build.SameAs(input, FullR.ColumnCount, input.ColumnCount); + Solve(input, x); + return x; } /// @@ -128,7 +128,7 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization /// The left hand side , x. public virtual Vector Solve(Vector input) { - var x = input.CreateVector(FullR.ColumnCount); + var x = Vector.Build.SameAs(input, FullR.ColumnCount); Solve(input, x); return x; } diff --git a/src/Numerics/LinearAlgebra/Factorization/Svd.cs b/src/Numerics/LinearAlgebra/Factorization/Svd.cs index 0e3dc2f7..fb762493 100644 --- a/src/Numerics/LinearAlgebra/Factorization/Svd.cs +++ b/src/Numerics/LinearAlgebra/Factorization/Svd.cs @@ -71,7 +71,7 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization { var rows = U.RowCount; var columns = VT.ColumnCount; - var result = U.CreateMatrix(rows, columns); + var result = Matrix.Build.SameAs(U, rows, columns); for (var i = 0; i < rows; i++) { for (var j = 0; j < columns; j++) @@ -145,9 +145,9 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization throw new InvalidOperationException(Resources.SingularVectorsNotComputed); } - var result = U.CreateMatrix(VT.ColumnCount, input.ColumnCount); - Solve(input, result); - return result; + var x = Matrix.Build.SameAs(U, VT.ColumnCount, input.ColumnCount); + Solve(input, x); + return x; } /// @@ -169,7 +169,7 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization throw new InvalidOperationException(Resources.SingularVectorsNotComputed); } - var x = U.CreateVector(VT.ColumnCount); + var x = Vector.Build.SameAs(U, VT.ColumnCount); Solve(input, x); return x; } diff --git a/src/Numerics/LinearAlgebra/Matrix.Arithmetic.cs b/src/Numerics/LinearAlgebra/Matrix.Arithmetic.cs index 3a976ecc..5a997cdf 100644 --- a/src/Numerics/LinearAlgebra/Matrix.Arithmetic.cs +++ b/src/Numerics/LinearAlgebra/Matrix.Arithmetic.cs @@ -204,7 +204,7 @@ namespace MathNet.Numerics.LinearAlgebra return Clone(); } - var result = Build.SameType(this, RowCount, ColumnCount); + var result = Build.SameAs(this); DoAdd(scalar, result); return result; } @@ -244,7 +244,7 @@ namespace MathNet.Numerics.LinearAlgebra throw DimensionsDontMatch(this, other); } - var result = Build.SameType(this, other, RowCount, ColumnCount); + var result = Build.SameAs(this, other, RowCount, ColumnCount); DoAdd(other, result); return result; } @@ -282,7 +282,7 @@ namespace MathNet.Numerics.LinearAlgebra return Clone(); } - var result = Build.SameType(this, RowCount, ColumnCount); + var result = Build.SameAs(this); DoSubtract(scalar, result); return result; } @@ -316,7 +316,7 @@ namespace MathNet.Numerics.LinearAlgebra /// A new matrix containing the subtraction of the scalar and this matrix. public Matrix SubtractFrom(T scalar) { - var result = Build.SameType(this, RowCount, ColumnCount); + var result = Build.SameAs(this); DoSubtractFrom(scalar, result); return result; } @@ -350,7 +350,7 @@ namespace MathNet.Numerics.LinearAlgebra throw DimensionsDontMatch(this, other); } - var result = Build.SameType(this, other, RowCount, ColumnCount); + var result = Build.SameAs(this, other, RowCount, ColumnCount); DoSubtract(other, result); return result; } @@ -390,10 +390,10 @@ namespace MathNet.Numerics.LinearAlgebra if (scalar.Equals(Zero)) { - return CreateMatrix(RowCount, ColumnCount); + return Build.SameAs(this); } - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); DoMultiply(scalar, result); return result; } @@ -448,7 +448,7 @@ namespace MathNet.Numerics.LinearAlgebra throw new DivideByZeroException(); } - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); DoDivide(scalar, result); return result; } @@ -492,7 +492,7 @@ namespace MathNet.Numerics.LinearAlgebra /// The result of the division. public Matrix DivideByThis(T scalar) { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); DoDivideByThis(scalar, result); return result; } @@ -531,7 +531,7 @@ namespace MathNet.Numerics.LinearAlgebra throw DimensionsDontMatch(this, rightSide, "rightSide"); } - var ret = CreateVector(RowCount); + var ret = Vector.Build.SameAs(this, RowCount); DoMultiply(rightSide, ret); return ret; } @@ -580,7 +580,7 @@ namespace MathNet.Numerics.LinearAlgebra throw DimensionsDontMatch(this, leftSide, "leftSide"); } - var ret = CreateVector(ColumnCount); + var ret = Vector.Build.SameAs(this, ColumnCount); DoLeftMultiply(leftSide, ret); return ret; } @@ -642,7 +642,7 @@ namespace MathNet.Numerics.LinearAlgebra if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) { - var tmp = Build.SameType(result, result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); DoMultiply(other, tmp); tmp.CopyTo(result); } @@ -665,7 +665,7 @@ namespace MathNet.Numerics.LinearAlgebra throw DimensionsDontMatch(this, other); } - var result = Build.SameType(this, other, RowCount, other.ColumnCount); + var result = Build.SameAs(this, other, RowCount, other.ColumnCount); DoMultiply(other, result); return result; } @@ -686,7 +686,7 @@ namespace MathNet.Numerics.LinearAlgebra if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) { - var tmp = Build.SameType(result, result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); DoTransposeAndMultiply(other, tmp); tmp.CopyTo(result); } @@ -709,7 +709,7 @@ namespace MathNet.Numerics.LinearAlgebra throw DimensionsDontMatch(this, other); } - var result = Build.SameType(this, other, RowCount, other.RowCount); + var result = Build.SameAs(this, other, RowCount, other.RowCount); DoTransposeAndMultiply(other, result); return result; } @@ -727,7 +727,7 @@ namespace MathNet.Numerics.LinearAlgebra throw DimensionsDontMatch(this, rightSide, "rightSide"); } - var result = CreateVector(ColumnCount); + var result = Vector.Build.SameAs(this, ColumnCount); DoTransposeThisAndMultiply(rightSide, result); return result; } @@ -779,7 +779,7 @@ namespace MathNet.Numerics.LinearAlgebra if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) { - var tmp = Build.SameType(result, result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); DoTransposeThisAndMultiply(other, tmp); tmp.CopyTo(result); } @@ -802,7 +802,7 @@ namespace MathNet.Numerics.LinearAlgebra throw DimensionsDontMatch(this, other); } - var result = Build.SameType(this, other, ColumnCount, other.ColumnCount); + var result = Build.SameAs(this, other, ColumnCount, other.ColumnCount); DoTransposeThisAndMultiply(other, result); return result; } @@ -813,7 +813,7 @@ namespace MathNet.Numerics.LinearAlgebra /// A matrix containing the negated values. public Matrix Negate() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); DoNegate(result); return result; } @@ -839,7 +839,7 @@ namespace MathNet.Numerics.LinearAlgebra /// A matrix containing the conjugated values. public Matrix Conjugate() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); DoConjugate(result); return result; } @@ -866,7 +866,7 @@ namespace MathNet.Numerics.LinearAlgebra /// A matrix containing the results. public Matrix Modulus(T divisor) { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); DoModulus(divisor, result); return result; } @@ -893,7 +893,7 @@ namespace MathNet.Numerics.LinearAlgebra /// A matrix containing the results. public Matrix ModulusByThis(T dividend) { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); DoModulusByThis(dividend, result); return result; } @@ -926,7 +926,7 @@ namespace MathNet.Numerics.LinearAlgebra throw DimensionsDontMatch(this, other, "other"); } - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); DoPointwiseMultiply(other, result); return result; } @@ -961,7 +961,7 @@ namespace MathNet.Numerics.LinearAlgebra throw DimensionsDontMatch(this, divisor); } - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); DoPointwiseDivide(divisor, result); return result; } @@ -996,7 +996,7 @@ namespace MathNet.Numerics.LinearAlgebra throw DimensionsDontMatch(this, divisor); } - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); DoPointwiseModulus(divisor, result); return result; } @@ -1074,7 +1074,7 @@ namespace MathNet.Numerics.LinearAlgebra /// The kronecker product of the two matrices. public Matrix KroneckerProduct(Matrix other) { - var result = CreateMatrix(RowCount*other.RowCount, ColumnCount*other.ColumnCount); + var result = Build.SameAs(this, RowCount*other.RowCount, ColumnCount*other.ColumnCount); KroneckerProduct(other, result); return result; } @@ -1115,14 +1115,13 @@ namespace MathNet.Numerics.LinearAlgebra throw new ArgumentOutOfRangeException("p", Resources.ArgumentMustBePositive); } - var ret = CreateMatrix(RowCount, ColumnCount); - + var result = Build.SameAs(this); for (var index = 0; index < ColumnCount; index++) { - ret.SetColumn(index, Column(index).Normalize(p)); + result.SetColumn(index, Column(index).Normalize(p)); } - return ret; + return result; } /// @@ -1138,8 +1137,7 @@ namespace MathNet.Numerics.LinearAlgebra throw new ArgumentOutOfRangeException("p", Resources.ArgumentMustBePositive); } - var ret = CreateMatrix(RowCount, ColumnCount); - + var ret = Build.SameAs(this); for (var index = 0; index < RowCount; index++) { ret.SetRow(index, Row(index).Normalize(p)); diff --git a/src/Numerics/LinearAlgebra/Matrix.Solve.cs b/src/Numerics/LinearAlgebra/Matrix.Solve.cs index 5deafc03..2bee0ca2 100644 --- a/src/Numerics/LinearAlgebra/Matrix.Solve.cs +++ b/src/Numerics/LinearAlgebra/Matrix.Solve.cs @@ -127,9 +127,9 @@ namespace MathNet.Numerics.LinearAlgebra /// The left hand side , X. public Matrix Solve(Matrix input) { - var matrixX = CreateMatrix(ColumnCount, input.ColumnCount); - Solve(input, matrixX); - return matrixX; + var x = Build.SameAs(this, ColumnCount, input.ColumnCount); + Solve(input, x); + return x; } @@ -140,7 +140,7 @@ namespace MathNet.Numerics.LinearAlgebra /// The left hand side , x. public Vector Solve(Vector input) { - var x = CreateVector(ColumnCount); + var x = Vector.Build.SameAs(this, ColumnCount); Solve(input, x); return x; } diff --git a/src/Numerics/LinearAlgebra/Matrix.cs b/src/Numerics/LinearAlgebra/Matrix.cs index b6c18723..543799bf 100644 --- a/src/Numerics/LinearAlgebra/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Matrix.cs @@ -204,7 +204,7 @@ namespace MathNet.Numerics.LinearAlgebra /// public Matrix Clone() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); Storage.CopyToUnchecked(result.Storage, skipClearing: true); return result; } @@ -231,31 +231,6 @@ namespace MathNet.Numerics.LinearAlgebra Storage.CopyTo(target.Storage); } - /// - /// Create a matrix of the same kind for the given number of rows and columns. - /// - /// The number of rows. - /// The number of columns. - /// Creates a matrix of the same matrix type as the current matrix. - public Matrix CreateMatrix(int rows, int columns) - { - return Storage.IsDense - ? Build.Dense(rows, columns) - : Build.Sparse(rows, columns); - } - - /// - /// Create a vector of the same kind with the given size. - /// - /// The size of the vector. - /// Creates a vector of the same type as the current matrix. - public Vector CreateVector(int size) - { - return Storage.IsDense - ? Vector.Build.Dense(size) - : Vector.Build.Sparse(size); - } - /// /// Copies a row into an Vector. /// @@ -270,7 +245,7 @@ namespace MathNet.Numerics.LinearAlgebra throw new ArgumentOutOfRangeException("index"); } - var ret = CreateVector(ColumnCount); + var ret = Vector.Build.SameAs(this, ColumnCount); Storage.CopySubRowToUnchecked(ret.Storage, index, 0, 0, ColumnCount); return ret; } @@ -310,7 +285,7 @@ namespace MathNet.Numerics.LinearAlgebra /// If is not positive. public Vector Row(int rowIndex, int columnIndex, int length) { - var ret = CreateVector(length); + var ret = Vector.Build.SameAs(this, length); Storage.CopySubRowTo(ret.Storage, rowIndex, columnIndex, 0, length); return ret; } @@ -355,7 +330,7 @@ namespace MathNet.Numerics.LinearAlgebra throw new ArgumentOutOfRangeException("index"); } - var ret = CreateVector(RowCount); + var ret = Vector.Build.SameAs(this, RowCount); Storage.CopySubColumnToUnchecked(ret.Storage, index, 0, 0, RowCount); return ret; } @@ -396,7 +371,7 @@ namespace MathNet.Numerics.LinearAlgebra /// If is not positive. public Vector Column(int columnIndex, int rowIndex, int length) { - var ret = CreateVector(length); + var ret = Vector.Build.SameAs(this, length); Storage.CopySubColumnTo(ret.Storage, columnIndex, rowIndex, 0, length); return ret; } @@ -433,17 +408,15 @@ namespace MathNet.Numerics.LinearAlgebra /// The upper triangle of this matrix. public virtual Matrix UpperTriangle() { - var ret = CreateMatrix(RowCount, ColumnCount); - + var result = Build.SameAs(this); for (var row = 0; row < RowCount; row++) { for (var column = row; column < ColumnCount; column++) { - ret.At(row, column, At(row, column)); + result.At(row, column, At(row, column)); } } - - return ret; + return result; } /// @@ -452,17 +425,15 @@ namespace MathNet.Numerics.LinearAlgebra /// The lower triangle of this matrix. public virtual Matrix LowerTriangle() { - var ret = CreateMatrix(RowCount, ColumnCount); - + var result = Build.SameAs(this); for (var row = 0; row < RowCount; row++) { for (var column = 0; column <= row && column < ColumnCount; column++) { - ret.At(row, column, At(row, column)); + result.At(row, column, At(row, column)); } } - - return ret; + return result; } /// @@ -537,9 +508,9 @@ namespace MathNet.Numerics.LinearAlgebra /// is not positive. public virtual Matrix SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount) { - var target = CreateMatrix(rowCount, columnCount); - Storage.CopySubMatrixTo(target.Storage, rowIndex, 0, rowCount, columnIndex, 0, columnCount, skipClearing: true); - return target; + var result = Build.SameAs(this, rowCount, columnCount); + Storage.CopySubMatrixTo(result.Storage, rowIndex, 0, rowCount, columnIndex, 0, columnCount, skipClearing: true); + return result; } /// @@ -551,7 +522,7 @@ namespace MathNet.Numerics.LinearAlgebra public virtual Vector Diagonal() { var min = Math.Min(RowCount, ColumnCount); - var diagonal = CreateVector(min); + var diagonal = Vector.Build.SameAs(this, min); for (var i = 0; i < min; i++) { @@ -568,8 +539,7 @@ namespace MathNet.Numerics.LinearAlgebra /// The lower triangle of this matrix. public virtual Matrix StrictlyLowerTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); - + var result = Build.SameAs(this); for (var row = 0; row < RowCount; row++) { for (var column = 0; column < row; column++) @@ -577,7 +547,6 @@ namespace MathNet.Numerics.LinearAlgebra result.At(row, column, At(row, column)); } } - return result; } @@ -615,8 +584,7 @@ namespace MathNet.Numerics.LinearAlgebra /// The upper triangle of this matrix. public virtual Matrix StrictlyUpperTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); - + var result = Build.SameAs(this); for (var row = 0; row < RowCount; row++) { for (var column = row + 1; column < ColumnCount; column++) @@ -624,7 +592,6 @@ namespace MathNet.Numerics.LinearAlgebra result.At(row, column, At(row, column)); } } - return result; } @@ -681,7 +648,7 @@ namespace MathNet.Numerics.LinearAlgebra throw new ArgumentException(Resources.ArgumentMatrixSameRowDimension, "column"); } - var result = CreateMatrix(RowCount, ColumnCount + 1); + var result = Build.SameAs(this, RowCount, ColumnCount + 1); for (var i = 0; i < columnIndex; i++) { @@ -788,7 +755,7 @@ namespace MathNet.Numerics.LinearAlgebra throw new ArgumentException(Resources.ArgumentMatrixSameRowDimension, "row"); } - var result = CreateMatrix(RowCount + 1, ColumnCount); + var result = Build.SameAs(this, RowCount + 1, ColumnCount); for (var i = 0; i < rowIndex; i++) { @@ -997,16 +964,15 @@ namespace MathNet.Numerics.LinearAlgebra /// The transpose of this matrix. public virtual Matrix Transpose() { - var ret = CreateMatrix(ColumnCount, RowCount); + var result = Build.SameAs(this, ColumnCount, RowCount); for (var j = 0; j < ColumnCount; j++) { for (var i = 0; i < RowCount; i++) { - ret.At(j, i, At(i, j)); + result.At(j, i, At(i, j)); } } - - return ret; + return result; } /// @@ -1092,7 +1058,7 @@ namespace MathNet.Numerics.LinearAlgebra throw new ArgumentException(Resources.ArgumentMatrixSameRowDimension); } - var result = CreateMatrix(RowCount, ColumnCount + right.ColumnCount); + var result = Build.SameAs(this, right, RowCount, ColumnCount + right.ColumnCount, fullyMutable: true); Storage.CopySubMatrixToUnchecked(result.Storage, 0, 0, RowCount, 0, 0, ColumnCount, skipClearing: true); right.Storage.CopySubMatrixToUnchecked(result.Storage, 0, 0, right.RowCount, 0, ColumnCount, right.ColumnCount, skipClearing: true); return result; @@ -1152,7 +1118,7 @@ namespace MathNet.Numerics.LinearAlgebra throw new ArgumentException(Resources.ArgumentMatrixSameColumnDimension, "lower"); } - var result = CreateMatrix(RowCount + lower.RowCount, ColumnCount); + var result = Build.SameAs(this, lower, RowCount + lower.RowCount, ColumnCount, fullyMutable: true); Storage.CopySubMatrixToUnchecked(result.Storage, 0, 0, RowCount, 0, 0, ColumnCount, skipClearing: true); lower.Storage.CopySubMatrixToUnchecked(result.Storage, 0, RowCount, lower.RowCount, 0, 0, lower.ColumnCount, skipClearing: true); return result; @@ -1210,7 +1176,7 @@ namespace MathNet.Numerics.LinearAlgebra throw new ArgumentNullException("lower"); } - var result = CreateMatrix(RowCount + lower.RowCount, ColumnCount + lower.ColumnCount); + var result = Build.SameAs(this, lower, RowCount + lower.RowCount, ColumnCount + lower.ColumnCount); Storage.CopySubMatrixToUnchecked(result.Storage, 0, 0, RowCount, 0, 0, ColumnCount); lower.Storage.CopySubMatrixToUnchecked(result.Storage, 0, RowCount, lower.RowCount, 0, ColumnCount, lower.ColumnCount); return result; diff --git a/src/Numerics/LinearAlgebra/Single/Factorization/UserEvd.cs b/src/Numerics/LinearAlgebra/Single/Factorization/UserEvd.cs index 4c8640cd..3d5f10cb 100644 --- a/src/Numerics/LinearAlgebra/Single/Factorization/UserEvd.cs +++ b/src/Numerics/LinearAlgebra/Single/Factorization/UserEvd.cs @@ -73,8 +73,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Factorization var order = matrix.RowCount; // Initialize matricies for eigenvalues and eigenvectors - var eigenVectors = matrix.CreateMatrix(order, order); - var blockDiagonal = matrix.CreateMatrix(order, order); + var eigenVectors = Matrix.Build.SameAs(matrix, order, order); + var blockDiagonal = Matrix.Build.SameAs(matrix, order, order); var eigenValues = new LinearAlgebra.Complex.DenseVector(order); var isSymmetric = true; diff --git a/src/Numerics/LinearAlgebra/Single/Factorization/UserGramSchmidt.cs b/src/Numerics/LinearAlgebra/Single/Factorization/UserGramSchmidt.cs index 63f7f242..974f39d7 100644 --- a/src/Numerics/LinearAlgebra/Single/Factorization/UserGramSchmidt.cs +++ b/src/Numerics/LinearAlgebra/Single/Factorization/UserGramSchmidt.cs @@ -58,7 +58,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Factorization } var q = matrix.Clone(); - var r = matrix.CreateMatrix(matrix.ColumnCount, matrix.ColumnCount); + var r = Matrix.Build.SameAs(matrix, matrix.ColumnCount, matrix.ColumnCount); for (var k = 0; k < q.ColumnCount; k++) { diff --git a/src/Numerics/LinearAlgebra/Single/Factorization/UserLU.cs b/src/Numerics/LinearAlgebra/Single/Factorization/UserLU.cs index 38d0cae1..895e81d4 100644 --- a/src/Numerics/LinearAlgebra/Single/Factorization/UserLU.cs +++ b/src/Numerics/LinearAlgebra/Single/Factorization/UserLU.cs @@ -295,7 +295,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Factorization public override Matrix Inverse() { var order = Factors.RowCount; - var inverse = Factors.CreateMatrix(order, order); + var inverse = Matrix.Build.SameAs(Factors, order, order); for (var i = 0; i < order; i++) { inverse.At(i, i, 1.0f); diff --git a/src/Numerics/LinearAlgebra/Single/Factorization/UserQR.cs b/src/Numerics/LinearAlgebra/Single/Factorization/UserQR.cs index 4b2abd1c..21a2d4df 100644 --- a/src/Numerics/LinearAlgebra/Single/Factorization/UserQR.cs +++ b/src/Numerics/LinearAlgebra/Single/Factorization/UserQR.cs @@ -70,7 +70,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Factorization if (method == QRMethod.Full) { r = matrix.Clone(); - q = matrix.CreateMatrix(matrix.RowCount, matrix.RowCount); + q = Matrix.Build.SameAs(matrix, matrix.RowCount, matrix.RowCount); for (var i = 0; i < matrix.RowCount; i++) { diff --git a/src/Numerics/LinearAlgebra/Single/Factorization/UserSvd.cs b/src/Numerics/LinearAlgebra/Single/Factorization/UserSvd.cs index 2d8098a2..c3a5eec5 100644 --- a/src/Numerics/LinearAlgebra/Single/Factorization/UserSvd.cs +++ b/src/Numerics/LinearAlgebra/Single/Factorization/UserSvd.cs @@ -62,9 +62,9 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Factorization var nm = Math.Min(matrix.RowCount + 1, matrix.ColumnCount); var matrixCopy = matrix.Clone(); - var s = matrixCopy.CreateVector(nm); - var u = matrixCopy.CreateMatrix(matrixCopy.RowCount, matrixCopy.RowCount); - var vt = matrixCopy.CreateMatrix(matrixCopy.ColumnCount, matrixCopy.ColumnCount); + var s = Vector.Build.SameAs(matrixCopy, nm); + var u = Matrix.Build.SameAs(matrixCopy, matrixCopy.RowCount, matrixCopy.RowCount); + var vt = Matrix.Build.SameAs(matrixCopy, matrixCopy.ColumnCount, matrixCopy.ColumnCount); const int maxiter = 1000; var e = new float[matrixCopy.ColumnCount]; @@ -570,7 +570,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Factorization if (matrixCopy.RowCount < matrixCopy.ColumnCount) { nm--; - var tmp = matrixCopy.CreateVector(nm); + var tmp = Vector.Build.SameAs(matrixCopy, nm); for (i = 0; i < nm; i++) { tmp[i] = s[i]; diff --git a/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs index ca0bc1ed..9d3adb85 100644 --- a/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs @@ -375,7 +375,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single /// The lower triangle of this matrix. public override Matrix LowerTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); LowerTriangleImpl(result); return result; } @@ -400,7 +400,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single if (ReferenceEquals(this, result)) { - var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); LowerTriangle(tmp); tmp.CopyTo(result); } @@ -440,7 +440,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single /// The upper triangle of this matrix. public override Matrix UpperTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); UpperTriangleImpl(result); return result; } @@ -465,7 +465,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single if (ReferenceEquals(this, result)) { - var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); UpperTriangle(tmp); tmp.CopyTo(result); } @@ -506,7 +506,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single /// The lower triangle of this matrix. public override Matrix StrictlyLowerTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); StrictlyLowerTriangleImpl(result); return result; } @@ -531,7 +531,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single if (ReferenceEquals(this, result)) { - var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); StrictlyLowerTriangle(tmp); tmp.CopyTo(result); } @@ -572,7 +572,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single /// The upper triangle of this matrix. public override Matrix StrictlyUpperTriangle() { - var result = CreateMatrix(RowCount, ColumnCount); + var result = Build.SameAs(this); StrictlyUpperTriangleImpl(result); return result; } @@ -597,7 +597,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single if (ReferenceEquals(this, result)) { - var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); + var tmp = Build.SameAs(result); StrictlyUpperTriangle(tmp); tmp.CopyTo(result); } diff --git a/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs b/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs index 26333d05..158a31c5 100644 --- a/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs +++ b/src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs @@ -155,7 +155,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests [Theory] public void CanGetHashCode(Matrix matrix) { - Assert.That(matrix.GetHashCode(), Is.Not.EqualTo(matrix.CreateMatrix(matrix.RowCount, matrix.ColumnCount).GetHashCode())); + Assert.That(matrix.GetHashCode(), Is.Not.EqualTo(Matrix.Build.SameAs(matrix).GetHashCode())); } [Theory] @@ -163,7 +163,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests { var cleared = matrix.Clone(); cleared.Clear(); - Assert.That(cleared, Is.EqualTo(matrix.CreateMatrix(matrix.RowCount, matrix.ColumnCount))); + Assert.That(cleared, Is.EqualTo(Matrix.Build.SameAs(matrix))); } [Theory] @@ -220,13 +220,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests [Theory] public void CanCreateSameKind(Matrix matrix) { - var empty = matrix.CreateMatrix(5, 6); + var empty = Matrix.Build.SameAs(matrix, 5, 6); Assert.That(empty, Is.EqualTo(CreateDenseZero(5, 6))); Assert.That(empty.Storage.IsDense, Is.EqualTo(matrix.Storage.IsDense)); - Assert.That(() => matrix.CreateMatrix(0, 2), Throws.InstanceOf()); - Assert.That(() => matrix.CreateMatrix(2, 0), Throws.InstanceOf()); - Assert.That(() => matrix.CreateMatrix(-1, -1), Throws.InstanceOf()); + Assert.That(() => Matrix.Build.SameAs(matrix, 0, 2), Throws.InstanceOf()); + Assert.That(() => Matrix.Build.SameAs(matrix, 2, 0), Throws.InstanceOf()); + Assert.That(() => Matrix.Build.SameAs(matrix, -1, -1), Throws.InstanceOf()); } [Test]