amatrix2.cpp

来自「微软的基于HMM的人脸识别原代码, 非常经典的说」· C++ 代码 · 共 540 行 · 第 1/2 页

CPP
540
字号
/*M///////////////////////////////////////////////////////////////////////////////////////
//
//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
//  By downloading, copying, installing or using the software you agree to this license.
//  If you do not agree to this license, do not download, install,
//  copy or use the software.
//
//
//                        Intel License Agreement
//                For Open Source Computer Vision Library
//
// Copyright (C) 2000, Intel Corporation, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
//   * Redistribution's of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//
//   * Redistribution's in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//
//   * The name of Intel Corporation may not be used to endorse or promote products
//     derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#define DOT     0
#define CROSS   1
#define TRACE   2
#define MT      3
#define PP      4
#define EV      5
#define DET     6

#include "CvmTest.h"
#include <float.h>
#define PI  3.141593f
#define FEPS 1.0e-5
#define DEPS 1.0e-10

/* Testing parameters */
static char* func_names[] =
{
    "cvmDotProduct",
    "cvmCrossProduct",
    "cvmTrace",
    "cvmMulTransposed",
    "cvmPerspectiveProject",
	"cvmEigenVV",
	"cvmDet"
};

static char* test_desc = "Matrix - Matrix operations (2)";
static int max_length, length1, length2, ntests;
static int step;
static int read_param = 0;
static int test_type=6;

#include "_cvMatrixTestFunctions.cpp"

static int fcaMatrMatr2( void* prm )
{
    int i, j, it;
    const int nh = 20;
    int        Errors = 0;
    long lParam = (long)prm;
    double result, result0;
    CvMat fSrc1, fSrc2, fDst1, fDst2, dSrc1, dSrc2, dDst1, dDst2, dDst1a, dDst2a;
    CvMatArray fSrc, dSrc, fDst, dDst;
    AtsRandState state, stt;
      
    /* Initialization global parameters */
    if( !read_param )
    {
        /* Determine which tests are needed to run */
        trsCaseRead( &test_type, "/D/C/T/M/P/E/DET/a", "a",
        "a - all, D - dot product, C - cross product, T - trace, M - multiply transpose, "
        "P - perspective projection, E - eigen values and vectors, DET - determinant" );
        
        /* Reading test-parameters */
        trsiRead( &ntests,     "25", " number of tests" );
        trsiRead( &max_length, "32", " maximal size of matrices" );
        read_param = 1;
    }
    if((test_type!=7)&&(test_type!=lParam)) return TRS_UNDEF;

    atsRandInit( &state, -256.0, 256.0, 10 );
    atsRandInit( &stt, 1.001, max_length+0.999, 13 );

    for( it=0; it<ntests; it++ )
    {

        switch( lParam )
        {
		case DOT:
                length1 = atsRand32s( &stt );

                fSrc1 = cvMat(length1, 1, CV_MAT32F, NULL);
                fSrc2 = cvMat(length1, 1, CV_MAT32F, NULL);
                dSrc1 = cvMat(length1, 1, CV_MAT64D, NULL);
                dSrc2 = cvMat(length1, 1, CV_MAT64D, NULL);
            	cvmAlloc(&fSrc1);
            	cvmAlloc(&fSrc2);
            	cvmAlloc(&dSrc1);
            	cvmAlloc(&dSrc2);

                atsbRand32f( &state, fSrc1.data.fl, length1 );
                atsbRand32f( &state, fSrc2.data.fl, length1 );
                __fl2db( fSrc1.data.fl, dSrc1.data.db, length1 );
                __fl2db( fSrc2.data.fl, dSrc2.data.db, length1 );
                result  = cvmDotProduct( &fSrc1, &fSrc2 );
                result0 =  __DotProduct( dSrc1.data.db, dSrc2.data.db, length1 );
                if( fabs( ( result - result0 )/result0 ) > FEPS ) Errors++;
        
                atsbRand64d( &state, dSrc1.data.db, length1 );
                atsbRand64d( &state, dSrc2.data.db, length1 );
                result  = cvmDotProduct( &dSrc1, &dSrc2 );
                result0 =  __DotProduct( dSrc1.data.db, dSrc2.data.db, length1 );
                if( fabs( ( result - result0 )/result0 ) > DEPS ) Errors++;

                cvmFree(&fSrc1);
                cvmFree(&fSrc2);
                cvmFree(&dSrc1);
                cvmFree(&dSrc2);
            break;

		case CROSS:
                fSrc1 = cvMat(3, 1, CV_MAT3x1_32F, NULL);
                fSrc2 = cvMat(3, 1, CV_MAT3x1_32F, NULL);
                dSrc1 = cvMat(3, 1, CV_MAT3x1_64D, NULL);
                dSrc2 = cvMat(3, 1, CV_MAT3x1_64D, NULL);
                fDst1 = cvMat(3, 1, CV_MAT3x1_32F, NULL);
                fDst2 = cvMat(3, 1, CV_MAT3x1_32F, NULL);
                dDst1 = cvMat(3, 1, CV_MAT3x1_64D, NULL);
                dDst2 = cvMat(3, 1, CV_MAT3x1_64D, NULL);
            	cvmAlloc(&fSrc1);
            	cvmAlloc(&fSrc2);
            	cvmAlloc(&dSrc1);
            	cvmAlloc(&dSrc2);
            	cvmAlloc(&fDst1);
            	cvmAlloc(&fDst2);
            	cvmAlloc(&dDst1);
            	cvmAlloc(&dDst2);

                atsbRand32f( &state, fSrc1.data.fl, 3 );
                atsbRand32f( &state, fSrc2.data.fl, 3 );
                __fl2db( fSrc1.data.fl, dSrc1.data.db, 3 );
                __fl2db( fSrc2.data.fl, dSrc2.data.db, 3 );
                __CrossProduct( dSrc1.data.db, dSrc2.data.db, dDst2.data.db );
                cvmCrossProduct( &fSrc1, &fSrc2, &fDst1 );
                __fl2db( fDst1.data.fl, dDst1.data.db, 3 );
                Errors += atsCompDoublePrec( dDst1.data.db ,dDst2.data.db, 3, FEPS );
        
                cvmFree(&fSrc1);
                cvmFree(&fSrc2);
                cvmFree(&dSrc1);
                cvmFree(&dSrc2);
                cvmFree(&fDst1);
                cvmFree(&fDst2);
                cvmFree(&dDst1);
                cvmFree(&dDst2);
            break;

        case TRACE:
                length1 = atsRand32s( &stt );
                length2 = atsRand32s( &stt );

                fSrc1 = cvMat(length1, length2, CV_MAT32F, NULL);
                dSrc1 = cvMat(length1, length2, CV_MAT64D, NULL);
            	cvmAlloc(&fSrc1);
            	cvmAlloc(&dSrc1);

                atsbRand32f( &state, fSrc1.data.fl, length1*length2 );
                __fl2db( fSrc1.data.fl, dSrc1.data.db, length1*length2 );
                result  = cvmTrace( &fSrc1 );
                result0 =  __Trace( dSrc1.data.db, length1, length2 );
                if( fabs( ( result - result0 )/result0 ) > FEPS ) Errors++;
        
                atsbRand64d( &state, dSrc1.data.db, length1*length2 );
                result  = cvmTrace( &dSrc1 );
                result0 =  __Trace( dSrc1.data.db, length1, length2 );
                if( fabs( ( result - result0 )/result0 ) > DEPS ) Errors++;

                cvmFree(&fSrc1);
                cvmFree(&dSrc1);
            break;

        case MT:
                length1 = atsRand32s( &stt );
                length2 = atsRand32s( &stt );

                fSrc1 = cvMat(length1, length2, CV_MAT32F, NULL);
                fDst1 = cvMat(length1, length1, CV_MAT32F, NULL);
                fDst2 = cvMat(length2, length2, CV_MAT32F, NULL);
                dSrc1 = cvMat(length1, length2, CV_MAT64D, NULL);
                dDst1 = cvMat(length1, length1, CV_MAT64D, NULL);
                dDst2 = cvMat(length2, length2, CV_MAT64D, NULL);
                dDst1a= cvMat(length1, length1, CV_MAT64D, NULL);
                dDst2a= cvMat(length2, length2, CV_MAT64D, NULL);
            	cvmAlloc(&fSrc1);
            	cvmAlloc(&dSrc1);
            	cvmAlloc(&fDst1);
            	cvmAlloc(&fDst2);
            	cvmAlloc(&dDst1);
            	cvmAlloc(&dDst2);
            	cvmAlloc(&dDst1a);
            	cvmAlloc(&dDst2a);

                atsbRand32f( &state, fSrc1.data.fl, length1*length2 );
                __fl2db( fSrc1.data.fl, dSrc1.data.db, length1*length2 );
                cvmMulTransposed( &fSrc1, &fDst1, 0 );
                __MulTrans( dSrc1.data.db, dDst1.data.db, length1, length2, 0 );
                for( i=0; i<length1*length1; i++ )
                {
                    double r1 = (double)fDst1.data.fl[i];
                    double r2 =         dDst1.data.db[i];
                    if( fabs( ( r1 - r2 )/r2 ) > 50.0*FEPS ) { Errors++;/* printf( " fl., var. 1:  %g  %g  err = %g\n", r1, r2, fabs( ( r1 - r2 )/r2 ) );*/ }
                }
        
                cvmMulTransposed( &fSrc1, &fDst2, 1 );
                __MulTrans( dSrc1.data.db, dDst2.data.db, length1, length2, 1 );
                for( i=0; i<length2*length2; i++ )
                {
                    double r1 = (double)fDst2.data.fl[i];
                    double r2 =         dDst2.data.db[i];
                    if( fabs( ( r1 - r2 )/r2 ) > 50.0*FEPS ) { Errors++;/* printf( " fl., var. 2:  %g  %g  err = %g\n", r1, r2, fabs( ( r1 - r2 )/r2 ) );*/ }
                }
        
                atsbRand64d( &state, dSrc1.data.db, length1*length2 );
                cvmMulTransposed( &dSrc1, &dDst1a, 0 );
                __MulTrans( dSrc1.data.db, dDst1.data.db, length1, length2, 0 );
                for( i=0; i<length1*length1; i++ )
                {
                    double r1 = dDst1a.data.db[i];
                    double r2 =  dDst1.data.db[i];
                    if( fabs( ( r1 - r2 )/r2 ) > DEPS ) { Errors++;/* printf( " db., var. 1:  %g  %g  err = %g\n", r1, r2, fabs( ( r1 - r2 )/r2 ) ); */}
                }
        
                cvmMulTransposed( &dSrc1, &dDst2a, 1 );
                __MulTrans( dSrc1.data.db, dDst2.data.db, length1, length2, 1 );
                for( i=0; i<length2*length2; i++ )
                {
                    double r1 = dDst2a.data.db[i];
                    double r2 =  dDst2.data.db[i];
                    if( fabs( ( r1 - r2 )/r2 ) > DEPS ) { Errors++;/* printf( " db., var. 2:  %g  %g  err = %g\n", r1, r2, fabs( ( r1 - r2 )/r2 ) ); */}
                }

                cvmFree(&fSrc1);
                cvmFree(&dSrc1);
                cvmFree(&fDst1);
                cvmFree(&dDst1);
                cvmFree(&fDst2);
                cvmFree(&dDst2);
                cvmFree(&dDst1a);
                cvmFree(&dDst2a);
            break;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?