在下面的代码中,我创建了一个简单的数据系列,一个时间向量,然后是一个时间序列。绘制它们都没有问题。 (它们在同一个情节中并不重要。)我能够弄清楚的是如何将一部分时间序列子集化,如最后一个失败的错误命令所示:
>> timeseriesTest
Error using timeseries/plot (line 27)
The plot method can only be used for a single timeseries object
Error in timeseriesTest (line 14)
plot(ts(25:end));
>>
如何提取时间序列中的最后25个(在本例中)值?重要提示:虽然在下面的代码中不正确,但我的时间序列有每日或每周时间戳,我确实需要保留它。即:
NewData = ts.data
...不是一个好的答案,除非它是获得新提取的时间序列的唯一途径。
t=[1:50];
d=sin(2*pi*t/20);
ts = timeseries(2*d, t);
%plot data and timeseries
plot(d);
hold on;
plot(ts);
figure();
plot(d(25:end));
hold on;
plot(ts(25:end));
答案 0 :(得分:7)
如果你看一下TimeSeries
对象的属性,当你在尝试绘图之前运行代码时,这就是我们所看到的:
>> ts
timeseries
Common Properties:
Name: 'unnamed'
Time: [50x1 double]
TimeInfo: [1x1 tsdata.timemetadata]
Data: [1x1x50 double]
DataInfo: [1x1 tsdata.datametadata]
您会在时间序列对象中看到Data
字段,以及表示每个点实例的时间值的Time
字段。如果您想单独访问字段并绘制最后25个元素,请执行以下操作:
plot(ts.Time(end-24:end), squeeze(ts.Data(end-24:end)));
ts
是您的TimeSeries
对象,如果您想访问此对象中的字段,请使用点运算符(.
...并且您已经知道了)。使用点运算符后,只需使用其相应的名称即可访问所需的字段。因此,如果您需要时间值,请使用Time
,如果您需要数据,请使用Data
。现在,看起来很奇怪的是我使用了squeeze
。 squeeze
删除单身尺寸。如果您看到,Data
是一个1 x 1 x 50
数组,那么它应该只是一个50 x 1
数组。 squeeze
的目的是删除多余的维度以获取我们的实际数据。
请注意,如果您的时间序列中只有一个信号,则似乎只会发生这种情况。我们应该有多个信号......比方说,如果我们想要三个长度为50的信号,我们将创建一个50 x 3矩阵,其中每个列表示单个信号。它看起来像这样:
>> t = 1:50;
>> A = rand(50,3);
>> ts = timeseries(A,t)
timeseries
Common Properties:
Name: 'unnamed'
Time: [50x1 double]
TimeInfo: [1x1 tsdata.timemetadata]
Data: [50x3 double]
DataInfo: [1x1 tsdata.datametadata]
rand
在[0-1]
范围内生成任意大小的随机矩阵或向量。你会看到我们的信号现在是50 x 3
。如果你想绘制这个,plot
每个时间帧识别多个信号....所以你可以这样做:
plot(ts.Time, ts.Data);
这应生成三条迹线的图,每条迹线由不同的颜色描绘,并在ts.Time
指定的相同时间范围内。
同样,如果您想为每个信号绘制最后25个点,只需执行以下操作:
plot(ts.Time(end-24:end), ts.Data(end-24:end,:));
此代码将访问Data
中每列(即每个信号)的最后 25行并将其全部绘制出来。