Browse Source

LA: phase out Matrix.CreateMatrix/CreateVector (no longer needed)

optimization-3
Christoph Ruegg 13 years ago
parent
commit
7f7120ea60
  1. 8
      src/FSharp/LinearAlgebra.Matrix.fs
  2. 16
      src/Numerics/Distributions/InverseWishart.cs
  3. 12
      src/Numerics/Distributions/Wishart.cs
  4. 74
      src/Numerics/LinearAlgebra/Builder.cs
  5. 2
      src/Numerics/LinearAlgebra/Complex/Factorization/UserEvd.cs
  6. 2
      src/Numerics/LinearAlgebra/Complex/Factorization/UserGramSchmidt.cs
  7. 2
      src/Numerics/LinearAlgebra/Complex/Factorization/UserLU.cs
  8. 2
      src/Numerics/LinearAlgebra/Complex/Factorization/UserQR.cs
  9. 8
      src/Numerics/LinearAlgebra/Complex/Factorization/UserSvd.cs
  10. 2
      src/Numerics/LinearAlgebra/Complex/Matrix.cs
  11. 16
      src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs
  12. 2
      src/Numerics/LinearAlgebra/Complex32/Factorization/UserEvd.cs
  13. 2
      src/Numerics/LinearAlgebra/Complex32/Factorization/UserGramSchmidt.cs
  14. 2
      src/Numerics/LinearAlgebra/Complex32/Factorization/UserLU.cs
  15. 2
      src/Numerics/LinearAlgebra/Complex32/Factorization/UserQR.cs
  16. 8
      src/Numerics/LinearAlgebra/Complex32/Factorization/UserSvd.cs
  17. 2
      src/Numerics/LinearAlgebra/Complex32/Matrix.cs
  18. 16
      src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs
  19. 4
      src/Numerics/LinearAlgebra/Double/Factorization/UserEvd.cs
  20. 2
      src/Numerics/LinearAlgebra/Double/Factorization/UserGramSchmidt.cs
  21. 2
      src/Numerics/LinearAlgebra/Double/Factorization/UserLU.cs
  22. 2
      src/Numerics/LinearAlgebra/Double/Factorization/UserQR.cs
  23. 8
      src/Numerics/LinearAlgebra/Double/Factorization/UserSvd.cs
  24. 16
      src/Numerics/LinearAlgebra/Double/SparseMatrix.cs
  25. 4
      src/Numerics/LinearAlgebra/Factorization/Cholesky.cs
  26. 8
      src/Numerics/LinearAlgebra/Factorization/Evd.cs
  27. 4
      src/Numerics/LinearAlgebra/Factorization/LU.cs
  28. 8
      src/Numerics/LinearAlgebra/Factorization/QR.cs
  29. 10
      src/Numerics/LinearAlgebra/Factorization/Svd.cs
  30. 62
      src/Numerics/LinearAlgebra/Matrix.Arithmetic.cs
  31. 8
      src/Numerics/LinearAlgebra/Matrix.Solve.cs
  32. 84
      src/Numerics/LinearAlgebra/Matrix.cs
  33. 4
      src/Numerics/LinearAlgebra/Single/Factorization/UserEvd.cs
  34. 2
      src/Numerics/LinearAlgebra/Single/Factorization/UserGramSchmidt.cs
  35. 2
      src/Numerics/LinearAlgebra/Single/Factorization/UserLU.cs
  36. 2
      src/Numerics/LinearAlgebra/Single/Factorization/UserQR.cs
  37. 8
      src/Numerics/LinearAlgebra/Single/Factorization/UserSvd.cs
  38. 16
      src/Numerics/LinearAlgebra/Single/SparseMatrix.cs
  39. 12
      src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs

8
src/FSharp/LinearAlgebra.Matrix.fs

@ -304,8 +304,8 @@ module Matrix =
A.MapIndexedInplace((fun i j x -> f i j), true) A.MapIndexedInplace((fun i j x -> f i j), true)
/// Fold all columns into one row vector. /// Fold all columns into one row vector.
let inline foldByCol f acc (A: #Matrix<_>) = let inline foldByCol f acc (A: #Matrix<'T>) =
let v = A.CreateVector(A.ColumnCount) let v = Vector<'T>.Build.SameAs(A, A.ColumnCount)
for k=0 to A.ColumnCount-1 do for k=0 to A.ColumnCount-1 do
let mutable macc = acc let mutable macc = acc
for i=0 to A.RowCount-1 do for i=0 to A.RowCount-1 do
@ -314,8 +314,8 @@ module Matrix =
v :> _ Vector v :> _ Vector
/// Fold all rows into one column vector. /// Fold all rows into one column vector.
let inline foldByRow f acc (A: #Matrix<_>) = let inline foldByRow f acc (A: #Matrix<'T>) =
let v = A.CreateVector(A.RowCount) let v = Vector<'T>.Build.SameAs(A, A.RowCount)
for k=0 to A.RowCount-1 do for k=0 to A.RowCount-1 do
let mutable macc = acc let mutable macc = acc
for i=0 to A.ColumnCount-1 do for i=0 to A.ColumnCount-1 do

16
src/Numerics/Distributions/InverseWishart.cs

@ -187,18 +187,12 @@ namespace MathNet.Numerics.Distributions
{ {
get get
{ {
var res = _scale.CreateMatrix(_scale.RowCount, _scale.ColumnCount); return Matrix<double>.Build.Dense(_scale.RowCount, _scale.ColumnCount, (i, j) =>
for (var i = 0; i < res.RowCount; i++)
{ {
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);
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)); return num1/num2;
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;
} }
} }

12
src/Numerics/Distributions/Wishart.cs

@ -207,16 +207,8 @@ namespace MathNet.Numerics.Distributions
{ {
get get
{ {
var res = _scale.CreateMatrix(_scale.RowCount, _scale.ColumnCount); return Matrix<double>.Build.Dense(_scale.RowCount, _scale.ColumnCount,
for (var i = 0; i < res.RowCount; i++) (i, j) => _degreesOfFreedom*((_scale.At(i, j)*_scale.At(i, j)) + (_scale.At(i, i)*_scale.At(j, j))));
{
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;
} }
} }

74
src/Numerics/LinearAlgebra/Builder.cs

@ -39,8 +39,6 @@ using MathNet.Numerics.LinearAlgebra.Storage;
namespace MathNet.Numerics.LinearAlgebra.Double namespace MathNet.Numerics.LinearAlgebra.Double
{ {
using Solvers;
internal class MatrixBuilder : MatrixBuilder<double> internal class MatrixBuilder : MatrixBuilder<double>
{ {
public override double Zero public override double Zero
@ -116,8 +114,6 @@ namespace MathNet.Numerics.LinearAlgebra.Double
namespace MathNet.Numerics.LinearAlgebra.Single namespace MathNet.Numerics.LinearAlgebra.Single
{ {
using Solvers;
internal class MatrixBuilder : MatrixBuilder<float> internal class MatrixBuilder : MatrixBuilder<float>
{ {
public override float Zero public override float Zero
@ -193,8 +189,6 @@ namespace MathNet.Numerics.LinearAlgebra.Single
namespace MathNet.Numerics.LinearAlgebra.Complex namespace MathNet.Numerics.LinearAlgebra.Complex
{ {
using Solvers;
#if NOSYSNUMERICS #if NOSYSNUMERICS
using Complex = Numerics.Complex; using Complex = Numerics.Complex;
#else #else
@ -276,8 +270,6 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
namespace MathNet.Numerics.LinearAlgebra.Complex32 namespace MathNet.Numerics.LinearAlgebra.Complex32
{ {
using Solvers;
internal class MatrixBuilder : MatrixBuilder<Numerics.Complex32> internal class MatrixBuilder : MatrixBuilder<Numerics.Complex32>
{ {
public override Numerics.Complex32 Zero public override Numerics.Complex32 Zero
@ -399,28 +391,52 @@ namespace MathNet.Numerics.LinearAlgebra
/// <summary> /// <summary>
/// Create a new matrix with the same kind of the provided example. /// Create a new matrix with the same kind of the provided example.
/// </summary> /// </summary>
public Matrix<T> SameType(Matrix<T> example, int rows, int columns) public Matrix<T> SameAs(Matrix<T> example, int rows, int columns, bool fullyMutable = false)
{ {
var storage = example.Storage; var storage = example.Storage;
if (storage is DenseColumnMajorMatrixStorage<T>) return Dense(rows, columns); if (storage is DenseColumnMajorMatrixStorage<T>) return Dense(rows, columns);
if (storage is DiagonalMatrixStorage<T>) return Diagonal(rows, columns); if (!fullyMutable && storage is DiagonalMatrixStorage<T>) return Diagonal(rows, columns);
if (storage is SparseCompressedRowMatrixStorage<T>) return Sparse(rows, columns); if (storage is SparseCompressedRowMatrixStorage<T>) return Sparse(rows, columns);
return Dense(rows, columns); return Dense(rows, columns);
} }
/// <summary>
/// Create a new matrix with the same kind and dimensions of the provided example.
/// </summary>
public Matrix<T> SameAs(Matrix<T> example)
{
return SameAs(example, example.RowCount, example.ColumnCount);
}
/// <summary>
/// Create a new matrix with the same kind of the provided example.
/// </summary>
public Matrix<T> SameAs(Vector<T> example, int rows, int columns)
{
return example.Storage.IsDense ? Dense(rows, columns) : Sparse(rows, columns);
}
/// <summary> /// <summary>
/// Create a new matrix with a type that can represent and is closest to both provided samples. /// Create a new matrix with a type that can represent and is closest to both provided samples.
/// </summary> /// </summary>
public Matrix<T> SameType(Matrix<T> example1, Matrix<T> example2 , int rows, int columns) public Matrix<T> SameAs(Matrix<T> example, Matrix<T> otherExample, int rows, int columns, bool fullyMutable = false)
{ {
var storage1 = example1.Storage; var storage1 = example.Storage;
var storage2 = example2.Storage; var storage2 = otherExample.Storage;
if (storage1 is DenseColumnMajorMatrixStorage<T> || storage2 is DenseColumnMajorMatrixStorage<T>) return Dense(rows, columns); if (storage1 is DenseColumnMajorMatrixStorage<T> || storage2 is DenseColumnMajorMatrixStorage<T>) return Dense(rows, columns);
if (storage1 is DiagonalMatrixStorage<T> && storage2 is DiagonalMatrixStorage<T>) return Diagonal(rows, columns); if (!fullyMutable && storage1 is DiagonalMatrixStorage<T> && storage2 is DiagonalMatrixStorage<T>) return Diagonal(rows, columns);
if (storage1 is SparseCompressedRowMatrixStorage<T> || storage2 is SparseCompressedRowMatrixStorage<T>) return Sparse(rows, columns); if (storage1 is SparseCompressedRowMatrixStorage<T> || storage2 is SparseCompressedRowMatrixStorage<T>) return Sparse(rows, columns);
return Dense(rows, columns); return Dense(rows, columns);
} }
/// <summary>
/// Create a new matrix with a type that can represent and is closest to both provided samples and the dimensions of example.
/// </summary>
public Matrix<T> SameAs(Matrix<T> example, Matrix<T> otherExample)
{
return SameAs(example, otherExample, example.RowCount, example.ColumnCount);
}
/// <summary> /// <summary>
/// Create a new dense matrix with values sampled from the provided random distribution. /// Create a new dense matrix with values sampled from the provided random distribution.
/// </summary> /// </summary>
@ -1278,7 +1294,23 @@ namespace MathNet.Numerics.LinearAlgebra
/// <summary> /// <summary>
/// Create a new vector with the same kind of the provided example. /// Create a new vector with the same kind of the provided example.
/// </summary> /// </summary>
public Vector<T> SameType(Vector<T> example, int length) public Vector<T> SameAs(Vector<T> example, int length)
{
return example.Storage.IsDense ? Dense(length) : Sparse(length);
}
/// <summary>
/// Create a new vector with the same kind and dimension of the provided example.
/// </summary>
public Vector<T> SameAs(Vector<T> example)
{
return example.Storage.IsDense ? Dense(example.Count) : Sparse(example.Count);
}
/// <summary>
/// Create a new vector with the same kind of the provided example.
/// </summary>
public Vector<T> SameAs(Matrix<T> example, int length)
{ {
return example.Storage.IsDense ? Dense(length) : Sparse(length); return example.Storage.IsDense ? Dense(length) : Sparse(length);
} }
@ -1286,9 +1318,17 @@ namespace MathNet.Numerics.LinearAlgebra
/// <summary> /// <summary>
/// Create a new vector with a type that can represent and is closest to both provided samples. /// Create a new vector with a type that can represent and is closest to both provided samples.
/// </summary> /// </summary>
public Vector<T> SameType(Vector<T> example1, Vector<T> example2, int length) public Vector<T> SameAs(Vector<T> example, Vector<T> otherExample, int length)
{
return example.Storage.IsDense || otherExample.Storage.IsDense ? Dense(length) : Sparse(length);
}
/// <summary>
/// Create a new vector with a type that can represent and is closest to both provided samples and the dimensions of example.
/// </summary>
public Vector<T> SameAs(Vector<T> example, Vector<T> 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);
} }
/// <summary> /// <summary>

2
src/Numerics/LinearAlgebra/Complex/Factorization/UserEvd.cs

@ -75,7 +75,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Factorization
// Initialize matricies for eigenvalues and eigenvectors // Initialize matricies for eigenvalues and eigenvectors
var eigenVectors = DenseMatrix.CreateIdentity(order); var eigenVectors = DenseMatrix.CreateIdentity(order);
var blockDiagonal = matrix.CreateMatrix(order, order); var blockDiagonal = Matrix<Complex>.Build.SameAs(matrix, order, order);
var eigenValues = new DenseVector(order); var eigenValues = new DenseVector(order);
var isSymmetric = true; var isSymmetric = true;

2
src/Numerics/LinearAlgebra/Complex/Factorization/UserGramSchmidt.cs

@ -65,7 +65,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Factorization
} }
var q = matrix.Clone(); var q = matrix.Clone();
var r = matrix.CreateMatrix(matrix.ColumnCount, matrix.ColumnCount); var r = Matrix<Complex>.Build.SameAs(matrix, matrix.ColumnCount, matrix.ColumnCount);
for (var k = 0; k < q.ColumnCount; k++) for (var k = 0; k < q.ColumnCount; k++)
{ {

2
src/Numerics/LinearAlgebra/Complex/Factorization/UserLU.cs

@ -302,7 +302,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Factorization
public override Matrix<Complex> Inverse() public override Matrix<Complex> Inverse()
{ {
var order = Factors.RowCount; var order = Factors.RowCount;
var inverse = Factors.CreateMatrix(order, order); var inverse = Matrix<Complex>.Build.SameAs(Factors, order, order);
for (var i = 0; i < order; i++) for (var i = 0; i < order; i++)
{ {
inverse.At(i, i, 1.0); inverse.At(i, i, 1.0);

2
src/Numerics/LinearAlgebra/Complex/Factorization/UserQR.cs

@ -77,7 +77,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Factorization
if (method == QRMethod.Full) if (method == QRMethod.Full)
{ {
r = matrix.Clone(); r = matrix.Clone();
q = matrix.CreateMatrix(matrix.RowCount, matrix.RowCount); q = Matrix<Complex>.Build.SameAs(matrix, matrix.RowCount, matrix.RowCount);
for (var i = 0; i < matrix.RowCount; i++) for (var i = 0; i < matrix.RowCount; i++)
{ {

8
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 nm = Math.Min(matrix.RowCount + 1, matrix.ColumnCount);
var matrixCopy = matrix.Clone(); var matrixCopy = matrix.Clone();
var s = matrixCopy.CreateVector(nm); var s = Vector<Complex>.Build.SameAs(matrixCopy, nm);
var u = matrixCopy.CreateMatrix(matrixCopy.RowCount, matrixCopy.RowCount); var u = Matrix<Complex>.Build.SameAs(matrixCopy, matrixCopy.RowCount, matrixCopy.RowCount);
var vt = matrixCopy.CreateMatrix(matrixCopy.ColumnCount, matrixCopy.ColumnCount); var vt = Matrix<Complex>.Build.SameAs(matrixCopy, matrixCopy.ColumnCount, matrixCopy.ColumnCount);
const int maxiter = 1000; const int maxiter = 1000;
var e = new Complex[matrixCopy.ColumnCount]; var e = new Complex[matrixCopy.ColumnCount];
@ -592,7 +592,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex.Factorization
if (matrixCopy.RowCount < matrixCopy.ColumnCount) if (matrixCopy.RowCount < matrixCopy.ColumnCount)
{ {
nm--; nm--;
var tmp = matrixCopy.CreateVector(nm); var tmp = Vector<Complex>.Build.SameAs(matrixCopy, nm);
for (i = 0; i < nm; i++) for (i = 0; i < nm; i++)
{ {
tmp[i] = s[i]; tmp[i] = s[i];

2
src/Numerics/LinearAlgebra/Complex/Matrix.cs

@ -112,7 +112,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <returns>The conjugate transpose of this matrix.</returns> /// <returns>The conjugate transpose of this matrix.</returns>
public override Matrix<Complex> ConjugateTranspose() public override Matrix<Complex> ConjugateTranspose()
{ {
var ret = CreateMatrix(ColumnCount, RowCount); var ret = Build.SameAs(this, ColumnCount, RowCount);
for (var j = 0; j < ColumnCount; j++) for (var j = 0; j < ColumnCount; j++)
{ {
for (var i = 0; i < RowCount; i++) for (var i = 0; i < RowCount; i++)

16
src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs

@ -382,7 +382,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <returns>The lower triangle of this matrix.</returns> /// <returns>The lower triangle of this matrix.</returns>
public override Matrix<Complex> LowerTriangle() public override Matrix<Complex> LowerTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
LowerTriangleImpl(result); LowerTriangleImpl(result);
return result; return result;
} }
@ -407,7 +407,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
if (ReferenceEquals(this, result)) if (ReferenceEquals(this, result))
{ {
var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
LowerTriangle(tmp); LowerTriangle(tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
@ -447,7 +447,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <returns>The upper triangle of this matrix.</returns> /// <returns>The upper triangle of this matrix.</returns>
public override Matrix<Complex> UpperTriangle() public override Matrix<Complex> UpperTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
UpperTriangleImpl(result); UpperTriangleImpl(result);
return result; return result;
} }
@ -472,7 +472,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
if (ReferenceEquals(this, result)) if (ReferenceEquals(this, result))
{ {
var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
UpperTriangle(tmp); UpperTriangle(tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
@ -513,7 +513,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <returns>The lower triangle of this matrix.</returns> /// <returns>The lower triangle of this matrix.</returns>
public override Matrix<Complex> StrictlyLowerTriangle() public override Matrix<Complex> StrictlyLowerTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
StrictlyLowerTriangleImpl(result); StrictlyLowerTriangleImpl(result);
return result; return result;
} }
@ -538,7 +538,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
if (ReferenceEquals(this, result)) if (ReferenceEquals(this, result))
{ {
var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
StrictlyLowerTriangle(tmp); StrictlyLowerTriangle(tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
@ -579,7 +579,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
/// <returns>The upper triangle of this matrix.</returns> /// <returns>The upper triangle of this matrix.</returns>
public override Matrix<Complex> StrictlyUpperTriangle() public override Matrix<Complex> StrictlyUpperTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
StrictlyUpperTriangleImpl(result); StrictlyUpperTriangleImpl(result);
return result; return result;
} }
@ -604,7 +604,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
if (ReferenceEquals(this, result)) if (ReferenceEquals(this, result))
{ {
var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
StrictlyUpperTriangle(tmp); StrictlyUpperTriangle(tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }

2
src/Numerics/LinearAlgebra/Complex32/Factorization/UserEvd.cs

@ -74,7 +74,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Factorization
// Initialize matricies for eigenvalues and eigenvectors // Initialize matricies for eigenvalues and eigenvectors
var eigenVectors = DenseMatrix.CreateIdentity(order); var eigenVectors = DenseMatrix.CreateIdentity(order);
var blockDiagonal = matrix.CreateMatrix(order, order); var blockDiagonal = Matrix<Complex32>.Build.SameAs(matrix, order, order);
var eigenValues = new LinearAlgebra.Complex.DenseVector(order); var eigenValues = new LinearAlgebra.Complex.DenseVector(order);
var isSymmetric = true; var isSymmetric = true;

2
src/Numerics/LinearAlgebra/Complex32/Factorization/UserGramSchmidt.cs

@ -60,7 +60,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Factorization
} }
var q = matrix.Clone(); var q = matrix.Clone();
var r = matrix.CreateMatrix(matrix.ColumnCount, matrix.ColumnCount); var r = Matrix<Complex32>.Build.SameAs(matrix, matrix.ColumnCount, matrix.ColumnCount);
for (var k = 0; k < q.ColumnCount; k++) for (var k = 0; k < q.ColumnCount; k++)
{ {

2
src/Numerics/LinearAlgebra/Complex32/Factorization/UserLU.cs

@ -297,7 +297,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Factorization
public override Matrix<Complex32> Inverse() public override Matrix<Complex32> Inverse()
{ {
var order = Factors.RowCount; var order = Factors.RowCount;
var inverse = Factors.CreateMatrix(order, order); var inverse = Matrix<Complex32>.Build.SameAs(Factors, order, order);
for (var i = 0; i < order; i++) for (var i = 0; i < order; i++)
{ {
inverse.At(i, i, 1.0f); inverse.At(i, i, 1.0f);

2
src/Numerics/LinearAlgebra/Complex32/Factorization/UserQR.cs

@ -72,7 +72,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Factorization
if (method == QRMethod.Full) if (method == QRMethod.Full)
{ {
r = matrix.Clone(); r = matrix.Clone();
q = matrix.CreateMatrix(matrix.RowCount, matrix.RowCount); q = Matrix<Complex32>.Build.SameAs(matrix, matrix.RowCount, matrix.RowCount);
for (var i = 0; i < matrix.RowCount; i++) for (var i = 0; i < matrix.RowCount; i++)
{ {

8
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 nm = Math.Min(matrix.RowCount + 1, matrix.ColumnCount);
var matrixCopy = matrix.Clone(); var matrixCopy = matrix.Clone();
var s = matrixCopy.CreateVector(nm); var s = Vector<Complex32>.Build.SameAs(matrixCopy, nm);
var u = matrixCopy.CreateMatrix(matrixCopy.RowCount, matrixCopy.RowCount); var u = Matrix<Complex32>.Build.SameAs(matrixCopy, matrixCopy.RowCount, matrixCopy.RowCount);
var vt = matrixCopy.CreateMatrix(matrixCopy.ColumnCount, matrixCopy.ColumnCount); var vt = Matrix<Complex32>.Build.SameAs(matrixCopy, matrixCopy.ColumnCount, matrixCopy.ColumnCount);
const int maxiter = 1000; const int maxiter = 1000;
var e = new Complex32[matrixCopy.ColumnCount]; var e = new Complex32[matrixCopy.ColumnCount];
@ -587,7 +587,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32.Factorization
if (matrixCopy.RowCount < matrixCopy.ColumnCount) if (matrixCopy.RowCount < matrixCopy.ColumnCount)
{ {
nm--; nm--;
var tmp = matrixCopy.CreateVector(nm); var tmp = Vector<Complex32>.Build.SameAs(matrixCopy, nm);
for (i = 0; i < nm; i++) for (i = 0; i < nm; i++)
{ {
tmp[i] = s[i]; tmp[i] = s[i];

2
src/Numerics/LinearAlgebra/Complex32/Matrix.cs

@ -106,7 +106,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// <returns>The conjugate transpose of this matrix.</returns> /// <returns>The conjugate transpose of this matrix.</returns>
public override Matrix<Complex32> ConjugateTranspose() public override Matrix<Complex32> ConjugateTranspose()
{ {
var ret = CreateMatrix(ColumnCount, RowCount); var ret = Build.SameAs(this, ColumnCount, RowCount);
for (var j = 0; j < ColumnCount; j++) for (var j = 0; j < ColumnCount; j++)
{ {
for (var i = 0; i < RowCount; i++) for (var i = 0; i < RowCount; i++)

16
src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs

@ -377,7 +377,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// <returns>The lower triangle of this matrix.</returns> /// <returns>The lower triangle of this matrix.</returns>
public override Matrix<Complex32> LowerTriangle() public override Matrix<Complex32> LowerTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
LowerTriangleImpl(result); LowerTriangleImpl(result);
return result; return result;
} }
@ -402,7 +402,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
if (ReferenceEquals(this, result)) if (ReferenceEquals(this, result))
{ {
var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
LowerTriangle(tmp); LowerTriangle(tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
@ -442,7 +442,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// <returns>The upper triangle of this matrix.</returns> /// <returns>The upper triangle of this matrix.</returns>
public override Matrix<Complex32> UpperTriangle() public override Matrix<Complex32> UpperTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
UpperTriangleImpl(result); UpperTriangleImpl(result);
return result; return result;
} }
@ -467,7 +467,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
if (ReferenceEquals(this, result)) if (ReferenceEquals(this, result))
{ {
var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
UpperTriangle(tmp); UpperTriangle(tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
@ -508,7 +508,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// <returns>The lower triangle of this matrix.</returns> /// <returns>The lower triangle of this matrix.</returns>
public override Matrix<Complex32> StrictlyLowerTriangle() public override Matrix<Complex32> StrictlyLowerTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
StrictlyLowerTriangleImpl(result); StrictlyLowerTriangleImpl(result);
return result; return result;
} }
@ -533,7 +533,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
if (ReferenceEquals(this, result)) if (ReferenceEquals(this, result))
{ {
var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
StrictlyLowerTriangle(tmp); StrictlyLowerTriangle(tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
@ -574,7 +574,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
/// <returns>The upper triangle of this matrix.</returns> /// <returns>The upper triangle of this matrix.</returns>
public override Matrix<Complex32> StrictlyUpperTriangle() public override Matrix<Complex32> StrictlyUpperTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
StrictlyUpperTriangleImpl(result); StrictlyUpperTriangleImpl(result);
return result; return result;
} }
@ -599,7 +599,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
if (ReferenceEquals(this, result)) if (ReferenceEquals(this, result))
{ {
var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
StrictlyUpperTriangle(tmp); StrictlyUpperTriangle(tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }

4
src/Numerics/LinearAlgebra/Double/Factorization/UserEvd.cs

@ -74,8 +74,8 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Factorization
var order = matrix.RowCount; var order = matrix.RowCount;
// Initialize matricies for eigenvalues and eigenvectors // Initialize matricies for eigenvalues and eigenvectors
var eigenVectors = matrix.CreateMatrix(order, order); var eigenVectors = Matrix<double>.Build.SameAs(matrix, order, order);
var blockDiagonal = matrix.CreateMatrix(order, order); var blockDiagonal = Matrix<double>.Build.SameAs(matrix, order, order);
var eigenValues = new LinearAlgebra.Complex.DenseVector(order); var eigenValues = new LinearAlgebra.Complex.DenseVector(order);
var isSymmetric = true; var isSymmetric = true;

2
src/Numerics/LinearAlgebra/Double/Factorization/UserGramSchmidt.cs

@ -58,7 +58,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Factorization
} }
var q = matrix.Clone(); var q = matrix.Clone();
var r = matrix.CreateMatrix(matrix.ColumnCount, matrix.ColumnCount); var r = Matrix<double>.Build.SameAs(matrix, matrix.ColumnCount, matrix.ColumnCount);
for (var k = 0; k < q.ColumnCount; k++) for (var k = 0; k < q.ColumnCount; k++)
{ {

2
src/Numerics/LinearAlgebra/Double/Factorization/UserLU.cs

@ -295,7 +295,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Factorization
public override Matrix<double> Inverse() public override Matrix<double> Inverse()
{ {
var order = Factors.RowCount; var order = Factors.RowCount;
var inverse = Factors.CreateMatrix(order, order); var inverse = Matrix<double>.Build.SameAs(Factors, order, order);
for (var i = 0; i < order; i++) for (var i = 0; i < order; i++)
{ {
inverse.At(i, i, 1.0); inverse.At(i, i, 1.0);

2
src/Numerics/LinearAlgebra/Double/Factorization/UserQR.cs

@ -70,7 +70,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Factorization
if (method == QRMethod.Full) if (method == QRMethod.Full)
{ {
r = matrix.Clone(); r = matrix.Clone();
q = matrix.CreateMatrix(matrix.RowCount, matrix.RowCount); q = Matrix<double>.Build.SameAs(matrix, matrix.RowCount, matrix.RowCount);
for (var i = 0; i < matrix.RowCount; i++) for (var i = 0; i < matrix.RowCount; i++)
{ {

8
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 nm = Math.Min(matrix.RowCount + 1, matrix.ColumnCount);
var matrixCopy = matrix.Clone(); var matrixCopy = matrix.Clone();
var s = matrixCopy.CreateVector(nm); var s = Vector<double>.Build.SameAs(matrixCopy, nm);
var u = matrixCopy.CreateMatrix(matrixCopy.RowCount, matrixCopy.RowCount); var u = Matrix<double>.Build.SameAs(matrixCopy, matrixCopy.RowCount, matrixCopy.RowCount);
var vt = matrixCopy.CreateMatrix(matrixCopy.ColumnCount, matrixCopy.ColumnCount); var vt = Matrix<double>.Build.SameAs(matrixCopy, matrixCopy.ColumnCount, matrixCopy.ColumnCount);
const int maxiter = 1000; const int maxiter = 1000;
var e = new double[matrixCopy.ColumnCount]; var e = new double[matrixCopy.ColumnCount];
@ -570,7 +570,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double.Factorization
if (matrixCopy.RowCount < matrixCopy.ColumnCount) if (matrixCopy.RowCount < matrixCopy.ColumnCount)
{ {
nm--; nm--;
var tmp = matrixCopy.CreateVector(nm); var tmp = Vector<double>.Build.SameAs(matrixCopy, nm);
for (i = 0; i < nm; i++) for (i = 0; i < nm; i++)
{ {
tmp[i] = s[i]; tmp[i] = s[i];

16
src/Numerics/LinearAlgebra/Double/SparseMatrix.cs

@ -375,7 +375,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <returns>The lower triangle of this matrix.</returns> /// <returns>The lower triangle of this matrix.</returns>
public override Matrix<double> LowerTriangle() public override Matrix<double> LowerTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
LowerTriangleImpl(result); LowerTriangleImpl(result);
return result; return result;
} }
@ -400,7 +400,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
if (ReferenceEquals(this, result)) if (ReferenceEquals(this, result))
{ {
var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
LowerTriangle(tmp); LowerTriangle(tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
@ -440,7 +440,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <returns>The upper triangle of this matrix.</returns> /// <returns>The upper triangle of this matrix.</returns>
public override Matrix<double> UpperTriangle() public override Matrix<double> UpperTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
UpperTriangleImpl(result); UpperTriangleImpl(result);
return result; return result;
} }
@ -465,7 +465,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
if (ReferenceEquals(this, result)) if (ReferenceEquals(this, result))
{ {
var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
UpperTriangle(tmp); UpperTriangle(tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
@ -506,7 +506,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <returns>The lower triangle of this matrix.</returns> /// <returns>The lower triangle of this matrix.</returns>
public override Matrix<double> StrictlyLowerTriangle() public override Matrix<double> StrictlyLowerTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
StrictlyLowerTriangleImpl(result); StrictlyLowerTriangleImpl(result);
return result; return result;
} }
@ -531,7 +531,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
if (ReferenceEquals(this, result)) if (ReferenceEquals(this, result))
{ {
var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
StrictlyLowerTriangle(tmp); StrictlyLowerTriangle(tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
@ -572,7 +572,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
/// <returns>The upper triangle of this matrix.</returns> /// <returns>The upper triangle of this matrix.</returns>
public override Matrix<double> StrictlyUpperTriangle() public override Matrix<double> StrictlyUpperTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
StrictlyUpperTriangleImpl(result); StrictlyUpperTriangleImpl(result);
return result; return result;
} }
@ -597,7 +597,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
if (ReferenceEquals(this, result)) if (ReferenceEquals(this, result))
{ {
var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
StrictlyUpperTriangle(tmp); StrictlyUpperTriangle(tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }

4
src/Numerics/LinearAlgebra/Factorization/Cholesky.cs

@ -72,7 +72,7 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization
/// <returns>The left hand side <see cref="Matrix{T}"/>, <b>X</b>.</returns> /// <returns>The left hand side <see cref="Matrix{T}"/>, <b>X</b>.</returns>
public virtual Matrix<T> Solve(Matrix<T> input) public virtual Matrix<T> Solve(Matrix<T> input)
{ {
var x = input.CreateMatrix(input.RowCount, input.ColumnCount); var x = Matrix<T>.Build.SameAs(input, input.RowCount, input.ColumnCount);
Solve(input, x); Solve(input, x);
return x; return x;
} }
@ -91,7 +91,7 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization
/// <returns>The left hand side <see cref="Vector{T}"/>, <b>x</b>.</returns> /// <returns>The left hand side <see cref="Vector{T}"/>, <b>x</b>.</returns>
public virtual Vector<T> Solve(Vector<T> input) public virtual Vector<T> Solve(Vector<T> input)
{ {
var x = input.CreateVector(input.Count); var x = Vector<T>.Build.SameAs(input, input.Count);
Solve(input, x); Solve(input, x);
return x; return x;
} }

8
src/Numerics/LinearAlgebra/Factorization/Evd.cs

@ -109,9 +109,9 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization
/// <returns>The left hand side <see cref="Matrix{T}"/>, <b>X</b>.</returns> /// <returns>The left hand side <see cref="Matrix{T}"/>, <b>X</b>.</returns>
public virtual Matrix<T> Solve(Matrix<T> input) public virtual Matrix<T> Solve(Matrix<T> input)
{ {
var result = EigenVectors.CreateMatrix(EigenVectors.ColumnCount, input.ColumnCount); var x = Matrix<T>.Build.SameAs(EigenVectors, EigenVectors.ColumnCount, input.ColumnCount);
Solve(input, result); Solve(input, x);
return result; return x;
} }
/// <summary> /// <summary>
@ -128,7 +128,7 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization
/// <returns>The left hand side <see cref="Vector{T}"/>, <b>x</b>.</returns> /// <returns>The left hand side <see cref="Vector{T}"/>, <b>x</b>.</returns>
public virtual Vector<T> Solve(Vector<T> input) public virtual Vector<T> Solve(Vector<T> input)
{ {
var x = EigenVectors.CreateVector(EigenVectors.ColumnCount); var x = Vector<T>.Build.SameAs(EigenVectors, EigenVectors.ColumnCount);
Solve(input, x); Solve(input, x);
return x; return x;
} }

4
src/Numerics/LinearAlgebra/Factorization/LU.cs

@ -111,7 +111,7 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization
/// <returns>The left hand side <see cref="Matrix{T}"/>, <b>X</b>.</returns> /// <returns>The left hand side <see cref="Matrix{T}"/>, <b>X</b>.</returns>
public virtual Matrix<T> Solve(Matrix<T> input) public virtual Matrix<T> Solve(Matrix<T> input)
{ {
var x = input.CreateMatrix(input.RowCount, input.ColumnCount); var x = Matrix<T>.Build.SameAs(input, input.RowCount, input.ColumnCount);
Solve(input, x); Solve(input, x);
return x; return x;
} }
@ -130,7 +130,7 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization
/// <returns>The left hand side <see cref="Vector{T}"/>, <b>x</b>.</returns> /// <returns>The left hand side <see cref="Vector{T}"/>, <b>x</b>.</returns>
public virtual Vector<T> Solve(Vector<T> input) public virtual Vector<T> Solve(Vector<T> input)
{ {
var x = input.CreateVector(input.Count); var x = Vector<T>.Build.SameAs(input, input.Count);
Solve(input, x); Solve(input, x);
return x; return x;
} }

8
src/Numerics/LinearAlgebra/Factorization/QR.cs

@ -109,9 +109,9 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization
/// <returns>The left hand side <see cref="Matrix{T}"/>, <b>X</b>.</returns> /// <returns>The left hand side <see cref="Matrix{T}"/>, <b>X</b>.</returns>
public virtual Matrix<T> Solve(Matrix<T> input) public virtual Matrix<T> Solve(Matrix<T> input)
{ {
var matrixX = input.CreateMatrix(FullR.ColumnCount, input.ColumnCount); var x = Matrix<T>.Build.SameAs(input, FullR.ColumnCount, input.ColumnCount);
Solve(input, matrixX); Solve(input, x);
return matrixX; return x;
} }
/// <summary> /// <summary>
@ -128,7 +128,7 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization
/// <returns>The left hand side <see cref="Vector{T}"/>, <b>x</b>.</returns> /// <returns>The left hand side <see cref="Vector{T}"/>, <b>x</b>.</returns>
public virtual Vector<T> Solve(Vector<T> input) public virtual Vector<T> Solve(Vector<T> input)
{ {
var x = input.CreateVector(FullR.ColumnCount); var x = Vector<T>.Build.SameAs(input, FullR.ColumnCount);
Solve(input, x); Solve(input, x);
return x; return x;
} }

10
src/Numerics/LinearAlgebra/Factorization/Svd.cs

@ -71,7 +71,7 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization
{ {
var rows = U.RowCount; var rows = U.RowCount;
var columns = VT.ColumnCount; var columns = VT.ColumnCount;
var result = U.CreateMatrix(rows, columns); var result = Matrix<T>.Build.SameAs(U, rows, columns);
for (var i = 0; i < rows; i++) for (var i = 0; i < rows; i++)
{ {
for (var j = 0; j < columns; j++) for (var j = 0; j < columns; j++)
@ -145,9 +145,9 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization
throw new InvalidOperationException(Resources.SingularVectorsNotComputed); throw new InvalidOperationException(Resources.SingularVectorsNotComputed);
} }
var result = U.CreateMatrix(VT.ColumnCount, input.ColumnCount); var x = Matrix<T>.Build.SameAs(U, VT.ColumnCount, input.ColumnCount);
Solve(input, result); Solve(input, x);
return result; return x;
} }
/// <summary> /// <summary>
@ -169,7 +169,7 @@ namespace MathNet.Numerics.LinearAlgebra.Factorization
throw new InvalidOperationException(Resources.SingularVectorsNotComputed); throw new InvalidOperationException(Resources.SingularVectorsNotComputed);
} }
var x = U.CreateVector(VT.ColumnCount); var x = Vector<T>.Build.SameAs(U, VT.ColumnCount);
Solve(input, x); Solve(input, x);
return x; return x;
} }

62
src/Numerics/LinearAlgebra/Matrix.Arithmetic.cs

@ -204,7 +204,7 @@ namespace MathNet.Numerics.LinearAlgebra
return Clone(); return Clone();
} }
var result = Build.SameType(this, RowCount, ColumnCount); var result = Build.SameAs(this);
DoAdd(scalar, result); DoAdd(scalar, result);
return result; return result;
} }
@ -244,7 +244,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw DimensionsDontMatch<ArgumentOutOfRangeException>(this, other); throw DimensionsDontMatch<ArgumentOutOfRangeException>(this, other);
} }
var result = Build.SameType(this, other, RowCount, ColumnCount); var result = Build.SameAs(this, other, RowCount, ColumnCount);
DoAdd(other, result); DoAdd(other, result);
return result; return result;
} }
@ -282,7 +282,7 @@ namespace MathNet.Numerics.LinearAlgebra
return Clone(); return Clone();
} }
var result = Build.SameType(this, RowCount, ColumnCount); var result = Build.SameAs(this);
DoSubtract(scalar, result); DoSubtract(scalar, result);
return result; return result;
} }
@ -316,7 +316,7 @@ namespace MathNet.Numerics.LinearAlgebra
/// <returns>A new matrix containing the subtraction of the scalar and this matrix.</returns> /// <returns>A new matrix containing the subtraction of the scalar and this matrix.</returns>
public Matrix<T> SubtractFrom(T scalar) public Matrix<T> SubtractFrom(T scalar)
{ {
var result = Build.SameType(this, RowCount, ColumnCount); var result = Build.SameAs(this);
DoSubtractFrom(scalar, result); DoSubtractFrom(scalar, result);
return result; return result;
} }
@ -350,7 +350,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw DimensionsDontMatch<ArgumentOutOfRangeException>(this, other); throw DimensionsDontMatch<ArgumentOutOfRangeException>(this, other);
} }
var result = Build.SameType(this, other, RowCount, ColumnCount); var result = Build.SameAs(this, other, RowCount, ColumnCount);
DoSubtract(other, result); DoSubtract(other, result);
return result; return result;
} }
@ -390,10 +390,10 @@ namespace MathNet.Numerics.LinearAlgebra
if (scalar.Equals(Zero)) 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); DoMultiply(scalar, result);
return result; return result;
} }
@ -448,7 +448,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw new DivideByZeroException(); throw new DivideByZeroException();
} }
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
DoDivide(scalar, result); DoDivide(scalar, result);
return result; return result;
} }
@ -492,7 +492,7 @@ namespace MathNet.Numerics.LinearAlgebra
/// <returns>The result of the division.</returns> /// <returns>The result of the division.</returns>
public Matrix<T> DivideByThis(T scalar) public Matrix<T> DivideByThis(T scalar)
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
DoDivideByThis(scalar, result); DoDivideByThis(scalar, result);
return result; return result;
} }
@ -531,7 +531,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw DimensionsDontMatch<ArgumentException>(this, rightSide, "rightSide"); throw DimensionsDontMatch<ArgumentException>(this, rightSide, "rightSide");
} }
var ret = CreateVector(RowCount); var ret = Vector<T>.Build.SameAs(this, RowCount);
DoMultiply(rightSide, ret); DoMultiply(rightSide, ret);
return ret; return ret;
} }
@ -580,7 +580,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw DimensionsDontMatch<ArgumentException>(this, leftSide, "leftSide"); throw DimensionsDontMatch<ArgumentException>(this, leftSide, "leftSide");
} }
var ret = CreateVector(ColumnCount); var ret = Vector<T>.Build.SameAs(this, ColumnCount);
DoLeftMultiply(leftSide, ret); DoLeftMultiply(leftSide, ret);
return ret; return ret;
} }
@ -642,7 +642,7 @@ namespace MathNet.Numerics.LinearAlgebra
if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) if (ReferenceEquals(this, result) || ReferenceEquals(other, result))
{ {
var tmp = Build.SameType(result, result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
DoMultiply(other, tmp); DoMultiply(other, tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
@ -665,7 +665,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw DimensionsDontMatch<ArgumentException>(this, other); throw DimensionsDontMatch<ArgumentException>(this, other);
} }
var result = Build.SameType(this, other, RowCount, other.ColumnCount); var result = Build.SameAs(this, other, RowCount, other.ColumnCount);
DoMultiply(other, result); DoMultiply(other, result);
return result; return result;
} }
@ -686,7 +686,7 @@ namespace MathNet.Numerics.LinearAlgebra
if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) if (ReferenceEquals(this, result) || ReferenceEquals(other, result))
{ {
var tmp = Build.SameType(result, result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
DoTransposeAndMultiply(other, tmp); DoTransposeAndMultiply(other, tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
@ -709,7 +709,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw DimensionsDontMatch<ArgumentException>(this, other); throw DimensionsDontMatch<ArgumentException>(this, other);
} }
var result = Build.SameType(this, other, RowCount, other.RowCount); var result = Build.SameAs(this, other, RowCount, other.RowCount);
DoTransposeAndMultiply(other, result); DoTransposeAndMultiply(other, result);
return result; return result;
} }
@ -727,7 +727,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw DimensionsDontMatch<ArgumentException>(this, rightSide, "rightSide"); throw DimensionsDontMatch<ArgumentException>(this, rightSide, "rightSide");
} }
var result = CreateVector(ColumnCount); var result = Vector<T>.Build.SameAs(this, ColumnCount);
DoTransposeThisAndMultiply(rightSide, result); DoTransposeThisAndMultiply(rightSide, result);
return result; return result;
} }
@ -779,7 +779,7 @@ namespace MathNet.Numerics.LinearAlgebra
if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) if (ReferenceEquals(this, result) || ReferenceEquals(other, result))
{ {
var tmp = Build.SameType(result, result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
DoTransposeThisAndMultiply(other, tmp); DoTransposeThisAndMultiply(other, tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
@ -802,7 +802,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw DimensionsDontMatch<ArgumentException>(this, other); throw DimensionsDontMatch<ArgumentException>(this, other);
} }
var result = Build.SameType(this, other, ColumnCount, other.ColumnCount); var result = Build.SameAs(this, other, ColumnCount, other.ColumnCount);
DoTransposeThisAndMultiply(other, result); DoTransposeThisAndMultiply(other, result);
return result; return result;
} }
@ -813,7 +813,7 @@ namespace MathNet.Numerics.LinearAlgebra
/// <returns>A matrix containing the negated values.</returns> /// <returns>A matrix containing the negated values.</returns>
public Matrix<T> Negate() public Matrix<T> Negate()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
DoNegate(result); DoNegate(result);
return result; return result;
} }
@ -839,7 +839,7 @@ namespace MathNet.Numerics.LinearAlgebra
/// <returns>A matrix containing the conjugated values.</returns> /// <returns>A matrix containing the conjugated values.</returns>
public Matrix<T> Conjugate() public Matrix<T> Conjugate()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
DoConjugate(result); DoConjugate(result);
return result; return result;
} }
@ -866,7 +866,7 @@ namespace MathNet.Numerics.LinearAlgebra
/// <returns>A matrix containing the results.</returns> /// <returns>A matrix containing the results.</returns>
public Matrix<T> Modulus(T divisor) public Matrix<T> Modulus(T divisor)
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
DoModulus(divisor, result); DoModulus(divisor, result);
return result; return result;
} }
@ -893,7 +893,7 @@ namespace MathNet.Numerics.LinearAlgebra
/// <returns>A matrix containing the results.</returns> /// <returns>A matrix containing the results.</returns>
public Matrix<T> ModulusByThis(T dividend) public Matrix<T> ModulusByThis(T dividend)
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
DoModulusByThis(dividend, result); DoModulusByThis(dividend, result);
return result; return result;
} }
@ -926,7 +926,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw DimensionsDontMatch<ArgumentException>(this, other, "other"); throw DimensionsDontMatch<ArgumentException>(this, other, "other");
} }
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
DoPointwiseMultiply(other, result); DoPointwiseMultiply(other, result);
return result; return result;
} }
@ -961,7 +961,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw DimensionsDontMatch<ArgumentException>(this, divisor); throw DimensionsDontMatch<ArgumentException>(this, divisor);
} }
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
DoPointwiseDivide(divisor, result); DoPointwiseDivide(divisor, result);
return result; return result;
} }
@ -996,7 +996,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw DimensionsDontMatch<ArgumentException>(this, divisor); throw DimensionsDontMatch<ArgumentException>(this, divisor);
} }
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
DoPointwiseModulus(divisor, result); DoPointwiseModulus(divisor, result);
return result; return result;
} }
@ -1074,7 +1074,7 @@ namespace MathNet.Numerics.LinearAlgebra
/// <returns>The kronecker product of the two matrices.</returns> /// <returns>The kronecker product of the two matrices.</returns>
public Matrix<T> KroneckerProduct(Matrix<T> other) public Matrix<T> KroneckerProduct(Matrix<T> other)
{ {
var result = CreateMatrix(RowCount*other.RowCount, ColumnCount*other.ColumnCount); var result = Build.SameAs(this, RowCount*other.RowCount, ColumnCount*other.ColumnCount);
KroneckerProduct(other, result); KroneckerProduct(other, result);
return result; return result;
} }
@ -1115,14 +1115,13 @@ namespace MathNet.Numerics.LinearAlgebra
throw new ArgumentOutOfRangeException("p", Resources.ArgumentMustBePositive); throw new ArgumentOutOfRangeException("p", Resources.ArgumentMustBePositive);
} }
var ret = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
for (var index = 0; index < ColumnCount; index++) 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;
} }
/// <summary> /// <summary>
@ -1138,8 +1137,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw new ArgumentOutOfRangeException("p", Resources.ArgumentMustBePositive); throw new ArgumentOutOfRangeException("p", Resources.ArgumentMustBePositive);
} }
var ret = CreateMatrix(RowCount, ColumnCount); var ret = Build.SameAs(this);
for (var index = 0; index < RowCount; index++) for (var index = 0; index < RowCount; index++)
{ {
ret.SetRow(index, Row(index).Normalize(p)); ret.SetRow(index, Row(index).Normalize(p));

8
src/Numerics/LinearAlgebra/Matrix.Solve.cs

@ -127,9 +127,9 @@ namespace MathNet.Numerics.LinearAlgebra
/// <returns>The left hand side <see cref="Matrix{T}"/>, <b>X</b>.</returns> /// <returns>The left hand side <see cref="Matrix{T}"/>, <b>X</b>.</returns>
public Matrix<T> Solve(Matrix<T> input) public Matrix<T> Solve(Matrix<T> input)
{ {
var matrixX = CreateMatrix(ColumnCount, input.ColumnCount); var x = Build.SameAs(this, ColumnCount, input.ColumnCount);
Solve(input, matrixX); Solve(input, x);
return matrixX; return x;
} }
@ -140,7 +140,7 @@ namespace MathNet.Numerics.LinearAlgebra
/// <returns>The left hand side <see cref="Vector{T}"/>, <b>x</b>.</returns> /// <returns>The left hand side <see cref="Vector{T}"/>, <b>x</b>.</returns>
public Vector<T> Solve(Vector<T> input) public Vector<T> Solve(Vector<T> input)
{ {
var x = CreateVector(ColumnCount); var x = Vector<T>.Build.SameAs(this, ColumnCount);
Solve(input, x); Solve(input, x);
return x; return x;
} }

84
src/Numerics/LinearAlgebra/Matrix.cs

@ -204,7 +204,7 @@ namespace MathNet.Numerics.LinearAlgebra
/// </returns> /// </returns>
public Matrix<T> Clone() public Matrix<T> Clone()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
Storage.CopyToUnchecked(result.Storage, skipClearing: true); Storage.CopyToUnchecked(result.Storage, skipClearing: true);
return result; return result;
} }
@ -231,31 +231,6 @@ namespace MathNet.Numerics.LinearAlgebra
Storage.CopyTo(target.Storage); Storage.CopyTo(target.Storage);
} }
/// <summary>
/// Create a matrix of the same kind for the given number of rows and columns.
/// </summary>
/// <param name="rows">The number of rows.</param>
/// <param name="columns">The number of columns.</param>
/// <remarks>Creates a matrix of the same matrix type as the current matrix.</remarks>
public Matrix<T> CreateMatrix(int rows, int columns)
{
return Storage.IsDense
? Build.Dense(rows, columns)
: Build.Sparse(rows, columns);
}
/// <summary>
/// Create a vector of the same kind with the given size.
/// </summary>
/// <param name="size">The size of the vector.</param>
/// <remarks>Creates a vector of the same type as the current matrix.</remarks>
public Vector<T> CreateVector(int size)
{
return Storage.IsDense
? Vector<T>.Build.Dense(size)
: Vector<T>.Build.Sparse(size);
}
/// <summary> /// <summary>
/// Copies a row into an Vector. /// Copies a row into an Vector.
/// </summary> /// </summary>
@ -270,7 +245,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw new ArgumentOutOfRangeException("index"); throw new ArgumentOutOfRangeException("index");
} }
var ret = CreateVector(ColumnCount); var ret = Vector<T>.Build.SameAs(this, ColumnCount);
Storage.CopySubRowToUnchecked(ret.Storage, index, 0, 0, ColumnCount); Storage.CopySubRowToUnchecked(ret.Storage, index, 0, 0, ColumnCount);
return ret; return ret;
} }
@ -310,7 +285,7 @@ namespace MathNet.Numerics.LinearAlgebra
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="length"/> is not positive.</exception> /// <exception cref="ArgumentOutOfRangeException">If <paramref name="length"/> is not positive.</exception>
public Vector<T> Row(int rowIndex, int columnIndex, int length) public Vector<T> Row(int rowIndex, int columnIndex, int length)
{ {
var ret = CreateVector(length); var ret = Vector<T>.Build.SameAs(this, length);
Storage.CopySubRowTo(ret.Storage, rowIndex, columnIndex, 0, length); Storage.CopySubRowTo(ret.Storage, rowIndex, columnIndex, 0, length);
return ret; return ret;
} }
@ -355,7 +330,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw new ArgumentOutOfRangeException("index"); throw new ArgumentOutOfRangeException("index");
} }
var ret = CreateVector(RowCount); var ret = Vector<T>.Build.SameAs(this, RowCount);
Storage.CopySubColumnToUnchecked(ret.Storage, index, 0, 0, RowCount); Storage.CopySubColumnToUnchecked(ret.Storage, index, 0, 0, RowCount);
return ret; return ret;
} }
@ -396,7 +371,7 @@ namespace MathNet.Numerics.LinearAlgebra
/// <exception cref="ArgumentOutOfRangeException">If <paramref name="length"/> is not positive.</exception> /// <exception cref="ArgumentOutOfRangeException">If <paramref name="length"/> is not positive.</exception>
public Vector<T> Column(int columnIndex, int rowIndex, int length) public Vector<T> Column(int columnIndex, int rowIndex, int length)
{ {
var ret = CreateVector(length); var ret = Vector<T>.Build.SameAs(this, length);
Storage.CopySubColumnTo(ret.Storage, columnIndex, rowIndex, 0, length); Storage.CopySubColumnTo(ret.Storage, columnIndex, rowIndex, 0, length);
return ret; return ret;
} }
@ -433,17 +408,15 @@ namespace MathNet.Numerics.LinearAlgebra
/// <returns>The upper triangle of this matrix.</returns> /// <returns>The upper triangle of this matrix.</returns>
public virtual Matrix<T> UpperTriangle() public virtual Matrix<T> UpperTriangle()
{ {
var ret = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
for (var row = 0; row < RowCount; row++) for (var row = 0; row < RowCount; row++)
{ {
for (var column = row; column < ColumnCount; column++) for (var column = row; column < ColumnCount; column++)
{ {
ret.At(row, column, At(row, column)); result.At(row, column, At(row, column));
} }
} }
return result;
return ret;
} }
/// <summary> /// <summary>
@ -452,17 +425,15 @@ namespace MathNet.Numerics.LinearAlgebra
/// <returns>The lower triangle of this matrix.</returns> /// <returns>The lower triangle of this matrix.</returns>
public virtual Matrix<T> LowerTriangle() public virtual Matrix<T> LowerTriangle()
{ {
var ret = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
for (var row = 0; row < RowCount; row++) for (var row = 0; row < RowCount; row++)
{ {
for (var column = 0; column <= row && column < ColumnCount; column++) for (var column = 0; column <= row && column < ColumnCount; column++)
{ {
ret.At(row, column, At(row, column)); result.At(row, column, At(row, column));
} }
} }
return result;
return ret;
} }
/// <summary> /// <summary>
@ -537,9 +508,9 @@ namespace MathNet.Numerics.LinearAlgebra
/// is not positive.</exception> /// is not positive.</exception>
public virtual Matrix<T> SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount) public virtual Matrix<T> SubMatrix(int rowIndex, int rowCount, int columnIndex, int columnCount)
{ {
var target = CreateMatrix(rowCount, columnCount); var result = Build.SameAs(this, rowCount, columnCount);
Storage.CopySubMatrixTo(target.Storage, rowIndex, 0, rowCount, columnIndex, 0, columnCount, skipClearing: true); Storage.CopySubMatrixTo(result.Storage, rowIndex, 0, rowCount, columnIndex, 0, columnCount, skipClearing: true);
return target; return result;
} }
/// <summary> /// <summary>
@ -551,7 +522,7 @@ namespace MathNet.Numerics.LinearAlgebra
public virtual Vector<T> Diagonal() public virtual Vector<T> Diagonal()
{ {
var min = Math.Min(RowCount, ColumnCount); var min = Math.Min(RowCount, ColumnCount);
var diagonal = CreateVector(min); var diagonal = Vector<T>.Build.SameAs(this, min);
for (var i = 0; i < min; i++) for (var i = 0; i < min; i++)
{ {
@ -568,8 +539,7 @@ namespace MathNet.Numerics.LinearAlgebra
/// <returns>The lower triangle of this matrix.</returns> /// <returns>The lower triangle of this matrix.</returns>
public virtual Matrix<T> StrictlyLowerTriangle() public virtual Matrix<T> StrictlyLowerTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
for (var row = 0; row < RowCount; row++) for (var row = 0; row < RowCount; row++)
{ {
for (var column = 0; column < row; column++) for (var column = 0; column < row; column++)
@ -577,7 +547,6 @@ namespace MathNet.Numerics.LinearAlgebra
result.At(row, column, At(row, column)); result.At(row, column, At(row, column));
} }
} }
return result; return result;
} }
@ -615,8 +584,7 @@ namespace MathNet.Numerics.LinearAlgebra
/// <returns>The upper triangle of this matrix.</returns> /// <returns>The upper triangle of this matrix.</returns>
public virtual Matrix<T> StrictlyUpperTriangle() public virtual Matrix<T> StrictlyUpperTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
for (var row = 0; row < RowCount; row++) for (var row = 0; row < RowCount; row++)
{ {
for (var column = row + 1; column < ColumnCount; column++) for (var column = row + 1; column < ColumnCount; column++)
@ -624,7 +592,6 @@ namespace MathNet.Numerics.LinearAlgebra
result.At(row, column, At(row, column)); result.At(row, column, At(row, column));
} }
} }
return result; return result;
} }
@ -681,7 +648,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw new ArgumentException(Resources.ArgumentMatrixSameRowDimension, "column"); 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++) for (var i = 0; i < columnIndex; i++)
{ {
@ -788,7 +755,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw new ArgumentException(Resources.ArgumentMatrixSameRowDimension, "row"); 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++) for (var i = 0; i < rowIndex; i++)
{ {
@ -997,16 +964,15 @@ namespace MathNet.Numerics.LinearAlgebra
/// <returns>The transpose of this matrix.</returns> /// <returns>The transpose of this matrix.</returns>
public virtual Matrix<T> Transpose() public virtual Matrix<T> Transpose()
{ {
var ret = CreateMatrix(ColumnCount, RowCount); var result = Build.SameAs(this, ColumnCount, RowCount);
for (var j = 0; j < ColumnCount; j++) for (var j = 0; j < ColumnCount; j++)
{ {
for (var i = 0; i < RowCount; i++) for (var i = 0; i < RowCount; i++)
{ {
ret.At(j, i, At(i, j)); result.At(j, i, At(i, j));
} }
} }
return result;
return ret;
} }
/// <summary> /// <summary>
@ -1092,7 +1058,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw new ArgumentException(Resources.ArgumentMatrixSameRowDimension); 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); 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); right.Storage.CopySubMatrixToUnchecked(result.Storage, 0, 0, right.RowCount, 0, ColumnCount, right.ColumnCount, skipClearing: true);
return result; return result;
@ -1152,7 +1118,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw new ArgumentException(Resources.ArgumentMatrixSameColumnDimension, "lower"); 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); 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); lower.Storage.CopySubMatrixToUnchecked(result.Storage, 0, RowCount, lower.RowCount, 0, 0, lower.ColumnCount, skipClearing: true);
return result; return result;
@ -1210,7 +1176,7 @@ namespace MathNet.Numerics.LinearAlgebra
throw new ArgumentNullException("lower"); 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); Storage.CopySubMatrixToUnchecked(result.Storage, 0, 0, RowCount, 0, 0, ColumnCount);
lower.Storage.CopySubMatrixToUnchecked(result.Storage, 0, RowCount, lower.RowCount, 0, ColumnCount, lower.ColumnCount); lower.Storage.CopySubMatrixToUnchecked(result.Storage, 0, RowCount, lower.RowCount, 0, ColumnCount, lower.ColumnCount);
return result; return result;

4
src/Numerics/LinearAlgebra/Single/Factorization/UserEvd.cs

@ -73,8 +73,8 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Factorization
var order = matrix.RowCount; var order = matrix.RowCount;
// Initialize matricies for eigenvalues and eigenvectors // Initialize matricies for eigenvalues and eigenvectors
var eigenVectors = matrix.CreateMatrix(order, order); var eigenVectors = Matrix<float>.Build.SameAs(matrix, order, order);
var blockDiagonal = matrix.CreateMatrix(order, order); var blockDiagonal = Matrix<float>.Build.SameAs(matrix, order, order);
var eigenValues = new LinearAlgebra.Complex.DenseVector(order); var eigenValues = new LinearAlgebra.Complex.DenseVector(order);
var isSymmetric = true; var isSymmetric = true;

2
src/Numerics/LinearAlgebra/Single/Factorization/UserGramSchmidt.cs

@ -58,7 +58,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Factorization
} }
var q = matrix.Clone(); var q = matrix.Clone();
var r = matrix.CreateMatrix(matrix.ColumnCount, matrix.ColumnCount); var r = Matrix<float>.Build.SameAs(matrix, matrix.ColumnCount, matrix.ColumnCount);
for (var k = 0; k < q.ColumnCount; k++) for (var k = 0; k < q.ColumnCount; k++)
{ {

2
src/Numerics/LinearAlgebra/Single/Factorization/UserLU.cs

@ -295,7 +295,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Factorization
public override Matrix<float> Inverse() public override Matrix<float> Inverse()
{ {
var order = Factors.RowCount; var order = Factors.RowCount;
var inverse = Factors.CreateMatrix(order, order); var inverse = Matrix<float>.Build.SameAs(Factors, order, order);
for (var i = 0; i < order; i++) for (var i = 0; i < order; i++)
{ {
inverse.At(i, i, 1.0f); inverse.At(i, i, 1.0f);

2
src/Numerics/LinearAlgebra/Single/Factorization/UserQR.cs

@ -70,7 +70,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Factorization
if (method == QRMethod.Full) if (method == QRMethod.Full)
{ {
r = matrix.Clone(); r = matrix.Clone();
q = matrix.CreateMatrix(matrix.RowCount, matrix.RowCount); q = Matrix<float>.Build.SameAs(matrix, matrix.RowCount, matrix.RowCount);
for (var i = 0; i < matrix.RowCount; i++) for (var i = 0; i < matrix.RowCount; i++)
{ {

8
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 nm = Math.Min(matrix.RowCount + 1, matrix.ColumnCount);
var matrixCopy = matrix.Clone(); var matrixCopy = matrix.Clone();
var s = matrixCopy.CreateVector(nm); var s = Vector<float>.Build.SameAs(matrixCopy, nm);
var u = matrixCopy.CreateMatrix(matrixCopy.RowCount, matrixCopy.RowCount); var u = Matrix<float>.Build.SameAs(matrixCopy, matrixCopy.RowCount, matrixCopy.RowCount);
var vt = matrixCopy.CreateMatrix(matrixCopy.ColumnCount, matrixCopy.ColumnCount); var vt = Matrix<float>.Build.SameAs(matrixCopy, matrixCopy.ColumnCount, matrixCopy.ColumnCount);
const int maxiter = 1000; const int maxiter = 1000;
var e = new float[matrixCopy.ColumnCount]; var e = new float[matrixCopy.ColumnCount];
@ -570,7 +570,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single.Factorization
if (matrixCopy.RowCount < matrixCopy.ColumnCount) if (matrixCopy.RowCount < matrixCopy.ColumnCount)
{ {
nm--; nm--;
var tmp = matrixCopy.CreateVector(nm); var tmp = Vector<float>.Build.SameAs(matrixCopy, nm);
for (i = 0; i < nm; i++) for (i = 0; i < nm; i++)
{ {
tmp[i] = s[i]; tmp[i] = s[i];

16
src/Numerics/LinearAlgebra/Single/SparseMatrix.cs

@ -375,7 +375,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// <returns>The lower triangle of this matrix.</returns> /// <returns>The lower triangle of this matrix.</returns>
public override Matrix<float> LowerTriangle() public override Matrix<float> LowerTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
LowerTriangleImpl(result); LowerTriangleImpl(result);
return result; return result;
} }
@ -400,7 +400,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
if (ReferenceEquals(this, result)) if (ReferenceEquals(this, result))
{ {
var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
LowerTriangle(tmp); LowerTriangle(tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
@ -440,7 +440,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// <returns>The upper triangle of this matrix.</returns> /// <returns>The upper triangle of this matrix.</returns>
public override Matrix<float> UpperTriangle() public override Matrix<float> UpperTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
UpperTriangleImpl(result); UpperTriangleImpl(result);
return result; return result;
} }
@ -465,7 +465,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
if (ReferenceEquals(this, result)) if (ReferenceEquals(this, result))
{ {
var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
UpperTriangle(tmp); UpperTriangle(tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
@ -506,7 +506,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// <returns>The lower triangle of this matrix.</returns> /// <returns>The lower triangle of this matrix.</returns>
public override Matrix<float> StrictlyLowerTriangle() public override Matrix<float> StrictlyLowerTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
StrictlyLowerTriangleImpl(result); StrictlyLowerTriangleImpl(result);
return result; return result;
} }
@ -531,7 +531,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
if (ReferenceEquals(this, result)) if (ReferenceEquals(this, result))
{ {
var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
StrictlyLowerTriangle(tmp); StrictlyLowerTriangle(tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }
@ -572,7 +572,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
/// <returns>The upper triangle of this matrix.</returns> /// <returns>The upper triangle of this matrix.</returns>
public override Matrix<float> StrictlyUpperTriangle() public override Matrix<float> StrictlyUpperTriangle()
{ {
var result = CreateMatrix(RowCount, ColumnCount); var result = Build.SameAs(this);
StrictlyUpperTriangleImpl(result); StrictlyUpperTriangleImpl(result);
return result; return result;
} }
@ -597,7 +597,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
if (ReferenceEquals(this, result)) if (ReferenceEquals(this, result))
{ {
var tmp = result.CreateMatrix(result.RowCount, result.ColumnCount); var tmp = Build.SameAs(result);
StrictlyUpperTriangle(tmp); StrictlyUpperTriangle(tmp);
tmp.CopyTo(result); tmp.CopyTo(result);
} }

12
src/UnitTests/LinearAlgebraTests/MatrixStructureTheory.cs

@ -155,7 +155,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests
[Theory] [Theory]
public void CanGetHashCode(Matrix<T> matrix) public void CanGetHashCode(Matrix<T> matrix)
{ {
Assert.That(matrix.GetHashCode(), Is.Not.EqualTo(matrix.CreateMatrix(matrix.RowCount, matrix.ColumnCount).GetHashCode())); Assert.That(matrix.GetHashCode(), Is.Not.EqualTo(Matrix<T>.Build.SameAs(matrix).GetHashCode()));
} }
[Theory] [Theory]
@ -163,7 +163,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests
{ {
var cleared = matrix.Clone(); var cleared = matrix.Clone();
cleared.Clear(); cleared.Clear();
Assert.That(cleared, Is.EqualTo(matrix.CreateMatrix(matrix.RowCount, matrix.ColumnCount))); Assert.That(cleared, Is.EqualTo(Matrix<T>.Build.SameAs(matrix)));
} }
[Theory] [Theory]
@ -220,13 +220,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests
[Theory] [Theory]
public void CanCreateSameKind(Matrix<T> matrix) public void CanCreateSameKind(Matrix<T> matrix)
{ {
var empty = matrix.CreateMatrix(5, 6); var empty = Matrix<T>.Build.SameAs(matrix, 5, 6);
Assert.That(empty, Is.EqualTo(CreateDenseZero(5, 6))); Assert.That(empty, Is.EqualTo(CreateDenseZero(5, 6)));
Assert.That(empty.Storage.IsDense, Is.EqualTo(matrix.Storage.IsDense)); Assert.That(empty.Storage.IsDense, Is.EqualTo(matrix.Storage.IsDense));
Assert.That(() => matrix.CreateMatrix(0, 2), Throws.InstanceOf<ArgumentOutOfRangeException>()); Assert.That(() => Matrix<T>.Build.SameAs(matrix, 0, 2), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.CreateMatrix(2, 0), Throws.InstanceOf<ArgumentOutOfRangeException>()); Assert.That(() => Matrix<T>.Build.SameAs(matrix, 2, 0), Throws.InstanceOf<ArgumentOutOfRangeException>());
Assert.That(() => matrix.CreateMatrix(-1, -1), Throws.InstanceOf<ArgumentOutOfRangeException>()); Assert.That(() => Matrix<T>.Build.SameAs(matrix, -1, -1), Throws.InstanceOf<ArgumentOutOfRangeException>());
} }
[Test] [Test]

Loading…
Cancel
Save