diff --git a/src/Numerics/LinearAlgebra/Double/DenseVector.cs b/src/Numerics/LinearAlgebra/Double/DenseVector.cs index 0cd68b40..d45772a3 100644 --- a/src/Numerics/LinearAlgebra/Double/DenseVector.cs +++ b/src/Numerics/LinearAlgebra/Double/DenseVector.cs @@ -595,8 +595,20 @@ namespace MathNet.Numerics.LinearAlgebra.Double } else { - CopyTo(result); - result.Subtract(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]); + } } } @@ -641,9 +653,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); } /// @@ -722,9 +732,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double throw new ArgumentNullException("leftSide"); } - var ret = (DenseVector)leftSide.Clone(); - ret.Multiply(rightSide); - return ret; + return (DenseVector) leftSide.Multiply(rightSide); } /// diff --git a/src/Numerics/LinearAlgebra/Double/Vector.cs b/src/Numerics/LinearAlgebra/Double/Vector.cs index d83d1251..6d6085e5 100644 --- a/src/Numerics/LinearAlgebra/Double/Vector.cs +++ b/src/Numerics/LinearAlgebra/Double/Vector.cs @@ -261,8 +261,10 @@ namespace MathNet.Numerics.LinearAlgebra.Double } else { - CopyTo(result); - result.Add(other); + CommonParallel.For( + 0, + Count, + index => result[index] = this[index] + other[index]); } } @@ -408,14 +410,16 @@ namespace MathNet.Numerics.LinearAlgebra.Double if (ReferenceEquals(this, result) || ReferenceEquals(other, result)) { - var tmp = result.CreateVector(result.Count); - Subtract(other, tmp); + var tmp = Subtract(other); tmp.CopyTo(result); } else { CopyTo(result); - result.Subtract(other); + CommonParallel.For( + 0, + Count, + index => result[index] = this[index] - other[index]); } } @@ -635,11 +639,10 @@ namespace MathNet.Numerics.LinearAlgebra.Double } else { - CopyTo(result); CommonParallel.For( 0, Count, - index => result[index] *= other[index]); + index => result[index] = this[index] * other[index]); } } @@ -708,11 +711,10 @@ namespace MathNet.Numerics.LinearAlgebra.Double } else { - CopyTo(result); CommonParallel.For( 0, Count, - index => result[index] /= other[index]); + index => result[index] = this[index] / other[index]); } } @@ -1190,13 +1192,14 @@ namespace MathNet.Numerics.LinearAlgebra.Double } var norm = Norm(p); - var clone = Clone(); + var clone = this.Clone(); if (norm == 0.0) { return clone; } - clone.Multiply(1.0 / norm); + clone.Multiply(1.0 / norm, clone); + return clone; } diff --git a/src/UnitTests/LinearAlgebraTests/Double/DenseVectorTests.cs b/src/UnitTests/LinearAlgebraTests/Double/DenseVectorTests.cs index 10cada79..46d28e97 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/DenseVectorTests.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/DenseVectorTests.cs @@ -153,7 +153,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double { var vector = new DenseVector(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]