Browse Source

LA: fix a critical bug in SparseMatrix.Add when adding a matrix to itself #341

truncatednormal
Christoph Ruegg 11 years ago
parent
commit
5ff5a75389
  1. 2
      src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs
  2. 2
      src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs
  3. 2
      src/Numerics/LinearAlgebra/Double/SparseMatrix.cs
  4. 6
      src/Numerics/LinearAlgebra/Single/SparseMatrix.cs
  5. 40
      src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.Arithmetic.cs
  6. 40
      src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.Arithmetic.cs
  7. 41
      src/UnitTests/LinearAlgebraTests/Double/MatrixTests.Arithmetic.cs
  8. 40
      src/UnitTests/LinearAlgebraTests/Single/MatrixTests.Arithmetic.cs

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

@ -726,7 +726,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex
CopyTo(result);
}
Control.LinearAlgebraProvider.ScaleArray(2.0, _storage.Values, _storage.Values);
Control.LinearAlgebraProvider.ScaleArray(2.0, sparseResult._storage.Values, sparseResult._storage.Values);
return;
}

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

@ -721,7 +721,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32
CopyTo(result);
}
Control.LinearAlgebraProvider.ScaleArray(2.0f, _storage.Values, _storage.Values);
Control.LinearAlgebraProvider.ScaleArray(2.0f, sparseResult._storage.Values, sparseResult._storage.Values);
return;
}

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

@ -721,7 +721,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double
CopyTo(result);
}
Control.LinearAlgebraProvider.ScaleArray(2.0, _storage.Values, _storage.Values);
Control.LinearAlgebraProvider.ScaleArray(2.0, sparseResult._storage.Values, sparseResult._storage.Values);
return;
}

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

@ -155,7 +155,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
{
return OfColumnArrays(data.Select(v => v.ToArray()).ToArray());
}
/// <summary>
/// Create a new sparse matrix as a copy of the given enumerable of enumerable columns.
/// Each enumerable in the master enumerable specifies a column.
@ -725,7 +725,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
CopyTo(result);
}
Control.LinearAlgebraProvider.ScaleArray(2.0f, _storage.Values, _storage.Values);
Control.LinearAlgebraProvider.ScaleArray(2.0f, sparseResult._storage.Values, sparseResult._storage.Values);
return;
}
@ -1095,7 +1095,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single
for (var i = 0; i < RowCount; i++)
{
// Multiply row of matrix A on row of matrix B
var startIndexThis = rowPointers[i];
var endIndexThis = rowPointers[i + 1];

40
src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.Arithmetic.cs

@ -251,6 +251,46 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex
}
}
/// <summary>
/// Can add a matrix.
/// </summary>
/// <param name="mtx">Matrix name.</param>
[TestCase("Square3x3")]
[TestCase("Tall3x2")]
public void CanAddMatrixToSelf(string mtx)
{
var matrix = TestMatrices[mtx].Clone();
var result = matrix.Add(matrix);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(result[i, j], 2*matrix[i, j]);
}
}
}
/// <summary>
/// Can subtract a matrix.
/// </summary>
/// <param name="mtx">Matrix name.</param>
[TestCase("Square3x3")]
[TestCase("Tall3x2")]
public void CanSubtractMatrixFromSelf(string mtx)
{
var matrix = TestMatrices[mtx].Clone();
var result = matrix.Subtract(matrix);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(result[i, j], Complex.Zero);
}
}
}
/// <summary>
/// Adding a matrix with fewer columns throws <c>ArgumentOutOfRangeException</c>.
/// </summary>

40
src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.Arithmetic.cs

@ -247,6 +247,46 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32
}
}
/// <summary>
/// Can add a matrix.
/// </summary>
/// <param name="mtx">Matrix name.</param>
[TestCase("Square3x3")]
[TestCase("Tall3x2")]
public void CanAddMatrixToSelf(string mtx)
{
var matrix = TestMatrices[mtx].Clone();
var result = matrix.Add(matrix);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(result[i, j], 2*matrix[i, j]);
}
}
}
/// <summary>
/// Can subtract a matrix.
/// </summary>
/// <param name="mtx">Matrix name.</param>
[TestCase("Square3x3")]
[TestCase("Tall3x2")]
public void CanSubtractMatrixFromSelf(string mtx)
{
var matrix = TestMatrices[mtx].Clone();
var result = matrix.Subtract(matrix);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(result[i, j], Complex32.Zero);
}
}
}
/// <summary>
/// Adding a matrix with fewer columns throws <c>ArgumentOutOfRangeException</c>.
/// </summary>

41
src/UnitTests/LinearAlgebraTests/Double/MatrixTests.Arithmetic.cs

@ -27,7 +27,6 @@
using System;
using MathNet.Numerics.Distributions;
using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Double;
using NUnit.Framework;
namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double
@ -241,6 +240,46 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double
}
}
/// <summary>
/// Can add a matrix.
/// </summary>
/// <param name="mtx">Matrix name.</param>
[TestCase("Square3x3")]
[TestCase("Tall3x2")]
public void CanAddMatrixToSelf(string mtx)
{
var matrix = TestMatrices[mtx].Clone();
var result = matrix.Add(matrix);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(result[i, j], 2*matrix[i, j]);
}
}
}
/// <summary>
/// Can subtract a matrix.
/// </summary>
/// <param name="mtx">Matrix name.</param>
[TestCase("Square3x3")]
[TestCase("Tall3x2")]
public void CanSubtractMatrixFromSelf(string mtx)
{
var matrix = TestMatrices[mtx].Clone();
var result = matrix.Subtract(matrix);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(result[i, j], 0d);
}
}
}
/// <summary>
/// Adding a matrix with fewer columns throws <c>ArgumentOutOfRangeException</c>.
/// </summary>

40
src/UnitTests/LinearAlgebraTests/Single/MatrixTests.Arithmetic.cs

@ -241,6 +241,46 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single
}
}
/// <summary>
/// Can add a matrix.
/// </summary>
/// <param name="mtx">Matrix name.</param>
[TestCase("Square3x3")]
[TestCase("Tall3x2")]
public void CanAddMatrixToSelf(string mtx)
{
var matrix = TestMatrices[mtx].Clone();
var result = matrix.Add(matrix);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(result[i, j], 2*matrix[i, j]);
}
}
}
/// <summary>
/// Can subtract a matrix.
/// </summary>
/// <param name="mtx">Matrix name.</param>
[TestCase("Square3x3")]
[TestCase("Tall3x2")]
public void CanSubtractMatrixFromSelf(string mtx)
{
var matrix = TestMatrices[mtx].Clone();
var result = matrix.Subtract(matrix);
for (var i = 0; i < matrix.RowCount; i++)
{
for (var j = 0; j < matrix.ColumnCount; j++)
{
Assert.AreEqual(result[i, j], 0f);
}
}
}
/// <summary>
/// Adding a matrix with fewer columns throws <c>ArgumentOutOfRangeException</c>.
/// </summary>

Loading…
Cancel
Save