版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/itworld123/article/details/79082544
2018-01-17 创建人:Ruo_Xiao
开发环境:VS2010、Opencv 1.0
邮箱:[email protected]
1、普通方法
理解方法:
2、SVD
源码:
void IL_X_Alg::PINV(CvMat *pMatS,CvMat *pMatD)
/*
作用:求矩阵的伪逆
输入: pMatS 待求矩阵
pMatD 逆矩阵
返回值:无
编写人:Ruo_Xiao
*/
{
int i = 0,k = 0;
float *pf = NULL;
CvMat *pS = cvCreateMat(pMatS->rows,pMatS->cols,CV_32FC1);
CvMat *pV = cvCreateMat(pMatS->cols,pMatS->cols,CV_32FC1);
CvMat *pTS = cvCreateMat(pMatS->cols,pMatS->rows,CV_32FC1);
CvMat *pTU = cvCreateMat(pMatS->rows,pMatS->rows,CV_32FC1);
CvMat *pG1 = cvCreateMat(pMatS->cols,pMatS->rows,CV_32FC1);
cvSVD(pMatS,pS,pTU,pV,CV_SVD_U_T);
for (i=0;i<pS->rows;++i)
{
pf = pS->data.fl+i*pS->step/4;
for (k=0;k<pS->cols;k++)
{
if (pf[k]!=0)
{
pf[k] = 1/pf[k];
}
}
}
cvTranspose(pS,pTS);
cvGEMM(pV,pTS,1,NULL,0,pG1,0);
cvGEMM(pG1,pTU,1,NULL,0,pMatD,0);
cvReleaseMat(&pS);
cvReleaseMat(&pV);
cvReleaseMat(&pTS);
cvReleaseMat(&pTU);
cvReleaseMat(&pG1);
return;
}
3、QR:适用于稀疏矩阵