diff --git a/src/Numerics/LinearAlgebra/Complex/Matrix.cs b/src/Numerics/LinearAlgebra/Complex/Matrix.cs index a3db6c85..e89128d5 100644 --- a/src/Numerics/LinearAlgebra/Complex/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Complex/Matrix.cs @@ -264,7 +264,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// The result of the multiplication. protected override void DoTransposeAndMultiply(Matrix other, Matrix result) { - for (var j = 0; j < RowCount; j++) + for (var j = 0; j < other.RowCount; j++) { for (var i = 0; i < RowCount; i++) { diff --git a/src/Numerics/LinearAlgebra/Complex32/Matrix.cs b/src/Numerics/LinearAlgebra/Complex32/Matrix.cs index 0fbe7008..03f0a0b2 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Matrix.cs @@ -264,7 +264,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// The result of the multiplication. protected override void DoTransposeAndMultiply(Matrix other, Matrix result) { - for (var j = 0; j < RowCount; j++) + for (var j = 0; j < other.RowCount; j++) { for (var i = 0; i < RowCount; i++) { diff --git a/src/Numerics/LinearAlgebra/Double/Matrix.cs b/src/Numerics/LinearAlgebra/Double/Matrix.cs index 0e4e546e..bb599220 100644 --- a/src/Numerics/LinearAlgebra/Double/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Double/Matrix.cs @@ -254,7 +254,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// The result of the multiplication. protected override void DoTransposeAndMultiply(Matrix other, Matrix result) { - for (var j = 0; j < RowCount; j++) + for (var j = 0; j < other.RowCount; j++) { for (var i = 0; i < RowCount; i++) { diff --git a/src/Numerics/LinearAlgebra/Single/Matrix.cs b/src/Numerics/LinearAlgebra/Single/Matrix.cs index 3214c33e..b25b39e0 100644 --- a/src/Numerics/LinearAlgebra/Single/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Single/Matrix.cs @@ -254,7 +254,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single /// The result of the multiplication. protected override void DoTransposeAndMultiply(Matrix other, Matrix result) { - for (var j = 0; j < RowCount; j++) + for (var j = 0; j < other.RowCount; j++) { for (var i = 0; i < RowCount; i++) { diff --git a/src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.Arithmetic.cs b/src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.Arithmetic.cs index 59b40c94..8f6d8d4c 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.Arithmetic.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex/MatrixTests.Arithmetic.cs @@ -545,6 +545,40 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex } } + /// + /// Can transpose and multiply a matrix with differing dimensions. + /// + [Test] + public void CanTransposeAndMultiplyWithDifferingDimensions() + { + var matrixA = TestMatrices["Tall3x2"]; + var matrixB = CreateMatrix(5, 2); + var count = 1; + for (var row = 0; row < matrixB.RowCount; row++) + { + for (var col = 0; col < matrixB.ColumnCount; col++) + { + if (row == col) + { + matrixB[row, col] = count++; + } + } + } + + var matrixC = matrixA.TransposeAndMultiply(matrixB); + + Assert.AreEqual(matrixC.RowCount, matrixA.RowCount); + Assert.AreEqual(matrixC.ColumnCount, matrixB.RowCount); + + for (var i = 0; i < matrixC.RowCount; i++) + { + for (var j = 0; j < matrixC.ColumnCount; j++) + { + AssertHelpers.AlmostEqual(matrixA.Row(i) * matrixB.Row(j), matrixC[i, j], 15); + } + } + } + /// /// Transpose and multiply a matrix with matrix of incompatible size throws ArgumentException. /// diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.Arithmetic.cs b/src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.Arithmetic.cs index cd985e41..baf4b901 100644 --- a/src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.Arithmetic.cs +++ b/src/UnitTests/LinearAlgebraTests/Complex32/MatrixTests.Arithmetic.cs @@ -545,6 +545,40 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32 } } + /// + /// Can transpose and multiply a matrix with differing dimensions. + /// + [Test] + public void CanTransposeAndMultiplyWithDifferingDimensions() + { + var matrixA = TestMatrices["Tall3x2"]; + var matrixB = CreateMatrix(5, 2); + var count = 1; + for (var row = 0; row < matrixB.RowCount; row++) + { + for (var col = 0; col < matrixB.ColumnCount; col++) + { + if (row == col) + { + matrixB[row, col] = count++; + } + } + } + + var matrixC = matrixA.TransposeAndMultiply(matrixB); + + Assert.AreEqual(matrixC.RowCount, matrixA.RowCount); + Assert.AreEqual(matrixC.ColumnCount, matrixB.RowCount); + + for (var i = 0; i < matrixC.RowCount; i++) + { + for (var j = 0; j < matrixC.ColumnCount; j++) + { + AssertHelpers.AlmostEqual(matrixA.Row(i) * matrixB.Row(j), matrixC[i, j], 15); + } + } + } + /// /// Transpose and multiply a matrix with matrix of incompatible size throws ArgumentException. /// diff --git a/src/UnitTests/LinearAlgebraTests/Double/MatrixTests.Arithmetic.cs b/src/UnitTests/LinearAlgebraTests/Double/MatrixTests.Arithmetic.cs index e51816df..1851d1c4 100644 --- a/src/UnitTests/LinearAlgebraTests/Double/MatrixTests.Arithmetic.cs +++ b/src/UnitTests/LinearAlgebraTests/Double/MatrixTests.Arithmetic.cs @@ -540,6 +540,40 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double } } + /// + /// Can transpose and multiply a matrix with differing dimensions. + /// + [Test] + public void CanTransposeAndMultiplyWithDifferingDimensions() + { + var matrixA = TestMatrices["Tall3x2"]; + var matrixB = CreateMatrix(5, 2); + var count = 1; + for (var row = 0; row < matrixB.RowCount; row++) + { + for (var col = 0; col < matrixB.ColumnCount; col++) + { + if (row == col) + { + matrixB[row, col] = count++; + } + } + } + + var matrixC = matrixA.TransposeAndMultiply(matrixB); + + Assert.AreEqual(matrixC.RowCount, matrixA.RowCount); + Assert.AreEqual(matrixC.ColumnCount, matrixB.RowCount); + + for (var i = 0; i < matrixC.RowCount; i++) + { + for (var j = 0; j < matrixC.ColumnCount; j++) + { + AssertHelpers.AlmostEqual(matrixA.Row(i) * matrixB.Row(j), matrixC[i, j], 15); + } + } + } + /// /// Transpose and multiply a matrix with matrix of incompatible size throws ArgumentException. /// diff --git a/src/UnitTests/LinearAlgebraTests/Single/MatrixTests.Arithmetic.cs b/src/UnitTests/LinearAlgebraTests/Single/MatrixTests.Arithmetic.cs index fbb99b45..8e83c950 100644 --- a/src/UnitTests/LinearAlgebraTests/Single/MatrixTests.Arithmetic.cs +++ b/src/UnitTests/LinearAlgebraTests/Single/MatrixTests.Arithmetic.cs @@ -540,6 +540,40 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single } } + /// + /// Can transpose and multiply a matrix with differing dimensions. + /// + [Test] + public void CanTransposeAndMultiplyWithDifferingDimensions() + { + var matrixA = TestMatrices["Tall3x2"]; + var matrixB = CreateMatrix(5, 2); + var count = 1; + for (var row = 0; row < matrixB.RowCount; row++) + { + for (var col = 0; col < matrixB.ColumnCount; col++) + { + if (row == col) + { + matrixB[row, col] = count++; + } + } + } + + var matrixC = matrixA.TransposeAndMultiply(matrixB); + + Assert.AreEqual(matrixC.RowCount, matrixA.RowCount); + Assert.AreEqual(matrixC.ColumnCount, matrixB.RowCount); + + for (var i = 0; i < matrixC.RowCount; i++) + { + for (var j = 0; j < matrixC.ColumnCount; j++) + { + AssertHelpers.AlmostEqual(matrixA.Row(i) * matrixB.Row(j), matrixC[i, j], 15); + } + } + } + /// /// Transpose and multiply a matrix with matrix of incompatible size throws ArgumentException. ///