diff --git a/src/Numerics/LinearAlgebra/Double/SparseVector.cs b/src/Numerics/LinearAlgebra/Double/SparseVector.cs index 3e51fd79..21d4e555 100644 --- a/src/Numerics/LinearAlgebra/Double/SparseVector.cs +++ b/src/Numerics/LinearAlgebra/Double/SparseVector.cs @@ -980,10 +980,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double { for (var j = 0; j < v.NonZerosCount; j++) { - if (u._nonZeroIndices[i] == v._nonZeroIndices[j]) - { - matrix.At(i, j, u._nonZeroValues[i] * v._nonZeroValues[j]); - } + matrix.At(i, j, u._nonZeroValues[i] * v._nonZeroValues[j]); } } diff --git a/src/UnitTests/LinearAlgebraTests/Double/SparseVectorTest.cs b/src/UnitTests/LinearAlgebraTests/Double/SparseVectorTest.cs index ffb284c1..745399c8 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/SparseVectorTest.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/SparseVectorTest.cs @@ -432,5 +432,32 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double Assert.AreEqual(2, result.NonZerosCount); } + + /// + /// Can outer multiple two sparse vectors. Checking fix for workitem 5696. + /// + [Test] + public void CanOuterMultiplySparseVectors() + { + var vector1 = new SparseVector(new[] { 2.0, 2.0, 0.0, 0.0 }); + var vector2 = new SparseVector(new[] { 2.0, 2.0, 0.0, 0.0 }); + var result = vector1.OuterProduct(vector2); + + Assert.AreEqual(4.0, result[0, 0]); + Assert.AreEqual(4.0, result[0, 1]); + Assert.AreEqual(4.0, result[1, 0]); + Assert.AreEqual(4.0, result[1, 1]); + + for (var i = 0; i < vector1.Count; i++) + { + for (var j = 0; j < vector2.Count; j++) + { + if (i > 1 || j > 1) + { + Assert.AreEqual(0.0, result[i, j]); + } + } + } + } } }