EKF优化:协方差coff计算公式、意义、Code优化
复习!复习!
原文链接:http://blog.csdn.net/goodshot/article/details/8611178
1.代码:
Matlab相关系数的意义:
Eigen::MatrixXf correlation_matrix = corrcoef( LocM );
对行向量求相关系数 , 与列数无关,返回 cols()*cols() 矩阵...
翻译成Eigen:
还是自己写个函数吧
//1.求协方差
Eigen::MatrixXf CIcSearchM::cov(Eigen::MatrixXf &d1, Eigen::MatrixXf &d2)
{
Eigen::MatrixXf CovM(1,1);
assert(1 ==d1.cols() && 1 ==d2.cols() &&d1.cols()==d2.cols() ); //求协方差
float Ex =0;float Ey=0;
for (int i=0;i< d1.rows();++i){
Ex +=d1(i);
Ey +=d2(i);
}
Ex /=d1.rows();
Ey /=d2.rows(); for (int i=0;i< d1.rows();++i){
CovM(0) += (d1(i)-Ex)*(d2(i)-Ey);
}
CovM(0) /= d1.rows() -1;
return CovM;
}
//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 Matrix
int 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,我去!终于可以实用了.....
EKF优化:协方差coff计算公式、意义、Code优化的更多相关文章
- Linux启动时间优化-内核和用户空间启动优化实践
关键词:initcall.bootgraph.py.bootchartd.pybootchart等. 启动时间的优化,分为两大部分,分别是内核部分和用户空间两大部分. 从内核timestamp 0.0 ...
- 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)
基于Oracle的SQL优化(社区万众期待数据库优化扛鼎巨著) 崔华 编 ISBN 978-7-121-21758-6 2014年1月出版 定价:128.00元 856页 16开 编辑推荐 本土O ...
- mysql数据库优化课程---18、mysql服务器优化
mysql数据库优化课程---18.mysql服务器优化 一.总结 一句话总结: 1.四种字符集问题:字符集都设置为utf-82.slow log慢查询日志问题3.root密码丢失 1.mysql存在 ...
- ORACLE性能优化- Buffer cache 的调整与优化
Buffer Cache是SGA的重要组成部分,主要用于缓存数据块,其大小也直接影响系统的性能.当Buffer Cache过小的时候,将会造成更多的 free buffer waits事件. 下面将具 ...
- 转 cocos2d-x 优化(纹理渲染优化、资源缓存、内存优化)
概述 包括以下5种优化:引擎底层优化.纹理优化.渲染优化.资源缓存.内存优化 引擎优化 2.0版本比1.0版本在算法上有所优化,效率更高.2.0版本使用OpenGl ES 2.0图形库,1.0版本 ...
- Android开发优化之——对Bitmap的内存优化
http://blog.csdn.net/arui319/article/details/7953690 在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitm ...
- MySql数据库3【优化2】sql语句的优化
1.SELECT语句优化 1).利用LIMIT 1取得唯一行[控制结果集的行数] 有时,当你要查询一张表是,你知道自己只需要看一行.你可能会去的一条十分独特的记录,或者只是刚好检查了任何存在的记录数, ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十二)数据层优化-explain关键字及慢sql优化
本文提要 从编码角度来优化数据层的话,我首先会去查一下项目中运行的sql语句,定位到瓶颈是否出现在这里,首先去优化sql语句,而慢sql就是其中的主要优化对象,对于慢sql,顾名思义就是花费较多执行时 ...
- 数据库性能优化(database tuning)性能优化绝不仅仅只是索引
一毕业就接触优化方面的问题,专业做优化也有至少5年之多的时间了,可现在还是经常听到很多人认为优化很简单,就是建索引的问题,这确实不能怪大家,做这行20多年的时间里,在职业生涯的每个阶段,几乎都能听到这 ...
随机推荐
- C# 派生类的XmlSerializer序列化XML
近段对XML 序列化进行处理,用XmlSerializer这个挺好用的. 但是对于派生类对象的XML的生成总会报错.因为同一个节点名称,不能反射为不同的对象.这个在网上找了好久,都说要利用反射来处理. ...
- 关于框架搭建-web
最近一直在学习前端相关的东西,在学了一堆基础可以以及动手在某个前端框架上写了一些东西之后,我想尝试着开始自己搭建一个框架.不知道时间需要多久,但会持续更新.小菜鸟的成长记录. ------------ ...
- centos7 yum源
https://www.cnblogs.com/muyunren/p/7221505.html https://www.cnblogs.com/renpingsheng/p/7845096.html
- hibernate之一对多映射
目录 第一章 课程简介 第二章 Hibernate中的单向一对多关联 2-1 一对多映射简介 2-2 hibernate的基础配置 2-3 创建HibernateUtil工具类 2-4 在mysql数 ...
- [自己动手改wordpress.1]wordpress的插件User-Access-Manager在新的php版本号里面无法执行的bug.
近期同事在玩wp, 就顺带一起看了下. 她说插件有个不能用. 是一个叫User Access Manager 的插件 详细表现就是在后台填好相应的roles角色的时候, 点提交就会跳到一个错误的页面 ...
- ant+jmeter 报告优化
环境基础:ant+jmeter+java +jmeter脚本 1.将 JMeter的extras目录中ant-jmeter-1.1.1.jar包拷贝至ant安装目录下的lib目录中 2.修改JMete ...
- win7_32虚拟机网络设置
今天工作中同事需要使用ie8的浏览器,组内同事没有,想到自己玩的win7_32虚拟机上有ie8,想让对方连接使用,发现自己本机可以远程连接,同事不能连接 排查原因:可能虚拟机使用的是nat模式连接的网 ...
- DotNetBar.Bar作为容器使用的方法及Text更新原理
DotNetBar.Bar作为容器使用的方法及Text更新原理 老帅 一.容器用法 控件DevComponents.DotNetBar.Ba ...
- javase - 点餐系统
public class OrderMsg { public static void main(String[] args) throws Exception { /** * 订餐人姓名.选择菜品.送 ...
- luogu4218 [JSOI2008] 最小生成树计数
题目大意 求一个加权无向图的最小生成树的个数.1<=n<=100; 1<=m<=1000,具有相同权值的边不会超过10条. 题解 命题1 由构成最小生成树的边的边权从小到大排序 ...