diff --git a/src/Numerics/LinearAlgebra/Double/DenseVector.cs b/src/Numerics/LinearAlgebra/Double/DenseVector.cs index a1d38288..0cd68b40 100644 --- a/src/Numerics/LinearAlgebra/Double/DenseVector.cs +++ b/src/Numerics/LinearAlgebra/Double/DenseVector.cs @@ -333,8 +333,18 @@ namespace MathNet.Numerics.LinearAlgebra.Double throw new ArgumentException(Resources.ArgumentVectorsSameLength, "result"); } - CopyTo(result); - result.Add(scalar); + var dense = result as DenseVector; + if (dense == null) + { + base.Add(scalar, result); + } + else + { + CommonParallel.For( + 0, + Data.Length, + index => dense.Data[index] = this.Data[index] + scalar); + } } /// @@ -398,14 +408,25 @@ namespace MathNet.Numerics.LinearAlgebra.Double if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) { - var tmp = result.CreateVector(result.Count); - Add(other, tmp); + var tmp = this.Add(other); tmp.CopyTo(result); } else { - CopyTo(result); - result.Add(other); + var rdense = result as DenseVector; + var odense = other as DenseVector; + if (rdense != null && odense != null) + { + CopyTo(result); + Control.LinearAlgebraProvider.AddVectorToScaledVector(rdense.Data, 1.0, odense.Data); + } + else + { + CommonParallel.For( + 0, + Data.Length, + index => result[index] = this.Data[index] + other[index]); + } } } @@ -451,9 +472,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double throw new ArgumentException(Resources.ArgumentVectorsSameLength, "rightSide"); } - var ret = leftSide.Clone(); - ret.Add(rightSide); - return ret; + return leftSide.Add(rightSide); } /// @@ -495,8 +514,18 @@ namespace MathNet.Numerics.LinearAlgebra.Double throw new ArgumentException(Resources.ArgumentVectorsSameLength, "result"); } - CopyTo(result); - result.Subtract(scalar); + var dense = result as DenseVector; + if (dense == null) + { + base.Add(scalar, result); + } + else + { + CommonParallel.For( + 0, + Data.Length, + index => dense.Data[index] = this.Data[index] - scalar); + } } /// @@ -712,9 +741,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double throw new ArgumentNullException("rightSide"); } - var ret = (DenseVector)rightSide.Clone(); - ret.Multiply(leftSide); - return ret; + return (DenseVector) rightSide.Multiply(leftSide); } /// @@ -759,9 +786,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double throw new ArgumentNullException("leftSide"); } - var ret = (DenseVector)leftSide.Clone(); - ret.Multiply(1.0 / rightSide); - return ret; + return (DenseVector) leftSide.Multiply(1.0 / rightSide); } /// @@ -1030,8 +1055,18 @@ namespace MathNet.Numerics.LinearAlgebra.Double } else { - CopyTo(result); - result.PointwiseMultiply(other); + var dense = result as DenseVector; + if (dense == null) + { + base.PointwiseMultiply(other, result); + } + else + { + CommonParallel.For( + 0, + Data.Length, + index => dense.Data[index] = this.Data[index] * other[index]); + } } } @@ -1104,14 +1139,23 @@ namespace MathNet.Numerics.LinearAlgebra.Double if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) { - var tmp = result.CreateVector(result.Count); - PointwiseDivide(other, tmp); + var tmp = this.PointwiseDivide(other); tmp.CopyTo(result); } else { - CopyTo(result); - result.PointwiseDivide(other); + var dense = result as DenseVector; + if (dense == null) + { + base.PointwiseDivide(other, result); + } + else + { + CommonParallel.For( + 0, + Data.Length, + index => dense.Data[index] = this.Data[index] / other[index]); + } } } diff --git a/src/Numerics/LinearAlgebra/Double/SparseVector.cs b/src/Numerics/LinearAlgebra/Double/SparseVector.cs index 4ef3de1e..7621ec29 100644 --- a/src/Numerics/LinearAlgebra/Double/SparseVector.cs +++ b/src/Numerics/LinearAlgebra/Double/SparseVector.cs @@ -413,7 +413,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double else { var copy = (SparseVector)this.Clone(); - copy.AddScaledSparceVector(1.0, sparseVector); + copy.AddScaledSparseVector(1.0, sparseVector); return copy; } } @@ -423,7 +423,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// /// The alpha. /// The other. - private void AddScaledSparceVector(double alpha, SparseVector other) + private void AddScaledSparseVector(double alpha, SparseVector other) { if (other == null) { @@ -515,14 +515,28 @@ namespace MathNet.Numerics.LinearAlgebra.Double if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) { - var tmp = result.CreateVector(result.Count); - Add(other, tmp); + var tmp = this.Add(other); tmp.CopyTo(result); } else { - CopyTo(result); - result.Add(other); + var sparse = result as SparseVector; + if (sparse == null) + { + base.Add(other, result); + } + else + { + var sparseother = other as SparseVector; + if (sparseother == null) + { + sparse.AddScaledSparseVector(1.0, sparseother); + } + else + { + base.Add(other, result); + } + } } } @@ -644,7 +658,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double else { var copy = (SparseVector)this.Clone(); - copy.AddScaledSparceVector(-1.0, sparseVector); + copy.AddScaledSparseVector(-1.0, sparseVector); return copy; } } @@ -677,14 +691,28 @@ namespace MathNet.Numerics.LinearAlgebra.Double if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) { - var tmp = result.CreateVector(result.Count); - Subtract(other, tmp); + var tmp = this.Subtract(other); tmp.CopyTo(result); } else { - CopyTo(result); - result.Subtract(other); + var sparse = result as SparseVector; + if (sparse == null) + { + base.Subtract(other, result); + } + else + { + var sparseother = other as SparseVector; + if (sparseother == null) + { + sparse.AddScaledSparseVector(-1.0, sparseother); + } + else + { + base.Subtract(other, result); + } + } } } diff --git a/src/Numerics/LinearAlgebra/Double/Vector.cs b/src/Numerics/LinearAlgebra/Double/Vector.cs index e5341d1e..d83d1251 100644 --- a/src/Numerics/LinearAlgebra/Double/Vector.cs +++ b/src/Numerics/LinearAlgebra/Double/Vector.cs @@ -168,7 +168,10 @@ namespace MathNet.Numerics.LinearAlgebra.Double CopyTo(result); } - result.Add(scalar); + CommonParallel.For( + 0, + Count, + index => result[index] += scalar); } /// @@ -182,7 +185,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// public virtual Vector Plus() { - return this * 1.0; + return this.Clone(); } /// @@ -253,8 +256,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) { - var tmp = result.CreateVector(result.Count); - Add(other, tmp); + var tmp = this.Add(other); tmp.CopyTo(result); } else @@ -318,7 +320,10 @@ namespace MathNet.Numerics.LinearAlgebra.Double CopyTo(result); } - result.Subtract(scalar); + CommonParallel.For( + 0, + Count, + index => result[index] -= scalar); } /// @@ -468,7 +473,10 @@ namespace MathNet.Numerics.LinearAlgebra.Double CopyTo(result); } - result.Multiply(scalar); + CommonParallel.For( + 0, + Count, + index => result[index] *= scalar); } /// @@ -556,7 +564,10 @@ namespace MathNet.Numerics.LinearAlgebra.Double CopyTo(result); } - result.Multiply(1.0 / scalar); + CommonParallel.For( + 0, + Count, + index => result[index] /= scalar); } /// @@ -619,14 +630,16 @@ namespace MathNet.Numerics.LinearAlgebra.Double if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) { - var tmp = result.CreateVector(result.Count); - PointwiseMultiply(other, tmp); + var tmp = this.PointwiseMultiply(other); tmp.CopyTo(result); } else { CopyTo(result); - result.PointwiseMultiply(other); + CommonParallel.For( + 0, + Count, + index => result[index] *= other[index]); } } @@ -690,14 +703,16 @@ namespace MathNet.Numerics.LinearAlgebra.Double if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) { - var tmp = result.CreateVector(result.Count); - PointwiseDivide(other, tmp); + var tmp = this.PointwiseDivide(other); tmp.CopyTo(result); } else { CopyTo(result); - result.PointwiseDivide(other); + CommonParallel.For( + 0, + Count, + index => result[index] /= other[index]); } } @@ -994,9 +1009,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double throw new ArgumentException(Resources.ArgumentVectorsSameLength, "rightSide"); } - var ret = leftSide.Clone(); - ret.Add(rightSide); - return ret; + return leftSide.Add(rightSide); } /// @@ -1040,9 +1053,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double throw new ArgumentException(Resources.ArgumentVectorsSameLength, "rightSide"); } - var ret = leftSide.Clone(); - ret.Subtract(rightSide); - return ret; + return leftSide.Subtract(rightSide); } /// @@ -1059,9 +1070,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double throw new ArgumentNullException("leftSide"); } - var ret = leftSide.Clone(); - ret.Multiply(rightSide); - return ret; + return leftSide.Multiply(rightSide); } /// @@ -1078,9 +1087,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double throw new ArgumentNullException("rightSide"); } - var ret = rightSide.Clone(); - ret.Multiply(leftSide); - return ret; + return rightSide.Multiply(leftSide); } /// @@ -1125,9 +1132,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double throw new ArgumentNullException("leftSide"); } - var ret = leftSide.Clone(); - ret.Multiply(1.0 / rightSide); - return ret; + return leftSide.Multiply(1.0 / rightSide); } #endregion diff --git a/src/UnitTests/LinearAlgebraTests/Double/VectorTests.Arithmetic.cs b/src/UnitTests/LinearAlgebraTests/Double/VectorTests.Arithmetic.cs index 0935c711..588bdb36 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/VectorTests.Arithmetic.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/VectorTests.Arithmetic.cs @@ -37,7 +37,11 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double { var vector = this.CreateVector(this._data); var other = vector.Plus(); - Assert.AreSame(vector, other, "Should be the same vector"); + + for (var i = 0; i < this._data.Length; i++) + { + Assert.AreEqual(vector[i], other[i]); + } } [Test] @@ -53,7 +57,11 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double { var vector = this.CreateVector(this._data); var other = +vector; - Assert.AreSame(vector, other, "Should be the same vector"); + + for (var i = 0; i < this._data.Length; i++) + { + Assert.AreEqual(vector[i], other[i]); + } } [Test]