EKF优化:协方差coff公式、意义、SLAM中的Code优化
生活随笔
收集整理的這篇文章主要介紹了
EKF优化:协方差coff公式、意义、SLAM中的Code优化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 1.代碼:Matlab相關系數的意義:
Eigen::MatrixXf correlation_matrix = corrcoef( LocM );對行向量求相關系數 , 與列數無關,返回?cols()*cols()?矩陣...
翻譯成Eigen:
還是自己寫個函數吧//1.求協方差
//2.寫入方差矩陣
//求矩陣的相關系數! //返回矩陣A的列向量的相關系數矩陣//對行向量求相關系數 , 與行數無關,返回 cols()*cols() 矩陣... Eigen::MatrixXf CIcSearchM::corrcoef(Eigen::MatrixXf &M) {// C(i,j)/SQRT(C(i,i)*C(j,j)).//C is the covariation Matrixint Row= M.rows();int Col= M.cols();int Order= Col;//int Order= (std::max)(Row,Col);Eigen::MatrixXf Coef(Order,Order);for (int i=0;i<Order;++i){for (int j=0;j<Order;++j){Coef(i,j)= cov((Eigen::MatrixXf)M.col(i),(Eigen::MatrixXf)M.col(j))(0);}}return Coef; }2.優化的代碼
使用Eigen計算1000維的方陣大概需要200ms的時間,相對于matlab默認開啟GPU加速,時間上消耗的太多了。
參考:比較OpenBLAS、Matlab、MKL、Eigen的基礎計算性能
優化的代碼:
//求矩陣的相關系數!一個原始公式的簡化算法/優化算法 //返回矩陣A的列向量的相關系數矩陣//對行向量求相關系數 , 與行數無關,返回 cols()*cols() 矩陣... Eigen::MatrixXf CIcSearchM::CorrcoefOpm(Eigen::MatrixXf &MI) {Eigen::MatrixXf M =MI;// C(i,j)/SQRT(C(i,i)*C(j,j)).//C is the covariation Matrix//公式://temp = mysample - repmat(mean(mysample), 10, 1);//result = temp' * temp ./ (size(mysample, 1) - 1)int Row= M.rows();int Col= M.cols();int Order= Col;//int Order= (std::max)(Row,Col);SYSTEMTIME sysP; GetLocalTime( &sysP ); int MileTsp = sysP.wSecond;int MileTP = sysP.wMilliseconds;Eigen::MatrixXf CovM(Order,Order);//(1,Col);Eigen::MatrixXf E_M(1,Col);//減去每一個維度的均值;確定一列為一個維度。//std::cout<< "Mat Src :"<<std::endl;m_Testor.print_EigenMat( M);for (int i =0;i< Col;++i){//求均值E_M(i) =M.col(i).sum()/M.rows();//std::cout<< "E_M(i)" << E_M(i)<< std::endl;M.col(i) = M.col(i)- E_M(i);//}//SYSTEMTIME sysP2; //GetLocalTime( &sysP ); //int MileTsp2 = sysP.wSecond;//int MileTP2 = sysP.wMilliseconds;//int DetaTp = MileTP2 - MileTP;//int DetaTsp = MileTsp2 -MileTsp;//std::cout<< "The Process time is :"<< DetaTsp<<"S"<< std::endl;//std::cout<< "The Process time is :"<< DetaTp<<"mS"<< std::endl;//std::cout<< "Mat E_M :"<<std::endl;m_Testor.print_EigenMat( M);CovM = M.transpose();//GetLocalTime( &sysP ); //MileTsp2 = sysP.wSecond;//MileTP2 = sysP.wMilliseconds;//DetaTp = MileTP2 - MileTP;//DetaTsp = MileTsp2 -MileTsp;//std::cout<< "The Process time is :"<< DetaTsp<<"S"<< std::endl;//std::cout<< "The Process time is :"<< DetaTp<<"mS"<< std::endl;//std::cout<< "Mat CovM :"<<std::endl;m_Testor.print_EigenMat( CovM);CovM = CovM * M ;//GetLocalTime( &sysP ); //MileTsp2 = sysP.wSecond;//MileTP2 = sysP.wMilliseconds;//DetaTp = MileTP2 - MileTP;//DetaTsp = MileTsp2 -MileTsp;//std::cout<< "The Process time is :"<< DetaTsp<<"S"<< std::endl;//std::cout<< "The Process time is :"<< DetaTp<<"mS"<< std::endl;//實現 ./ 函數 數值計算沒有區別CovM = CovM /(Order-1)/(Order-1);//GetLocalTime( &sysP ); //MileTsp2 = sysP.wSecond;//MileTP2 = sysP.wMilliseconds;//DetaTp = MileTP2 - MileTP;//DetaTsp = MileTsp2 -MileTsp;//std::cout<< "The Process time is :"<< DetaTsp<<"S"<< std::endl;//std::cout<< "The Process time is :"<< DetaTp<<"mS"<< std::endl;//std::cout<< "Mat CovM :"<<std::endl;m_Testor.print_EigenMat( CovM);//GetLocalTime( &sysP ); //MileTsp2 = sysP.wSecond;//MileTP2 = sysP.wMilliseconds;//DetaTp = MileTP2 - MileTP;//DetaTsp = MileTsp2 -MileTsp;//std::cout<< "The Process time is :"<< DetaTsp<<"S"<< std::endl;//std::cout<< "The Process time is :"<< DetaTp<<"mS"<< std::endl;//遍歷一次for (int i=0;i< Order;++i){for (int j=0;j<Order;++j){CovM(i,j) = sqrt(CovM(i,i)*CovM(j,j) );}}//GetLocalTime( &sysP ); //MileTsp2 = sysP.wSecond;//MileTP2 = sysP.wMilliseconds;//DetaTp = MileTP2 - MileTP;//DetaTsp = MileTsp2 -MileTsp;//std::cout<< "The Process time is :"<< DetaTsp<<"S"<< std::endl;//std::cout<< "The Process time is :"<< DetaTp<<"mS"<< std::endl;//std::cout<< "Mat CovM :"<<std::endl;m_Testor.print_EigenMat( CovM);return CovM; }?稀疏矩陣可以加速到3ms,我去!終于可以實用了.....
?使用Fast的前端實驗:https://blog.csdn.net/wishchin/article/details/49404029
參考:
復習!復習!原文鏈接:http://blog.csdn.net/goodshot/article/details/8611178
總結
以上是生活随笔為你收集整理的EKF优化:协方差coff公式、意义、SLAM中的Code优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 创始人回归重掌大权!爱驰停摆多月后迎转机
- 下一篇: 装X数学:高雅的数学表示