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.
///