1. 程式人生 > >矩陣偽逆求解的三種方法

矩陣偽逆求解的三種方法

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:適用於稀疏矩陣

這裡寫圖片描述