GWR - 1

经过上个星期的奋战,终于完成了Gaussian Module的开发。回想那个星期,几乎每天都工作14个小时。除了睡觉吃饭,天天就在GIS Lab。 星期五原本想松口气的,可是就在我要回家的时候发现了一些很严重的问题,这些问题直接导致程序的运行速度。和之前GWR比较发现差了了好几倍,不,应该是好几十倍。当时就觉得自己在崩溃的边缘。运行速度使我怀疑最初的设计。然后1个晚上没有睡好。满脑子的程序,代码,数据......

今天一醒来,匆匆和爸妈聊了会儿天便直接去了GIS Lab. 拿着之前的源代码,核对起来,难道哪个地方在重复做同一个运算?还是我矩阵没做好?仔细分析后,立刻推翻了这个想法。矩阵乘法是O(n)三次方的普通算法,和之前的版本是一样的,逆矩阵用的是PLU Decomposition的算法。(以后我会详细介绍该算法),所以不会是矩阵的问题,那就是其他问题了。注掉了一些代码,还是慢。不过,我开始怀疑Fan写的那个EstimateW方法,做了分析的确是该方法在拖累整个程序,于是立刻自己写了个计算W矩阵的方法,避免了重复创建对象,和初始化O(n)的平方,和重复的pow计算bandwidth。把计算距离的程序写在了一起,避免了重复调用函数,减少Stack的Push和Pop操作。把W缩减到1个Vector的大小,节省空间。更换了W之后,随即得改变计算B Hat的方法,分别保存XT,XTW,XTWX_INV3个矩阵,以避免重复计算,由于W变成了Vector,便能把XTW的运算转成O(n)的平方。由于自己下午一个愚蠢的错误导致XTW的想法没有实现,最后只能带着满肚子的郁闷回家吃饭,吃饭完饭和周鑫踢了几盘实况,然后又回到自己的房间,继续Debug,在核对了几次数据之后,终于找到了Bug,自己忽略了1个细节。做了调整之后,重新运行程序,速度明显大幅度提升,比较满意。能在自己的机器上运行出这个速度,已经很满意了。把之后的模块都作了调整,一起运行,Global的计算几乎不花时间,AICC和黄金分割算法上花了1,2秒时间,之后的Local和Anova也没花什么时间。看来今天晚上的工作可以告一个段落了。不过我读了之前的源代码,发现Martin用了些很巧妙的算法,非CS专业能做到这个程度,令我非常惊讶。再次,感叹算法的力量。做完Gaussian之后,接着就是Logistics,里面也涉及很多算法。

作了Numeric Programming一段时间,感觉要想在这方面发展对算法和数据结构的精通是最基本的条件。我在开发矩阵中,参考了很多算法书籍,<<算法导论>>和<<矩阵操作运算>>觉得很不错,可惜学校里的<<Art of programiming>>没有关于矩阵的运算。网上查了些关于矩阵运算的一些资料,发现MIT的1篇论文,说找到了迄今为止最快的乘法运算,大概在O(n)2.30。

在做Gaussian模块的时候,发现了2个比较严重的Bug,其中1个已被ESRI指出,还有1个可能会影响整个先前版本的计算,之前的GWR可能给出的数据完全是错误的,如果真是这样,影响面会很大。一切只有等到Martin从澳大利亚回来才知道。

不管怎么样,下个星期迎接Logsitcs模块。希望一切会顺利,感觉回家的日子越来越近了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值