From: Kevin Boyd Date: Mon, 22 Jul 2019 19:34:17 +0000 (-0400) Subject: Add transpose operation to Matrix3x3 X-Git-Url: http://biod.pnpi.spb.ru/gitweb/?a=commitdiff_plain;h=6941eb5a942716770ef2b27dade706951b3405a1;p=alexxy%2Fgromacs.git Add transpose operation to Matrix3x3 refs #2976 Change-Id: I8f0ce04b18be1e8b119de02cb6b52b3314cd67eb --- diff --git a/src/gromacs/math/matrix.h b/src/gromacs/math/matrix.h index 665fbe77ab..b84c84b59c 100644 --- a/src/gromacs/math/matrix.h +++ b/src/gromacs/math/matrix.h @@ -80,6 +80,15 @@ constexpr real trace(Matrix3x3ConstSpan matrixView) { return matrixView(0, 0) + matrixView(1, 1) + matrixView(2, 2); } + +//! Calculate the transpose of a 3x3 matrix, from its view +static Matrix3x3 transpose(Matrix3x3ConstSpan matrixView) +{ + + return Matrix3x3({matrixView(0, 0), matrixView(1, 0), matrixView(2, 0), + matrixView(0, 1), matrixView(1, 1), matrixView(2, 1), + matrixView(0, 2), matrixView(1, 2), matrixView(2, 2)}); +} } // namespace gmx #endif diff --git a/src/gromacs/math/tests/matrix.cpp b/src/gromacs/math/tests/matrix.cpp index 0d75840872..92fb5c00a2 100644 --- a/src/gromacs/math/tests/matrix.cpp +++ b/src/gromacs/math/tests/matrix.cpp @@ -168,6 +168,40 @@ TEST_F(MatrixTest, traceWorks) EXPECT_EQ(trace(mat), 3.75); } +TEST_F(MatrixTest, transposeWorks) +{ + const Matrix3x3 asymmetricMat = {{1, 2, 3, + 4, 5, 6, + 7, 8, 9}}; + + const Matrix3x3 transposedAsymmetricMat = transpose(asymmetricMat); + EXPECT_EQ(asymmetricMat(0, 0), transposedAsymmetricMat(0, 0)); + EXPECT_EQ(asymmetricMat(0, 1), transposedAsymmetricMat(1, 0)); + EXPECT_EQ(asymmetricMat(0, 2), transposedAsymmetricMat(2, 0)); + EXPECT_EQ(asymmetricMat(1, 0), transposedAsymmetricMat(0, 1)); + EXPECT_EQ(asymmetricMat(1, 1), transposedAsymmetricMat(1, 1)); + EXPECT_EQ(asymmetricMat(1, 2), transposedAsymmetricMat(2, 1)); + EXPECT_EQ(asymmetricMat(2, 0), transposedAsymmetricMat(0, 2)); + EXPECT_EQ(asymmetricMat(2, 1), transposedAsymmetricMat(1, 2)); + EXPECT_EQ(asymmetricMat(2, 2), transposedAsymmetricMat(2, 2)); + +} + +TEST_F(MatrixTest, transposeOfSymmetricMatrix) +{ + const Matrix3x3 symmetricMat = {{ 1, 2, 3, + 2, 5, 6, + 3, 6, 9}}; + const Matrix3x3 transposedSymmetricMat = transpose(symmetricMat); + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 3; j++) + { + EXPECT_EQ(symmetricMat(i, j), transposedSymmetricMat(i, j)); + } + } +} + } // namespace } // namespace test