fixed bug #2106; added test
authorVadim Pisarevsky <no@email>
Wed, 27 Jun 2012 20:51:48 +0000 (20:51 +0000)
committerVadim Pisarevsky <no@email>
Wed, 27 Jun 2012 20:51:48 +0000 (20:51 +0000)
modules/core/src/matop.cpp
modules/core/test/test_operations.cpp

index c7fb841..736984e 100644 (file)
@@ -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);
 }
 
index 62dbc9d..5297f95 100644 (file)
@@ -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)
     {