cvmatrix.cpp.svn-base
来自「非结构化路识别」· SVN-BASE 代码 · 共 1,534 行 · 第 1/5 页
SVN-BASE
1,534 行
result = d;
d = 1./d;
t0 = Sf(0,0)*d;
t1 = Sf(1,1)*d;
Df(1,1) = (float)t0;
Df(0,0) = (float)t1;
t0 = -Sf(0,1)*d;
t1 = -Sf(1,0)*d;
Df(0,1) = (float)t0;
Df(1,0) = (float)t1;
}
}
else
{
double d = det2(Sd);
if( d != 0. )
{
double t0, t1;
result = d;
d = 1./d;
t0 = Sd(0,0)*d;
t1 = Sd(1,1)*d;
Dd(1,1) = t0;
Dd(0,0) = t1;
t0 = -Sd(0,1)*d;
t1 = -Sd(1,0)*d;
Dd(0,1) = t0;
Dd(1,0) = t1;
}
}
}
else if( src->width == 3 )
{
if( type == CV_32FC1 )
{
double d = det3(Sf);
if( d != 0. )
{
float t[9];
result = d;
d = 1./d;
t[0] = (float)((Sf(1,1) * Sf(2,2) - Sf(1,2) * Sf(2,1)) * d);
t[1] = (float)((Sf(0,2) * Sf(2,1) - Sf(0,1) * Sf(2,2)) * d);
t[2] = (float)((Sf(0,1) * Sf(1,2) - Sf(0,2) * Sf(1,1)) * d);
t[3] = (float)((Sf(1,2) * Sf(2,0) - Sf(1,0) * Sf(2,2)) * d);
t[4] = (float)((Sf(0,0) * Sf(2,2) - Sf(0,2) * Sf(2,0)) * d);
t[5] = (float)((Sf(0,2) * Sf(1,0) - Sf(0,0) * Sf(1,2)) * d);
t[6] = (float)((Sf(1,0) * Sf(2,1) - Sf(1,1) * Sf(2,0)) * d);
t[7] = (float)((Sf(0,1) * Sf(2,0) - Sf(0,0) * Sf(2,1)) * d);
t[8] = (float)((Sf(0,0) * Sf(1,1) - Sf(0,1) * Sf(1,0)) * d);
Df(0,0) = t[0]; Df(0,1) = t[1]; Df(0,2) = t[2];
Df(1,0) = t[3]; Df(1,1) = t[4]; Df(1,2) = t[5];
Df(2,0) = t[6]; Df(2,1) = t[7]; Df(2,2) = t[8];
}
}
else
{
double d = det3(Sd);
if( d != 0. )
{
double t[9];
result = d;
d = 1./d;
t[0] = (Sd(1,1) * Sd(2,2) - Sd(1,2) * Sd(2,1)) * d;
t[1] = (Sd(0,2) * Sd(2,1) - Sd(0,1) * Sd(2,2)) * d;
t[2] = (Sd(0,1) * Sd(1,2) - Sd(0,2) * Sd(1,1)) * d;
t[3] = (Sd(1,2) * Sd(2,0) - Sd(1,0) * Sd(2,2)) * d;
t[4] = (Sd(0,0) * Sd(2,2) - Sd(0,2) * Sd(2,0)) * d;
t[5] = (Sd(0,2) * Sd(1,0) - Sd(0,0) * Sd(1,2)) * d;
t[6] = (Sd(1,0) * Sd(2,1) - Sd(1,1) * Sd(2,0)) * d;
t[7] = (Sd(0,1) * Sd(2,0) - Sd(0,0) * Sd(2,1)) * d;
t[8] = (Sd(0,0) * Sd(1,1) - Sd(0,1) * Sd(1,0)) * d;
Dd(0,0) = t[0]; Dd(0,1) = t[1]; Dd(0,2) = t[2];
Dd(1,0) = t[3]; Dd(1,1) = t[4]; Dd(1,2) = t[5];
Dd(2,0) = t[6]; Dd(2,1) = t[7]; Dd(2,2) = t[8];
}
}
}
else
{
assert( src->width == 1 );
if( type == CV_32FC1 )
{
double d = Sf(0,0);
if( d != 0. )
{
result = d;
Df(0,0) = (float)(1./d);
}
}
else
{
double d = Sd(0,0);
if( d != 0. )
{
result = d;
Dd(0,0) = 1./d;
}
}
}
}
else
{
CvLUDecompFunc decomp_func;
CvLUBackFunc back_func;
CvSize size = icvGetMatSize( src );
int buf_size = size.width*size.height*icvPixSize[type];
CvMat tmat;
if( !lu_inittab )
{
icvInitLUTable( &lu_decomp_tab, &lu_back_tab );
lu_inittab = 1;
}
if( size.width <= CV_MAX_LOCAL_MAT_SIZE )
{
buffer = (uchar*)alloca( buf_size + 8 );
buffer = (uchar*)icvAlignPtr( buffer, 8 );
local_alloc = 1;
}
else
{
CV_CALL( buffer = (uchar*)cvAlloc( buf_size ));
}
CV_CALL( cvInitMatHeader( &tmat, size.height, size.width, type, buffer ));
CV_CALL( cvCopy( src, &tmat ));
CV_CALL( cvSetIdentity( dst ));
decomp_func = (CvLUDecompFunc)(lu_decomp_tab.fn_2d[CV_MAT_DEPTH(type)-CV_32F]);
back_func = (CvLUBackFunc)(lu_back_tab.fn_2d[CV_MAT_DEPTH(type)-CV_32F]);
assert( decomp_func && back_func );
IPPI_CALL( decomp_func( tmat.data.ptr, tmat.step, size,
dst->data.ptr, dst->step, size, &result ));
if( result != 0 )
{
IPPI_CALL( back_func( tmat.data.ptr, tmat.step, size,
dst->data.ptr, dst->step, size ));
}
}
if( !result )
CV_CALL( cvSetZero( dst ));
__END__;
if( buffer && !local_alloc )
cvFree( (void**)&buffer );
if( u || v || w )
{
cvReleaseMat( &u );
cvReleaseMat( &v );
cvReleaseMat( &w );
}
return result;
}
IPCVAPI_IMPL( CvStatus, icvInvertMatrix_32f, ( const float* src, int w, float* dst ))
{
CvMat tsrc, tdst;
cvInitMatHeader( &tsrc, w, w, CV_32FC1, (void*)src );
cvInitMatHeader( &tdst, w, w, CV_32FC1, dst );
cvInvert( &tsrc, &tdst );
return CV_OK;
}
IPCVAPI_IMPL( CvStatus, icvInvertMatrix_64d, ( const double* src, int w, double* dst ))
{
CvMat tsrc, tdst;
cvInitMatHeader( &tsrc, w, w, CV_64FC1, (void*)src );
cvInitMatHeader( &tdst, w, w, CV_64FC1, dst );
cvInvert( &tsrc, &tdst );
return CV_OK;
}
/****************************************************************************************\
* Solving Linear Systems *
\****************************************************************************************/
CV_IMPL int
cvSolve( const CvArr* A, const CvArr* b, CvArr* x, int method )
{
CvMat* u = 0;
CvMat* v = 0;
CvMat* w = 0;
uchar* buffer = 0;
int local_alloc = 0;
int result = 1;
CV_FUNCNAME( "cvSolve" );
__BEGIN__;
CvMat sstub, *src = (CvMat*)A;
CvMat dstub, *dst = (CvMat*)x;
CvMat bstub, *src2 = (CvMat*)b;
int type;
if( !CV_IS_MAT( src ))
CV_CALL( src = cvGetMat( src, &sstub ));
if( !CV_IS_MAT( src2 ))
CV_CALL( src2 = cvGetMat( src2, &bstub ));
if( !CV_IS_MAT( dst ))
CV_CALL( dst = cvGetMat( dst, &dstub ));
if( method == CV_SVD )
{
int n = MIN(src->rows,src->cols);
CV_CALL( u = cvCreateMat( n, src->rows, src->type ));
CV_CALL( v = cvCreateMat( n, src->cols, src->type ));
CV_CALL( w = cvCreateMat( n, 1, src->type ));
CV_CALL( cvSVD( src, w, u, v, CV_SVD_U_T + CV_SVD_V_T ));
CV_CALL( cvSVBkSb( w, u, v, src2, dst, CV_SVD_U_T + CV_SVD_V_T ));
EXIT;
}
else if( method != CV_LU )
CV_ERROR( CV_StsBadArg, "Unknown inversion method" );
type = CV_MAT_TYPE( src->type );
if( !CV_ARE_TYPES_EQ( src, dst ) || !CV_ARE_TYPES_EQ( src, src2 ))
CV_ERROR( CV_StsUnmatchedFormats, "" );
if( src->width != src->height )
CV_ERROR( CV_StsBadSize, "The matrix must be square" );
if( !CV_ARE_SIZES_EQ( src2, dst ) || src->width != src2->height )
CV_ERROR( CV_StsUnmatchedSizes, "" );
if( type != CV_32FC1 && type != CV_64FC1 )
CV_ERROR( CV_StsUnsupportedFormat, "" );
// check case of a single equation and small matrix
if( src->width <= 3 && src2->width == 1 )
{
#define bf(y) ((float*)(bdata + y*src2step))[0]
#define bd(y) ((double*)(bdata + y*src2step))[0]
uchar* srcdata = src->data.ptr;
uchar* bdata = src2->data.ptr;
uchar* dstdata = dst->data.ptr;
int srcstep = src->step;
int src2step = src2->step;
int dststep = dst->step;
if( src->width == 2 )
{
if( type == CV_32FC1 )
{
double d = det2(Sf);
if( d != 0. )
{
float t;
d = 1./d;
t = (float)((bf(0)*Sf(1,1) - bf(1)*Sf(0,1))*d);
Df(0,1) = (float)((bf(1)*Sf(0,0) - bf(0)*Sf(1,0))*d);
Df(0,0) = t;
}
else
result = 0;
}
else
{
double d = det2(Sd);
if( d != 0. )
{
double t;
d = 1./d;
t = (float)((bd(0)*Sd(1,1) - bd(1)*Sd(0,1))*d);
Dd(1,0) = (float)((bd(1)*Sd(0,0) - bd(0)*Sd(1,0))*d);
Dd(0,0) = t;
}
else
result = 0;
}
}
else if( src->width == 3 )
{
if( type == CV_32FC1 )
{
double d = det3(Sf);
if( d != 0. )
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?