我有一个类似这样的时间序列:
Time Data
-------------
802 1
803 2
803 3
804 7
我想使用interp(x,v,xq)
,其中x为时间,v为数据,但是该函数要求我具有不同的x值。如何在MATLAB时间序列中删除/平均重复行?
我尝试了interp(unique(timeseriesname.time), timeseriesname.data, timeseriesref.time)
但这与我的数据不匹配。有没有简单的方法可以做到这一点?
答案 0 :(得分:3)
如果仅希望插值按原样处理数据,则可以尝试使用resample
对象的timeseries
方法。当然,对于您的给定示例,它将在时间点803
周围显示不连续,但仍然可以正常工作,没有错误:
>> ts = timeseries([1 2 3 7].', [802 803 803 804]);
>> rs = resample(ts, 802:0.25:804);
>> [rs.time rs.data]
ans =
802.0000 1.0000
802.2500 1.2500
802.5000 1.5000
802.7500 1.7500
803.0000 3.0000
803.2500 4.0000
803.5000 5.0000
803.7500 6.0000
804.0000 7.0000
请注意时间点803
的值为3
,但是插值从下面接近值2
。
如果您只想通过对重复项进行平均来删除它们,则可以使用函数unique
和accumarray
来创建新的timeseries
对象,如下所示:
>> [newTime, ~, index] = unique(ts.time);
>> newTS = timeseries(accumarray(index, ts.data, [], @mean), newTime);
>> [newTS.time newTS.data]
ans =
802.0000 1.0000
803.0000 2.5000
804.0000 7.0000
或者,如果您想修改原始 timeseries
对象的时间和数据,则可以使用set
方法同时设置它们:
[newTime, ~, index] = unique(ts.time);
newData = accumarray(index, ts.data, [], @mean);
set(ts, 'Time', newTime, 'Data', newData);