diff --git a/modules/core/src/matop.cpp b/modules/core/src/matop.cpp index c7fb84133a8fa8f11a27e6360baa4ace49bd5af2..736984e85d2d528e740a873d35c30237121c0063 100644 --- a/modules/core/src/matop.cpp +++ b/modules/core/src/matop.cpp @@ -1491,7 +1491,9 @@ void MatOp_GEMM::multiply(const MatExpr& e, double s, MatExpr& res) const void MatOp_GEMM::transpose(const MatExpr& e, MatExpr& res) const { res = e; - res.flags ^= CV_GEMM_A_T | CV_GEMM_B_T | CV_GEMM_C_T; + res.flags = (!(e.flags & CV_GEMM_A_T) ? CV_GEMM_B_T : 0) | + (!(e.flags & CV_GEMM_B_T) ? CV_GEMM_A_T : 0) | + (!(e.flags & CV_GEMM_C_T) ? CV_GEMM_C_T : 0); swap(res.a, res.b); } diff --git a/modules/core/test/test_operations.cpp b/modules/core/test/test_operations.cpp index 62dbc9d649af1d1c0652e4f998e9ab485b93f2e2..5297f95f24335d103d5c4d9c9b2d0a725fbbb3bc 100644 --- a/modules/core/test/test_operations.cpp +++ b/modules/core/test/test_operations.cpp @@ -758,6 +758,13 @@ bool CV_OperationsTest::TestTemplateMat() split(mf2, mvf2); CV_Assert( norm(mvf2[0], mvf[0], CV_C) == 0 && norm(mvf2[1], mvf[1], CV_C) == 0 ); + + { + Mat a(2,2,CV_32F,1.f); + Mat b(1,2,CV_32F,1.f); + Mat c = (a*b.t()).t(); + CV_Assert( norm(c, CV_L1) == 4. ); + } } catch (const test_excep& e) {