diff --git a/src/Numerics/Algorithms/LinearAlgebra/ManagedLinearAlgebraProvider.cs b/src/Numerics/Algorithms/LinearAlgebra/ManagedLinearAlgebraProvider.cs index 331d2ccc..6a528b5a 100644 --- a/src/Numerics/Algorithms/LinearAlgebra/ManagedLinearAlgebraProvider.cs +++ b/src/Numerics/Algorithms/LinearAlgebra/ManagedLinearAlgebraProvider.cs @@ -32,6 +32,15 @@ namespace MathNet.Numerics.Algorithms.LinearAlgebra /// public class ManagedLinearAlgebraProvider : ILinearAlgebraProvider { + #region Workspace information Members + + public int QueryWorkspaceBlockSize(string methodName) + { + throw new NotImplementedException(); + } + + #endregion + #region ILinearAlgebraProvider Members /// @@ -81,6 +90,11 @@ namespace MathNet.Numerics.Algorithms.LinearAlgebra /// This is equivalent to the SCAL BLAS routine. public void ScaleArray(double alpha, double[] x) { + if (x == null) + { + throw new ArgumentNullException("x"); + } + if (alpha == 1.0) { return; @@ -89,11 +103,6 @@ namespace MathNet.Numerics.Algorithms.LinearAlgebra Parallel.For(0, x.Length, i => x[i] = alpha * x[i]); } - public int QueryWorkspaceBlockSize(string methodName) - { - throw new NotImplementedException(); - } - /// /// Computes the dot product between two vectors. /// @@ -354,35 +363,190 @@ namespace MathNet.Numerics.Algorithms.LinearAlgebra #region ILinearAlgebraProvider Members - + /// + /// Adds a scaled vector to another: y += alpha*x. + /// + /// The vector to update. + /// The value to scale by. + /// The vector to add to . + /// This equivalent to the AXPY BLAS routine. public void AddVectorToScaledVector(float[] y, float alpha, float[] x) { - throw new NotImplementedException(); + if (y == null) + { + throw new ArgumentNullException("y"); + } + + if (x == null) + { + throw new ArgumentNullException("x"); + } + + if (y.Length != x.Length) + { + throw new ArgumentException(Resources.ArgumentVectorsSameLength); + } + + if (alpha == 0.0) + { + return; + } + + if (alpha == 1.0) + { + Parallel.For(0, y.Length, i => y[i] += x[i]); + } + else + { + Parallel.For(0, y.Length, i => y[i] += alpha * x[i]); + } } + /// + /// Scales an array. Can be used to scale a vector and a matrix. + /// + /// The scalar. + /// The values to scale. + /// This is equivalent to the SCAL BLAS routine. public void ScaleArray(float alpha, float[] x) { - throw new NotImplementedException(); + if (x == null) + { + throw new ArgumentNullException("x"); + } + + if (alpha == 1.0) + { + return; + } + + Parallel.For(0, x.Length, i => x[i] = alpha * x[i]); } + /// + /// Computes the dot product between two vectors. + /// + /// The first argument of the dot product. + /// The second argument of the dot product. + /// The dot product between and . public float DotProduct(float[] x, float[] y) { - throw new NotImplementedException(); + if (y == null) + { + throw new ArgumentNullException("y"); + } + + if (x == null) + { + throw new ArgumentNullException("x"); + } + + if (y.Length != x.Length) + { + throw new ArgumentException(Resources.ArgumentVectorsSameLength); + } + + float d = 0.0F; + + for (int i = 0; i < y.Length; i++) + { + d += y[i] * x[i]; + } + + return d; } + /// + /// Adds two arrays together and writes the result in a third array. + /// + /// The first argument to add. + /// The second argument to add. + /// The result to write the addition into. public void AddArrays(float[] x, float[] y, float[] result) { - throw new NotImplementedException(); + if (y == null) + { + throw new ArgumentNullException("y"); + } + + if (x == null) + { + throw new ArgumentNullException("x"); + } + + if (result == null) + { + throw new ArgumentNullException("result"); + } + + if (y.Length != x.Length || y.Length != result.Length) + { + throw new ArgumentException(Resources.ArgumentVectorsSameLength); + } + + Parallel.For(0, y.Length, i => result[i] = x[i] + y[i]); } + /// + /// Subtract two arrays and writes the result in a third array. + /// + /// The first argument to subtract. + /// The second argument to subtract. + /// The result to write the subtraction into. public void SubtractArrays(float[] x, float[] y, float[] result) { - throw new NotImplementedException(); + if (y == null) + { + throw new ArgumentNullException("y"); + } + + if (x == null) + { + throw new ArgumentNullException("x"); + } + + if (result == null) + { + throw new ArgumentNullException("result"); + } + + if (y.Length != x.Length || y.Length != result.Length) + { + throw new ArgumentException(Resources.ArgumentVectorsSameLength); + } + + Parallel.For(0, y.Length, i => result[i] = x[i] - y[i]); } + /// + /// Pointwise multiplies two arrays and writes the result in a third array. + /// + /// The first argument to pointwise multiply. + /// The second argument to pointwise multiply. + /// The result to write the pointwise multiplication into. public void PointWiseMultiplyArrays(float[] x, float[] y, float[] result) { - throw new NotImplementedException(); + if (y == null) + { + throw new ArgumentNullException("y"); + } + + if (x == null) + { + throw new ArgumentNullException("x"); + } + + if (result == null) + { + throw new ArgumentNullException("result"); + } + + if (y.Length != x.Length || y.Length != result.Length) + { + throw new ArgumentException(Resources.ArgumentVectorsSameLength); + } + + Parallel.For(0, y.Length, i => result[i] = x[i] * y[i]); } public float MatrixNorm(Norm norm, float[] matrix) @@ -519,38 +683,193 @@ namespace MathNet.Numerics.Algorithms.LinearAlgebra #region ILinearAlgebraProvider Members - + /// + /// Adds a scaled vector to another: y += alpha*x. + /// + /// The vector to update. + /// The value to scale by. + /// The vector to add to . + /// This equivalent to the AXPY BLAS routine. public void AddVectorToScaledVector(Complex[] y, Complex alpha, Complex[] x) { - throw new NotImplementedException(); - } + if (y == null) + { + throw new ArgumentNullException("y"); + } - public void ScaleArray(Complex alpha, Complex[] x) - { - throw new NotImplementedException(); - } + if (x == null) + { + throw new ArgumentNullException("x"); + } - public Complex DotProduct(Complex[] x, Complex[] y) - { - throw new NotImplementedException(); - } + if (y.Length != x.Length) + { + throw new ArgumentException(Resources.ArgumentVectorsSameLength); + } - public void AddArrays(Complex[] x, Complex[] y, Complex[] result) - { - throw new NotImplementedException(); - } + if (alpha == 0.0) + { + return; + } - public void SubtractArrays(Complex[] x, Complex[] y, Complex[] result) - { - throw new NotImplementedException(); + if (alpha == 1.0) + { + Parallel.For(0, y.Length, i => y[i] += x[i]); + } + else + { + Parallel.For(0, y.Length, i => y[i] += alpha * x[i]); + } } - public void PointWiseMultiplyArrays(Complex[] x, Complex[] y, Complex[] result) + /// + /// Scales an array. Can be used to scale a vector and a matrix. + /// + /// The scalar. + /// The values to scale. + /// This is equivalent to the SCAL BLAS routine. + public void ScaleArray(Complex alpha, Complex[] x) { - throw new NotImplementedException(); + if (x == null) + { + throw new ArgumentNullException("x"); + } + + if (alpha == 1.0) + { + return; + } + + Parallel.For(0, x.Length, i => x[i] = alpha * x[i]); } - public Complex MatrixNorm(Norm norm, Complex[] matrix) + /// + /// Computes the dot product between two vectors. + /// + /// The first argument of the dot product. + /// The second argument of the dot product. + /// The dot product between and . + public Complex DotProduct(Complex[] x, Complex[] y) + { + if (y == null) + { + throw new ArgumentNullException("y"); + } + + if (x == null) + { + throw new ArgumentNullException("x"); + } + + if (y.Length != x.Length) + { + throw new ArgumentException(Resources.ArgumentVectorsSameLength); + } + + Complex d = new Complex(0.0, 0.0); + + for (int i = 0; i < y.Length; i++) + { + d += y[i] * x[i]; + } + + return d; + } + + /// + /// Adds two arrays together and writes the result in a third array. + /// + /// The first argument to add. + /// The second argument to add. + /// The result to write the addition into. + public void AddArrays(Complex[] x, Complex[] y, Complex[] result) + { + if (y == null) + { + throw new ArgumentNullException("y"); + } + + if (x == null) + { + throw new ArgumentNullException("x"); + } + + if (result == null) + { + throw new ArgumentNullException("result"); + } + + if (y.Length != x.Length || y.Length != result.Length) + { + throw new ArgumentException(Resources.ArgumentVectorsSameLength); + } + + Parallel.For(0, y.Length, i => result[i] = x[i] + y[i]); + } + + /// + /// Subtract two arrays and writes the result in a third array. + /// + /// The first argument to subtract. + /// The second argument to subtract. + /// The result to write the subtraction into. + public void SubtractArrays(Complex[] x, Complex[] y, Complex[] result) + { + if (y == null) + { + throw new ArgumentNullException("y"); + } + + if (x == null) + { + throw new ArgumentNullException("x"); + } + + if (result == null) + { + throw new ArgumentNullException("result"); + } + + if (y.Length != x.Length || y.Length != result.Length) + { + throw new ArgumentException(Resources.ArgumentVectorsSameLength); + } + + Parallel.For(0, y.Length, i => result[i] = x[i] - y[i]); + } + + /// + /// Pointwise multiplies two arrays and writes the result in a third array. + /// + /// The first argument to pointwise multiply. + /// The second argument to pointwise multiply. + /// The result to write the pointwise multiplication into. + public void PointWiseMultiplyArrays(Complex[] x, Complex[] y, Complex[] result) + { + if (y == null) + { + throw new ArgumentNullException("y"); + } + + if (x == null) + { + throw new ArgumentNullException("x"); + } + + if (result == null) + { + throw new ArgumentNullException("result"); + } + + if (y.Length != x.Length || y.Length != result.Length) + { + throw new ArgumentException(Resources.ArgumentVectorsSameLength); + } + + Parallel.For(0, y.Length, i => result[i] = x[i] * y[i]); + } + + public Complex MatrixNorm(Norm norm, Complex[] matrix) { throw new NotImplementedException(); } @@ -684,35 +1003,190 @@ namespace MathNet.Numerics.Algorithms.LinearAlgebra #region ILinearAlgebraProvider Members - + /// + /// Adds a scaled vector to another: y += alpha*x. + /// + /// The vector to update. + /// The value to scale by. + /// The vector to add to . + /// This equivalent to the AXPY BLAS routine. public void AddVectorToScaledVector(Complex32[] y, Complex32 alpha, Complex32[] x) { - throw new NotImplementedException(); + if (y == null) + { + throw new ArgumentNullException("y"); + } + + if (x == null) + { + throw new ArgumentNullException("x"); + } + + if (y.Length != x.Length) + { + throw new ArgumentException(Resources.ArgumentVectorsSameLength); + } + + if (alpha == 0.0F) + { + return; + } + + if (alpha == 1.0F) + { + Parallel.For(0, y.Length, i => y[i] += x[i]); + } + else + { + Parallel.For(0, y.Length, i => y[i] += alpha * x[i]); + } } + /// + /// Scales an array. Can be used to scale a vector and a matrix. + /// + /// The scalar. + /// The values to scale. + /// This is equivalent to the SCAL BLAS routine. public void ScaleArray(Complex32 alpha, Complex32[] x) { - throw new NotImplementedException(); + if (x == null) + { + throw new ArgumentNullException("x"); + } + + if (alpha.IsOne) + { + return; + } + + Parallel.For(0, x.Length, i => x[i] = alpha * x[i]); } + /// + /// Computes the dot product between two vectors. + /// + /// The first argument of the dot product. + /// The second argument of the dot product. + /// The dot product between and . public Complex32 DotProduct(Complex32[] x, Complex32[] y) { - throw new NotImplementedException(); + if (y == null) + { + throw new ArgumentNullException("y"); + } + + if (x == null) + { + throw new ArgumentNullException("x"); + } + + if (y.Length != x.Length) + { + throw new ArgumentException(Resources.ArgumentVectorsSameLength); + } + + Complex32 d = new Complex32(0.0F, 0.0F); + + for (int i = 0; i < y.Length; i++) + { + d += y[i] * x[i]; + } + + return d; } + /// + /// Adds two arrays together and writes the result in a third array. + /// + /// The first argument to add. + /// The second argument to add. + /// The result to write the addition into. public void AddArrays(Complex32[] x, Complex32[] y, Complex32[] result) { - throw new NotImplementedException(); + if (y == null) + { + throw new ArgumentNullException("y"); + } + + if (x == null) + { + throw new ArgumentNullException("x"); + } + + if (result == null) + { + throw new ArgumentNullException("result"); + } + + if (y.Length != x.Length || y.Length != result.Length) + { + throw new ArgumentException(Resources.ArgumentVectorsSameLength); + } + + Parallel.For(0, y.Length, i => result[i] = x[i] + y[i]); } + /// + /// Subtract two arrays and writes the result in a third array. + /// + /// The first argument to subtract. + /// The second argument to subtract. + /// The result to write the subtraction into. public void SubtractArrays(Complex32[] x, Complex32[] y, Complex32[] result) { - throw new NotImplementedException(); + if (y == null) + { + throw new ArgumentNullException("y"); + } + + if (x == null) + { + throw new ArgumentNullException("x"); + } + + if (result == null) + { + throw new ArgumentNullException("result"); + } + + if (y.Length != x.Length || y.Length != result.Length) + { + throw new ArgumentException(Resources.ArgumentVectorsSameLength); + } + + Parallel.For(0, y.Length, i => result[i] = x[i] - y[i]); } + /// + /// Pointwise multiplies two arrays and writes the result in a third array. + /// + /// The first argument to pointwise multiply. + /// The second argument to pointwise multiply. + /// The result to write the pointwise multiplication into. public void PointWiseMultiplyArrays(Complex32[] x, Complex32[] y, Complex32[] result) { - throw new NotImplementedException(); + if (y == null) + { + throw new ArgumentNullException("y"); + } + + if (x == null) + { + throw new ArgumentNullException("x"); + } + + if (result == null) + { + throw new ArgumentNullException("result"); + } + + if (y.Length != x.Length || y.Length != result.Length) + { + throw new ArgumentException(Resources.ArgumentVectorsSameLength); + } + + Parallel.For(0, y.Length, i => result[i] = x[i] * y[i]); } public Complex32 MatrixNorm(Norm norm, Complex32[] matrix)