fixed potential bug in cv::eigen()
authorVadim Pisarevsky <no@email>
Thu, 26 Jan 2012 19:41:59 +0000 (19:41 +0000)
committerVadim Pisarevsky <no@email>
Thu, 26 Jan 2012 19:41:59 +0000 (19:41 +0000)
modules/core/src/lapack.cpp

index 968000b..95c7529 100644 (file)
@@ -245,9 +245,7 @@ JacobiImpl_( _Tp* A, size_t astep, _Tp* W, _Tp* V, size_t vstep, int n, uchar* b
     
     int iters, maxIters = n*n*30;
     
-    _Tp* maxSR = (_Tp*)alignPtr(buf, sizeof(_Tp));
-    _Tp* maxSC = maxSR + n;
-    int* indR = (int*)(maxSC + n);
+    int* indR = (int*)alignPtr(buf, sizeof(int));
     int* indC = indR + n;
     _Tp mv = (_Tp)0;
     
@@ -262,7 +260,6 @@ JacobiImpl_( _Tp* A, size_t astep, _Tp* W, _Tp* V, size_t vstep, int n, uchar* b
                 if( mv < val )
                     mv = val, m = i;
             }
-            maxSR[k] = mv;
             indR[k] = m;
         }
         if( k > 0 )
@@ -273,7 +270,6 @@ JacobiImpl_( _Tp* A, size_t astep, _Tp* W, _Tp* V, size_t vstep, int n, uchar* b
                 if( mv < val )
                     mv = val, m = i;
             }
-            maxSC[k] = mv;
             indC[k] = m;
         }
     }
@@ -281,16 +277,16 @@ JacobiImpl_( _Tp* A, size_t astep, _Tp* W, _Tp* V, size_t vstep, int n, uchar* b
     if( n > 1 ) for( iters = 0; iters < maxIters; iters++ )
     {
         // find index (k,l) of pivot p
-        for( k = 0, mv = maxSR[0], i = 1; i < n-1; i++ )
+        for( k = 0, mv = std::abs(A[indR[0]]), i = 1; i < n-1; i++ )
         {
-            _Tp val = maxSR[i];
+            _Tp val = std::abs(A[astep*i + indR[i]]);
             if( mv < val )
                 mv = val, k = i;
         }
         int l = indR[k];
         for( i = 1; i < n; i++ )
         {
-            _Tp val = maxSC[i];
+            _Tp val = std::abs(A[astep*indC[i] + i]);
             if( mv < val )
                 mv = val, k = indC[i], l = i;
         }
@@ -341,7 +337,6 @@ JacobiImpl_( _Tp* A, size_t astep, _Tp* W, _Tp* V, size_t vstep, int n, uchar* b
                     if( mv < val )
                         mv = val, m = i;
                 }
-                maxSR[idx] = mv;
                 indR[idx] = m;
             }
             if( idx > 0 )
@@ -352,7 +347,6 @@ JacobiImpl_( _Tp* A, size_t astep, _Tp* W, _Tp* V, size_t vstep, int n, uchar* b
                     if( mv < val )
                         mv = val, m = i;
                 }
-                maxSC[idx] = mv;
                 indC[idx] = m;
             }
         }