矩陣偽逆求解的三種方法
阿新 • • 發佈:2018-12-17
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:適用於稀疏矩陣