diff --git a/src/Numerics.Tests/LinearAlgebraTests/Complex/MatrixTests.Arithmetic.cs b/src/Numerics.Tests/LinearAlgebraTests/Complex/MatrixTests.Arithmetic.cs index e0d253d1..e850d029 100644 --- a/src/Numerics.Tests/LinearAlgebraTests/Complex/MatrixTests.Arithmetic.cs +++ b/src/Numerics.Tests/LinearAlgebraTests/Complex/MatrixTests.Arithmetic.cs @@ -830,7 +830,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex var matrix = TestMatrices[name]; var inverse = matrix.PseudoInverse(); // Testing for Moore–Penrose conditions 1: A*A^+*A = A - AssertHelpers.AlmostEqual(matrix, matrix * inverse * matrix, 12); + AssertHelpers.AlmostEqual(matrix, matrix * (inverse * matrix), 12); } /// diff --git a/src/Numerics.Tests/LinearAlgebraTests/Complex32/MatrixTests.Arithmetic.cs b/src/Numerics.Tests/LinearAlgebraTests/Complex32/MatrixTests.Arithmetic.cs index 51e1f335..91898dbb 100644 --- a/src/Numerics.Tests/LinearAlgebraTests/Complex32/MatrixTests.Arithmetic.cs +++ b/src/Numerics.Tests/LinearAlgebraTests/Complex32/MatrixTests.Arithmetic.cs @@ -831,7 +831,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32 var matrix = TestMatrices[name]; var inverse = matrix.PseudoInverse(); // Testing for Moore–Penrose conditions 1: A*A^+*A = A - AssertHelpers.AlmostEqual(matrix, matrix * inverse * matrix, 5); + AssertHelpers.AlmostEqual(matrix, matrix * (inverse * matrix), 5); } /// diff --git a/src/Numerics.Tests/LinearAlgebraTests/Double/MatrixTests.Arithmetic.cs b/src/Numerics.Tests/LinearAlgebraTests/Double/MatrixTests.Arithmetic.cs index 4b0703fe..44ba8807 100644 --- a/src/Numerics.Tests/LinearAlgebraTests/Double/MatrixTests.Arithmetic.cs +++ b/src/Numerics.Tests/LinearAlgebraTests/Double/MatrixTests.Arithmetic.cs @@ -824,7 +824,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double var matrix = TestMatrices[name]; var inverse = matrix.PseudoInverse(); // Testing for Moore–Penrose conditions 1: A*A^+*A = A - AssertHelpers.AlmostEqual(matrix, matrix * inverse * matrix, 12); + AssertHelpers.AlmostEqual(matrix, matrix * (inverse * matrix), 12); } /// diff --git a/src/Numerics.Tests/LinearAlgebraTests/Single/MatrixTests.Arithmetic.cs b/src/Numerics.Tests/LinearAlgebraTests/Single/MatrixTests.Arithmetic.cs index 9f609905..24c4be4c 100644 --- a/src/Numerics.Tests/LinearAlgebraTests/Single/MatrixTests.Arithmetic.cs +++ b/src/Numerics.Tests/LinearAlgebraTests/Single/MatrixTests.Arithmetic.cs @@ -819,7 +819,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single var matrix = TestMatrices[name]; var inverse = matrix.PseudoInverse(); // Testing for Moore–Penrose conditions 1: A*A^+*A = A - AssertHelpers.AlmostEqual(matrix, matrix * inverse * matrix, 5); + AssertHelpers.AlmostEqual(matrix, matrix * (inverse * matrix), 5); } /// diff --git a/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs index 1821c0d9..02f01386 100644 --- a/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs @@ -384,7 +384,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex else { result.Clear(); - other.Storage.MapSubMatrixIndexedTo(result.Storage, (i, j, x) => x*_data[i], 0, 0, other.RowCount, 0, 0, other.ColumnCount, Zeros.AllowSkip, ExistingData.AssumeZeros); + other.Storage.MapSubMatrixIndexedTo(result.Storage, (i, j, x) => x*_data[i], 0, 0, Math.Min(RowCount, other.RowCount), 0, 0, other.ColumnCount, Zeros.AllowSkip, ExistingData.AssumeZeros); } } diff --git a/src/Numerics/LinearAlgebra/Complex/Matrix.cs b/src/Numerics/LinearAlgebra/Complex/Matrix.cs index d09e793e..841b8e30 100644 --- a/src/Numerics/LinearAlgebra/Complex/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Complex/Matrix.cs @@ -539,7 +539,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex } w.SetDiagonal(s); - return (svd.U * w * svd.VT).ConjugateTranspose(); + return (svd.U * (w * svd.VT)).ConjugateTranspose(); } /// diff --git a/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs index b1053ca2..add8a477 100644 --- a/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex/SparseMatrix.cs @@ -901,7 +901,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex else { result.Storage.Clear(); - Storage.MapSubMatrixIndexedTo(result.Storage, (i, j, x) => x*diagonal[j], 0, 0, RowCount, 0, 0, ColumnCount, Zeros.AllowSkip, ExistingData.AssumeZeros); + Storage.MapSubMatrixIndexedTo(result.Storage, (i, j, x) => x*diagonal[j], 0, 0, RowCount, 0, 0, Math.Min(ColumnCount, other.ColumnCount), Zeros.AllowSkip, ExistingData.AssumeZeros); } return; } diff --git a/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs index 0c3eb20b..c8c93e00 100644 --- a/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs @@ -383,7 +383,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 else { result.Clear(); - other.Storage.MapSubMatrixIndexedTo(result.Storage, (i, j, x) => x*_data[i], 0, 0, other.RowCount, 0, 0, other.ColumnCount, Zeros.AllowSkip, ExistingData.AssumeZeros); + other.Storage.MapSubMatrixIndexedTo(result.Storage, (i, j, x) => x*_data[i], 0, 0, Math.Min(RowCount, other.RowCount), 0, 0, other.ColumnCount, Zeros.AllowSkip, ExistingData.AssumeZeros); } } diff --git a/src/Numerics/LinearAlgebra/Complex32/Matrix.cs b/src/Numerics/LinearAlgebra/Complex32/Matrix.cs index be2e6b2d..443e1471 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Matrix.cs @@ -539,7 +539,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 } w.SetDiagonal(s); - return (svd.U * w * svd.VT).ConjugateTranspose(); + return (svd.U * (w * svd.VT)).ConjugateTranspose(); } /// diff --git a/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs index e6e3e681..717c6610 100644 --- a/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex32/SparseMatrix.cs @@ -900,7 +900,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 else { result.Storage.Clear(); - Storage.MapSubMatrixIndexedTo(result.Storage, (i, j, x) => x*diagonal[j], 0, 0, RowCount, 0, 0, ColumnCount, Zeros.AllowSkip, ExistingData.AssumeZeros); + Storage.MapSubMatrixIndexedTo(result.Storage, (i, j, x) => x*diagonal[j], 0, 0, RowCount, 0, 0, Math.Min(ColumnCount, other.ColumnCount), Zeros.AllowSkip, ExistingData.AssumeZeros); } return; } diff --git a/src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs index f01162e9..4c5e6463 100644 --- a/src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs @@ -362,7 +362,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double else { result.Clear(); - other.Storage.MapSubMatrixIndexedTo(result.Storage, (i, j, x) => x*_data[i], 0, 0, other.RowCount, 0, 0, other.ColumnCount, Zeros.AllowSkip, ExistingData.AssumeZeros); + other.Storage.MapSubMatrixIndexedTo(result.Storage, (i, j, x) => x*_data[i], 0, 0, Math.Min(RowCount, other.RowCount), 0, 0, other.ColumnCount, Zeros.AllowSkip, ExistingData.AssumeZeros); } } diff --git a/src/Numerics/LinearAlgebra/Double/Matrix.cs b/src/Numerics/LinearAlgebra/Double/Matrix.cs index e713540c..a35950bf 100644 --- a/src/Numerics/LinearAlgebra/Double/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Double/Matrix.cs @@ -509,7 +509,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double } w.SetDiagonal(s); - return (svd.U * w * svd.VT).Transpose(); + return (svd.U * (w * svd.VT)).Transpose(); } /// diff --git a/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs index 4dfba231..9ba6d093 100644 --- a/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Double/SparseMatrix.cs @@ -901,7 +901,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double else { result.Storage.Clear(); - Storage.MapSubMatrixIndexedTo(result.Storage, (i, j, x) => x*diagonal[j], 0, 0, RowCount, 0, 0, ColumnCount, Zeros.AllowSkip, ExistingData.AssumeZeros); + Storage.MapSubMatrixIndexedTo(result.Storage, (i, j, x) => x*diagonal[j], 0, 0, RowCount, 0, 0, Math.Min(ColumnCount, other.ColumnCount), Zeros.AllowSkip, ExistingData.AssumeZeros); } return; } diff --git a/src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs index 8d1ee883..99a547d6 100644 --- a/src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs @@ -362,7 +362,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single else { result.Clear(); - other.Storage.MapSubMatrixIndexedTo(result.Storage, (i, j, x) => x*_data[i], 0, 0, other.RowCount, 0, 0, other.ColumnCount, Zeros.AllowSkip, ExistingData.AssumeZeros); + other.Storage.MapSubMatrixIndexedTo(result.Storage, (i, j, x) => x*_data[i], 0, 0, Math.Min(RowCount, other.RowCount), 0, 0, other.ColumnCount, Zeros.AllowSkip, ExistingData.AssumeZeros); } } diff --git a/src/Numerics/LinearAlgebra/Single/Matrix.cs b/src/Numerics/LinearAlgebra/Single/Matrix.cs index a2448d37..4538ba9b 100644 --- a/src/Numerics/LinearAlgebra/Single/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Single/Matrix.cs @@ -510,7 +510,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single } w.SetDiagonal(s); - return (svd.U * w * svd.VT).Transpose(); + return (svd.U * (w * svd.VT)).Transpose(); } /// diff --git a/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs b/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs index 2d6fc70f..1318f9e1 100644 --- a/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs +++ b/src/Numerics/LinearAlgebra/Single/SparseMatrix.cs @@ -905,7 +905,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single else { result.Storage.Clear(); - Storage.MapSubMatrixIndexedTo(result.Storage, (i, j, x) => x*diagonal[j], 0, 0, RowCount, 0, 0, ColumnCount, Zeros.AllowSkip, ExistingData.AssumeZeros); + Storage.MapSubMatrixIndexedTo(result.Storage, (i, j, x) => x*diagonal[j], 0, 0, RowCount, 0, 0, Math.Min(ColumnCount, other.ColumnCount), Zeros.AllowSkip, ExistingData.AssumeZeros); } return; }