16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M///////////////////////////////////////////////////////////////////////////////////////
26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  By downloading, copying, installing or using the software you agree to this license.
66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  If you do not agree to this license, do not download, install,
76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  copy or use the software.
86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                        Intel License Agreement
116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                For Open Source Computer Vision Library
126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved.
146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners.
156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification,
176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met:
186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's of source code must retain the above copyright notice,
206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer.
216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's in binary form must reproduce the above copyright notice,
236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer in the documentation
246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     and/or other materials provided with the distribution.
256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * The name of Intel Corporation may not be used to endorse or promote products
276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     derived from this software without specific prior written permission.
286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and
306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied
316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed.
326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct,
336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages
346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services;
356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused
366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability,
376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of
386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage.
396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/
416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_cxcore.h"
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*F///////////////////////////////////////////////////////////////////////////////////////
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Names:      icvJacobiEigens_32f, icvJacobiEigens_64d
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Purpose:    Eigenvalues & eigenvectors calculation of a symmetric matrix:
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                A Vi  =  Ei Vi
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Context:
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Parameters: A(n, n) - source symmetric matrix (n - rows & columns number),
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                V(n, n) - matrix of its eigenvectors
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                          (i-th row is an eigenvector Vi),
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                E(n)    - vector of its eigenvalues
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                          (i-th element is an eigenvalue Ei),
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                eps     - accuracy of diagonalization.
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Returns:
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    CV_NO_ERROR or error code
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//    Notes:
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//        1. The functions destroy source matrix A, so if you need it further, you
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//           have to copy it before the processing.
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//        2. Eigenvalies and eigenvectors are sorted in Ei absolute value descending.
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//        3. Calculation time depends on eps value. If the time isn't very important,
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//           we recommend to set eps = 0.
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//F*/
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*=========================== Single precision function ================================*/
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvJacobiEigens_32f(float *A, float *V, float *E, int n, float eps)
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, j, k, ind, iters = 0;
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float *AA = A, *VV = V;
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double Amax, anorm = 0, ax;
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( A == NULL || V == NULL || E == NULL )
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NULLPTR_ERR;
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( n <= 0 )
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADSIZE_ERR;
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( eps < DBL_EPSILON )
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        eps = DBL_EPSILON;
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*-------- Prepare --------*/
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < n; i++, VV += n, AA += n )
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( j = 0; j < i; j++ )
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            double Am = AA[j];
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            anorm += Am * Am;
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( j = 0; j < n; j++ )
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            VV[j] = 0.f;
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        VV[i] = 1.f;
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    anorm = sqrt( anorm + anorm );
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ax = anorm * eps / n;
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Amax = anorm;
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    while( Amax > ax && iters++ < 100 )
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        Amax /= n;
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        do                      /* while (ind) */
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int p, q;
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float *V1 = V, *A1 = A;
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ind = 0;
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( p = 0; p < n - 1; p++, A1 += n, V1 += n )
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                float *A2 = A + n * (p + 1), *V2 = V + n * (p + 1);
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( q = p + 1; q < n; q++, A2 += n, V2 += n )
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    double x, y, c, s, c2, s2, a;
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    float *A3, Apq = A1[q], App, Aqq, Aip, Aiq, Vpi, Vqi;
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( fabs( Apq ) < Amax )
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        continue;
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    ind = 1;
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    /*---- Calculation of rotation angle's sine & cosine ----*/
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    App = A1[p];
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    Aqq = A2[q];
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    y = 5.0e-1 * (App - Aqq);
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    x = -Apq / sqrt( (double)Apq * Apq + (double)y * y );
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( y < 0.0 )
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        x = -x;
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    s = x / sqrt( 2.0 * (1.0 + sqrt( 1.0 - (double)x * x )));
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    s2 = s * s;
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    c = sqrt( 1.0 - s2 );
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    c2 = c * c;
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    a = 2.0 * Apq * c * s;
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    /*---- Apq annulation ----*/
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    A3 = A;
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    for( i = 0; i < p; i++, A3 += n )
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Aip = A3[p];
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Aiq = A3[q];
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Vpi = V1[i];
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Vqi = V2[i];
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        A3[p] = (float) (Aip * c - Aiq * s);
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        A3[q] = (float) (Aiq * c + Aip * s);
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        V1[i] = (float) (Vpi * c - Vqi * s);
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        V2[i] = (float) (Vqi * c + Vpi * s);
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    for( ; i < q; i++, A3 += n )
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Aip = A1[i];
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Aiq = A3[q];
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Vpi = V1[i];
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Vqi = V2[i];
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        A1[i] = (float) (Aip * c - Aiq * s);
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        A3[q] = (float) (Aiq * c + Aip * s);
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        V1[i] = (float) (Vpi * c - Vqi * s);
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        V2[i] = (float) (Vqi * c + Vpi * s);
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    for( ; i < n; i++ )
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Aip = A1[i];
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Aiq = A2[i];
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Vpi = V1[i];
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Vqi = V2[i];
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        A1[i] = (float) (Aip * c - Aiq * s);
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        A2[i] = (float) (Aiq * c + Aip * s);
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        V1[i] = (float) (Vpi * c - Vqi * s);
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        V2[i] = (float) (Vqi * c + Vpi * s);
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    A1[p] = (float) (App * c2 + Aqq * s2 - a);
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    A2[q] = (float) (App * s2 + Aqq * c2 + a);
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    A1[q] = A2[p] = 0.0f;
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }               /*q */
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                   /*p */
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( ind );
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        Amax /= n;
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* while ( Amax > ax ) */
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0, k = 0; i < n; i++, k += n + 1 )
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        E[i] = A[k];
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*printf(" M = %d\n", M); */
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* -------- ordering -------- */
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < n; i++ )
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int m = i;
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        float Em = (float) fabs( E[i] );
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( j = i + 1; j < n; j++ )
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float Ej = (float) fabs( E[j] );
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            m = (Em < Ej) ? j : m;
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            Em = (Em < Ej) ? Ej : Em;
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( m != i )
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int l;
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            float b = E[i];
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            E[i] = E[m];
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            E[m] = b;
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( j = 0, k = i * n, l = m * n; j < n; j++, k++, l++ )
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                b = V[k];
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                V[k] = V[l];
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                V[l] = b;
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_NO_ERR;
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*=========================== Double precision function ================================*/
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic CvStatus CV_STDCALL
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennicvJacobiEigens_64d(double *A, double *V, double *E, int n, double eps)
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i, j, k, p, q, ind, iters = 0;
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double *A1 = A, *V1 = V, *A2 = A, *V2 = V;
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double Amax = 0.0, anorm = 0.0, ax;
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( A == NULL || V == NULL || E == NULL )
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_NULLPTR_ERR;
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( n <= 0 )
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return CV_BADSIZE_ERR;
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( eps < DBL_EPSILON )
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        eps = DBL_EPSILON;
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*-------- Prepare --------*/
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < n; i++, V1 += n, A1 += n )
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( j = 0; j < i; j++ )
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            double Am = A1[j];
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            anorm += Am * Am;
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( j = 0; j < n; j++ )
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            V1[j] = 0.0;
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        V1[i] = 1.0;
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    anorm = sqrt( anorm + anorm );
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ax = anorm * eps / n;
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Amax = anorm;
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    while( Amax > ax && iters++ < 100 )
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        Amax /= n;
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        do                      /* while (ind) */
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ind = 0;
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            A1 = A;
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            V1 = V;
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( p = 0; p < n - 1; p++, A1 += n, V1 += n )
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                A2 = A + n * (p + 1);
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                V2 = V + n * (p + 1);
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( q = p + 1; q < n; q++, A2 += n, V2 += n )
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    double x, y, c, s, c2, s2, a;
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    double *A3, Apq, App, Aqq, App2, Aqq2, Aip, Aiq, Vpi, Vqi;
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( fabs( A1[q] ) < Amax )
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        continue;
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    Apq = A1[q];
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    ind = 1;
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    /*---- Calculation of rotation angle's sine & cosine ----*/
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    App = A1[p];
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    Aqq = A2[q];
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    y = 5.0e-1 * (App - Aqq);
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    x = -Apq / sqrt( Apq * Apq + (double)y * y );
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( y < 0.0 )
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        x = -x;
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    s = x / sqrt( 2.0 * (1.0 + sqrt( 1.0 - (double)x * x )));
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    s2 = s * s;
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    c = sqrt( 1.0 - s2 );
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    c2 = c * c;
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    a = 2.0 * Apq * c * s;
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    /*---- Apq annulation ----*/
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    A3 = A;
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    for( i = 0; i < p; i++, A3 += n )
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Aip = A3[p];
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Aiq = A3[q];
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Vpi = V1[i];
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Vqi = V2[i];
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        A3[p] = Aip * c - Aiq * s;
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        A3[q] = Aiq * c + Aip * s;
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        V1[i] = Vpi * c - Vqi * s;
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        V2[i] = Vqi * c + Vpi * s;
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    for( ; i < q; i++, A3 += n )
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Aip = A1[i];
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Aiq = A3[q];
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Vpi = V1[i];
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Vqi = V2[i];
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        A1[i] = Aip * c - Aiq * s;
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        A3[q] = Aiq * c + Aip * s;
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        V1[i] = Vpi * c - Vqi * s;
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        V2[i] = Vqi * c + Vpi * s;
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    for( ; i < n; i++ )
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Aip = A1[i];
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Aiq = A2[i];
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Vpi = V1[i];
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        Vqi = V2[i];
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        A1[i] = Aip * c - Aiq * s;
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        A2[i] = Aiq * c + Aip * s;
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        V1[i] = Vpi * c - Vqi * s;
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        V2[i] = Vqi * c + Vpi * s;
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    App2 = App * c2 + Aqq * s2 - a;
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    Aqq2 = App * s2 + Aqq * c2 + a;
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    A1[p] = App2;
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    A2[q] = Aqq2;
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    A1[q] = A2[p] = 0.0;
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }               /*q */
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                   /*p */
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        while( ind );
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                           /* while ( Amax > ax ) */
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0, k = 0; i < n; i++, k += n + 1 )
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        E[i] = A[k];
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* -------- ordering -------- */
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( i = 0; i < n; i++ )
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int m = i;
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double Em = fabs( E[i] );
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( j = i + 1; j < n; j++ )
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            double Ej = fabs( E[j] );
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            m = (Em < Ej) ? j : m;
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            Em = (Em < Ej) ? Ej : Em;
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        if( m != i )
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int l;
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            double b = E[i];
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            E[i] = E[m];
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            E[m] = b;
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            for( j = 0, k = i * n, l = m * n; j < n; j++, k++, l++ )
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                b = V[k];
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                V[k] = V[l];
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                V[l] = b;
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_NO_ERR;
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_IMPL void
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RenncvEigenVV( CvArr* srcarr, CvArr* evectsarr, CvArr* evalsarr, double eps )
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_FUNCNAME( "cvEigenVV" );
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __BEGIN__;
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat sstub, *src = (CvMat*)srcarr;
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat estub1, *evects = (CvMat*)evectsarr;
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat estub2, *evals = (CvMat*)evalsarr;
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT( src ))
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( src = cvGetMat( src, &sstub ));
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT( evects ))
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( evects = cvGetMat( evects, &estub1 ));
3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT( evals ))
3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_CALL( evals = cvGetMat( evals, &estub2 ));
3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( src->cols != src->rows )
3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedSizes, "source is not quadratic matrix" );
3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_SIZES_EQ( src, evects) )
3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedSizes, "eigenvectors matrix has inappropriate size" );
3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (evals->rows != src->rows || evals->cols != 1) &&
3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (evals->cols != src->rows || evals->rows != 1))
3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsBadSize, "eigenvalues vector has inappropriate size" );
3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_ARE_TYPES_EQ( src, evects ) || !CV_ARE_TYPES_EQ( src, evals ))
4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnmatchedFormats,
4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        "input matrix, eigenvalues and eigenvectors must have the same type" );
4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !CV_IS_MAT_CONT( src->type & evals->type & evects->type ))
4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_BadStep, "all the matrices must be continuous" );
4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( CV_MAT_TYPE(src->type) == CV_32FC1 )
4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( icvJacobiEigens_32f( src->data.fl,
4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                        evects->data.fl,
4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                        evals->data.fl, src->cols, (float)eps ));
4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else if( CV_MAT_TYPE(src->type) == CV_64FC1 )
4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        IPPI_CALL( icvJacobiEigens_64d( src->data.db,
4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                        evects->data.db,
4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                        evals->data.db, src->cols, eps ));
4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "Only 32fC1 and 64fC1 types are supported" );
4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CHECK_NANS( evects );
4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CHECK_NANS( evals );
4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __END__;
4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file */
432