从时间序列中提取不同长度的部分

时间:2014-07-14 14:35:50

标签: matlab time time-series

我有一个很长的时间序列文件(以毫秒记录),我需要从中提取不同长度的部分(基于来自不同数组/文件的值)。

时间序列文件( data2.txt )是从EEGLab工具箱导出的,因为我需要尝试自定义分析。它有两列(第1列:时间以毫秒为单位,第2列:来自脑电图记录的值) - 见下文。 我将时期的时间(开始和结束)存储在不同的文件中( epochs.txt :第1列 - 开始,第2 - 结束),格式与 data2.txt

我的文件( data2.txt )按以下方式查看:

0.0000  -126.2498
1.9531  -91.8123
3.9063  -130.7185
5.8594  -67.2498
7.8125  -77.6560
9.7656  -83.0623
11.7188 -74.0310
13.6719 -110.4685
15.6250 -130.4373
17.5781 -143.4060
19.5313 -155.7498

我需要从时间序列的某些部分中提取值(时间保存在外部文件中 - epochs.txt )并将它们保存到另一个文件中。

我已将时期的时间(开始和结束)存储在另一个文件中( epochs.txt :第1列 - 开始,第2 - 结束)。 epochs.txt 中的值可能并不总是与 data2.txt 中的值相同,例如: (它们可以插值吗?)

2.391391554 5.381023353
6.129570888 7.39010542
10.65197062 12.96686866
14.47654996 17.31346859
17.84561721 18.88671436
22.3857703  23.25648467

加载并绘制文件时文件看起来很好:

EEG_data = importdata('C:\Users\Me\Desktop\data2.txt');
figure
plot(EEG_data(:,1), EEG_data(:,2));

我猜Matlab将我的文件视为2×N矩阵而不是时间序列,但我不确定如何更改它。我尝试将 EEG_data 转换为时间序列并提取相应的值,但我失败了。

我想获得有两列的输出( output.txt )(第一个:时间,第二个:EEG值),下面的可能输出是基于第一个 epochs.txt 的一行( output.txt 的第一列),第二列是猜测的。 我不确定在两者之间获得价值的最佳方法是什么。

2.391391554 -90.381023353
.
.
.
5.381023353 -75.96686866

有任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

根据评论,这里有一些代码可以帮助您入门。我使用了以下数据来避免处理start_index == end_index的空切片。您可能需要添加一些代码来检查此问题和其他有问题的案例。

epochs.txt

2.391391554 9.381023353
11.65197062 18.96686866

data2.txt

0.0000  -126.2498
1.9531  -91.8123
3.9063  -130.7185
5.8594  -67.2498
7.8125  -77.6560
9.7656  -83.0623
11.7188 -74.0310
13.6719 -110.4685
15.6250 -130.4373
17.5781 -143.4060
19.5313 -155.7498

代码

EEG_data = importdata('data2.txt');
epochs = importdata('epochs.txt');

output = zeros(0, 2);
for i = 1:size(epochs, 1)
    % extract an epoch from the EEG data
    start_time = epochs(i, 1);
    end_time = epochs(i, 2);

    % find corresponding indices
    % http://stackoverflow.com/q/3593717/553404
    start_index = find(EEG_data(:, 1) > start_time, 1);
    end_index = find(EEG_data(:, 1) > end_time, 1) - 1;

    % slice the required data for the epoch
    epoch_data = EEG_data(start_index:end_index, :);

    % append to output
    output = [output; epoch_data];
end