![]() |
Matlab中高效的滚动窗口识别
我有时间序列数据,但缺少一些数据,因此我正在滚动窗口上运行一些估计函数。窗口的长度不一致,并且每个变量的开始日期和结束日期都不同。我要删除任何缺少数据的窗口。窗口重叠,因此缺少一个观察值通常会从考虑中删除很多窗口。我想要的是从每个日期到包含它的窗口的映射。
目前,我有一个逻辑矩阵,其中每一天都有一行,然后每一列代表其中一个窗口,其中包含该窗口的日期的真实值。然后,我可以将该矩阵子集化为代表丢失数据的行,并且包含任何真实值的列都是无效窗口。问题在于逻辑矩阵变大(10k x 10k〜100mb),并且可能有很多。我可以转换为稀疏解决了尺寸问题,但是当窗口较长时,要删除哪些窗口的计算将变得非常缓慢。 这听起来不像是一个需要大量资源(内存或计算)的问题,是否有更好的方法? 编辑:让我添加一个示例,这样可能会更清晰一些。假设整个日期范围是1到100。Windows是1:10、2:11、3:12,依此类推,直到91:100(这些是统一的,但对于示例来说并不重要)。我的系列从5到25,但NaN为17。 那一个NaN敲出了十个窗口(8:17到17:26)。我想要从观察17到Windows 8:17的有效映射。显然,当窗口长度相等时,这很容易,但是当窗口不规则时,什么是有效的方法呢? [B]回答:[/B] 我为Jonas的解决方案编写了代码,结果比我已经使用的解决方案要慢。但是,它确实消除了对大型阵列的需求,这让我以不同的方式思考问题。我只需要从窗口->(obs开始,obs结束)映射到obs->(obs落入的每个窗口的索引)方法。 因此,我构建了一个包含每天每一组窗口索引的单元格数组(我可以使用NumObsx2矩阵,但我想考虑可能复杂的窗口定义)。对于每个时间序列,我使用每个丢失的数据点的索引对映射进行子集化,以获取所有需要删除的窗口的索引。然后cell2mat将索引从单元格数组中拉出,我可以删除不良窗口(Matlab不在乎分配中的重复索引,谢天谢地)。 在我看来,该方法大约是原始方法的10倍,是Jonas方法的15倍。映射中的索引可以存储为uint16,因此所需的内存远远少于我的原始解决方案(但仍比Jonas的方法更多)。 另外,如果我想使用更复杂的标准(例如,不超过5个NaN(如所描述的不超过一个),则可以使用accumarray来计算索引)。 [url=https://stackoverflow.com/questions/5035514]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 05:05。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.