矩阵伪逆求解的三种方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 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:适用于稀疏矩阵

这里写图片描述

猜你喜欢

转载自blog.csdn.net/itworld123/article/details/79082544
今日推荐