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#ifndef _CV_MATRIX_H_ 436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define _CV_MATRIX_H_ 446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvCopyVector( src, dst, len ) memcpy( (dst), (src), (len)*sizeof((dst)[0])) 466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvSetZero( dst, len ) memset( (dst), 0, (len)*sizeof((dst)[0])) 476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvCopyVector_32f( src, len, dst ) memcpy((dst),(src),(len)*sizeof(float)) 496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvSetZero_32f( dst, cols, rows ) memset((dst),0,(rows)*(cols)*sizeof(float)) 506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvCopyVector_64d( src, len, dst ) memcpy((dst),(src),(len)*sizeof(double)) 516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvSetZero_64d( dst, cols, rows ) memset((dst),0,(rows)*(cols)*sizeof(double)) 526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvCopyMatrix_32f( src, w, h, dst ) memcpy((dst),(src),(w)*(h)*sizeof(float)) 536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvCopyMatrix_64d( src, w, h, dst ) memcpy((dst),(src),(w)*(h)*sizeof(double)) 546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvCreateVector_32f( len ) (float*)cvAlloc( (len)*sizeof(float)) 566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvCreateVector_64d( len ) (double*)cvAlloc( (len)*sizeof(double)) 576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvCreateMatrix_32f( w, h ) (float*)cvAlloc( (w)*(h)*sizeof(float)) 586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvCreateMatrix_64d( w, h ) (double*)cvAlloc( (w)*(h)*sizeof(double)) 596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvDeleteVector( vec ) cvFree( &(vec) ) 616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvDeleteMatrix icvDeleteVector 626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvAddMatrix_32f( src1, src2, dst, w, h ) \ 646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvAddVector_32f( (src1), (src2), (dst), (w)*(h)) 656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvSubMatrix_32f( src1, src2, dst, w, h ) \ 676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvSubVector_32f( (src1), (src2), (dst), (w)*(h)) 686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvNormVector_32f( src, len ) \ 706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sqrt(icvDotProduct_32f( src, src, len )) 716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvNormVector_64d( src, len ) \ 736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sqrt(icvDotProduct_64d( src, src, len )) 746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvDeleteMatrix icvDeleteVector 776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvCheckVector_64f( ptr, len ) 796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvCheckVector_32f( ptr, len ) 806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE double icvSum_32f( const float* src, int len ) 826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double s = 0; 846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 0; i < len; i++ ) s += src[i]; 856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_64f( &s, 1 ); 876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return s; 896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE double icvDotProduct_32f( const float* src1, const float* src2, int len ) 926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double s = 0; 946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 0; i < len; i++ ) s += src1[i]*src2[i]; 956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_64f( &s, 1 ); 976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return s; 996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE double icvDotProduct_64f( const double* src1, const double* src2, int len ) 1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double s = 0; 1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 0; i < len; i++ ) s += src1[i]*src2[i]; 1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_64f( &s, 1 ); 1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return s; 1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvMulVectors_32f( const float* src1, const float* src2, 1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn float* dst, int len ) 1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; 1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < len; i++ ) 1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = src1[i] * src2[i]; 1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_32f( dst, len ); 1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvMulVectors_64d( const double* src1, const double* src2, 1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double* dst, int len ) 1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; 1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < len; i++ ) 1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = src1[i] * src2[i]; 1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_64f( dst, len ); 1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvAddVector_32f( const float* src1, const float* src2, 1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn float* dst, int len ) 1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; 1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < len; i++ ) 1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = src1[i] + src2[i]; 1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_32f( dst, len ); 1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvAddVector_64d( const double* src1, const double* src2, 1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double* dst, int len ) 1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; 1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < len; i++ ) 1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = src1[i] + src2[i]; 1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_64f( dst, len ); 1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvSubVector_32f( const float* src1, const float* src2, 1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn float* dst, int len ) 1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; 1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < len; i++ ) 1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = src1[i] - src2[i]; 1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_32f( dst, len ); 1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvSubVector_64d( const double* src1, const double* src2, 1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double* dst, int len ) 1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; 1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < len; i++ ) 1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = src1[i] - src2[i]; 1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_64f( dst, len ); 1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvAddMatrix_64d( src1, src2, dst, w, h ) \ 1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvAddVector_64d( (src1), (src2), (dst), (w)*(h)) 1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvSubMatrix_64d( src1, src2, dst, w, h ) \ 1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvSubVector_64d( (src1), (src2), (dst), (w)*(h)) 1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvSetIdentity_32f( float* dst, int w, int h ) 1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, len = MIN( w, h ); 1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvSetZero_32f( dst, w, h ); 1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; len--; i += w+1 ) 1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = 1.f; 1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvSetIdentity_64d( double* dst, int w, int h ) 1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, len = MIN( w, h ); 1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvSetZero_64d( dst, w, h ); 1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; len--; i += w+1 ) 1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = 1.; 1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvTrace_32f( const float* src, int w, int h, float* trace ) 2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, len = MIN( w, h ); 2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double sum = 0; 2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; len--; i += w+1 ) 2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sum += src[i]; 2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *trace = (float)sum; 2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_64f( &sum, 1 ); 2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvTrace_64d( const double* src, int w, int h, double* trace ) 2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, len = MIN( w, h ); 2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double sum = 0; 2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; len--; i += w+1 ) 2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn sum += src[i]; 2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *trace = sum; 2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_64f( &sum, 1 ); 2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvScaleVector_32f( const float* src, float* dst, 2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int len, double scale ) 2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; 2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < len; i++ ) 2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = (float)(src[i]*scale); 2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_32f( dst, len ); 2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvScaleVector_64d( const double* src, double* dst, 2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int len, double scale ) 2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; 2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < len; i++ ) 2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = src[i]*scale; 2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_64f( dst, len ); 2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvTransposeMatrix_32f( const float* src, int w, int h, float* dst ) 2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, j; 2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < w; i++ ) 2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < h; j++ ) 2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *dst++ = src[j*w + i]; 2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_32f( dst, w*h ); 2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvTransposeMatrix_64d( const double* src, int w, int h, double* dst ) 2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, j; 2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < w; i++ ) 2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < h; j++ ) 2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *dst++ = src[j*w + i]; 2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_64f( dst, w*h ); 2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvDetMatrix3x3_64d( const double* mat, double* det ) 2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn #define m(y,x) mat[(y)*3 + (x)] 2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn *det = m(0,0)*(m(1,1)*m(2,2) - m(1,2)*m(2,1)) - 2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m(0,1)*(m(1,0)*m(2,2) - m(1,2)*m(2,0)) + 2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m(0,2)*(m(1,0)*m(2,1) - m(1,1)*m(2,0)); 2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn #undef m 2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_64f( det, 1 ); 2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvMulMatrix_32f( const float* src1, int w1, int h1, 2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const float* src2, int w2, int h2, 2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn float* dst ) 2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, j, k; 2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( w1 != h2 ) 2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn assert(0); 2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return; 2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < h1; i++, src1 += w1, dst += w2 ) 2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < w2; j++ ) 2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double s = 0; 2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( k = 0; k < w1; k++ ) 3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn s += src1[k]*src2[j + k*w2]; 3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[j] = (float)s; 3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_32f( dst, h1*w2 ); 3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvMulMatrix_64d( const double* src1, int w1, int h1, 3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn const double* src2, int w2, int h2, 3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double* dst ) 3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i, j, k; 3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( w1 != h2 ) 3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn assert(0); 3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return; 3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < h1; i++, src1 += w1, dst += w2 ) 3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( j = 0; j < w2; j++ ) 3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn double s = 0; 3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( k = 0; k < w1; k++ ) 3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn s += src1[k]*src2[j + k*w2]; 3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[j] = s; 3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvCheckVector_64f( dst, h1*w2 ); 3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvTransformVector_32f( matr, src, dst, w, h ) \ 3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvMulMatrix_32f( matr, w, h, src, 1, w, dst ) 3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvTransformVector_64d( matr, src, dst, w, h ) \ 3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvMulMatrix_64d( matr, w, h, src, 1, w, dst ) 3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvScaleMatrix_32f( src, dst, w, h, scale ) \ 3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvScaleVector_32f( (src), (dst), (w)*(h), (scale) ) 3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvScaleMatrix_64d( src, dst, w, h, scale ) \ 3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn icvScaleVector_64d( (src), (dst), (w)*(h), (scale) ) 3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define icvDotProduct_64d icvDotProduct_64f 3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvInvertMatrix_64d( double* A, int n, double* invA ) 3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat Am = cvMat( n, n, CV_64F, A ); 3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat invAm = cvMat( n, n, CV_64F, invA ); 3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvInvert( &Am, &invAm, CV_SVD ); 3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvMulTransMatrixR_64d( double* src, int width, int height, double* dst ) 3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat srcMat = cvMat( height, width, CV_64F, src ); 3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat dstMat = cvMat( width, width, CV_64F, dst ); 3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvMulTransposed( &srcMat, &dstMat, 1 ); 3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvMulTransMatrixL_64d( double* src, int width, int height, double* dst ) 3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat srcMat = cvMat( height, width, CV_64F, src ); 3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat dstMat = cvMat( height, height, CV_64F, dst ); 3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvMulTransposed( &srcMat, &dstMat, 0 ); 3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvMulTransMatrixR_32f( float* src, int width, int height, float* dst ) 3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat srcMat = cvMat( height, width, CV_32F, src ); 3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat dstMat = cvMat( width, width, CV_32F, dst ); 3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvMulTransposed( &srcMat, &dstMat, 1 ); 3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvMulTransMatrixL_32f( float* src, int width, int height, float* dst ) 3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat srcMat = cvMat( height, width, CV_32F, src ); 3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn CvMat dstMat = cvMat( height, height, CV_32F, dst ); 3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cvMulTransposed( &srcMat, &dstMat, 0 ); 3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvCvt_32f_64d( const float* src, double* dst, int len ) 3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; 3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < len; i++ ) 3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = src[i]; 3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void icvCvt_64d_32f( const double* src, float* dst, int len ) 3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int i; 3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( i = 0; i < len; i++ ) 4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[i] = (float)src[i]; 4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif/*_CV_MATRIX_H_*/ 4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */ 406