0

我通过labview程序将数据收集到excel表中,数据以固定间隔连续收集,事件在文件中的其中一列中标记,TaskA_0代表事件的开始,TaskA_1代表结束。这是数据的片段:

Time            Data 1      Data 2      Data 3      Data 4      Event Name
13:38:41.888    0.719460527 0.701654664 0.221332969 0.012234448 Task A_0
13:38:41.947    0.437707516 0.588673334 0.524042112 0.309975646 Task A_1
13:38:42.021    0.186847503 0.589175696 0.393891242 0.917737946 Task B_0
13:38:42.115    0.44490411  0.073132298 0.897701096 0.633815257 Task B_1
13:38:42.214    0.833793601 0.004524633 0.40950937  0.808966844 Task C_0
13:38:42.314    0.953997375 0.055717025 0.914080619 0.166492915 Task C_1
13:38:42.414    0.245698313 0.066643778 0.515709814 0.606289696 Task D_0
13:38:42.514    0.248038367 0.862138045 0.025489223 0.352926629 Task D_1

目前,我使用 将其加载到 matlab 中xlsread,然后运行 ​​astrfind以定位事件标记的行索引,以便将我的数据分解为任务,其中每个任务都是 TaskA_0 和 TaskA_1 之间相邻列中的数据(这里没有数据之间但通常存在,事件名称之间通常也有空白单元格)。这是最好的方法吗?一旦我将它放在单独的变量中,我就会对每个变量执行相同的操作,通常是基本统计数据和一些数据绘图。如果我想批量处理我的数据,我必须一遍又一遍地重写这些行以使数据按任务分解。即使我知道这是错误的并且效率极低,但我不知道如何更好地做到这一点。

[Data,Text]= xlsread('C:\TestData.xlsx',2); %time column and event name column end up in text, as does the data headers, hence the +1 for the row indices
IndexTaskAStart = find(~cellfun(@isempty,strfind(Text(:,2),'TaskA_0')))+1;
IndexTaskAEnd = find(~cellfun(@isempty, strfind(Text(:,2),'TaskA_1')))+1;
TaskAData = Data([IndexTaskAStart:IndexTaskAEnd,:];

现在我可以对 TaskAData 中的列进行分析,并对剩余的任务重复该过程。

4

1 回答 1

0

假设您无法更改文件的格式,但知道您正在搜索哪些任务,您仍然可以通过创建任务名称列表来自动搜索,只需将 _0 和 _1 附加到要搜索的任务名称上。然后不要创建单独的命名变量,而是存储在单元格数组中以便于循环:

tasknames = {'Task A', 'Task B', 'Task C'}

for n = 1:numel(tasknames)
    first = find(~cellfun(@isempty,strfind(Text(:,2),[tasknames{n},'_0'])))+1;
    last = find(~cellfun(@isempty, strfind(Text(:,2),[tasknames{n},'_1'])))+1;
    task_data{n} = Data(first:last, :);
    % whatever other analysis you require goes here
end

如果有大量任务名称但它们遵循某种模式,您可能更喜欢动态创建它们,而不是在tasknames.

于 2015-08-05T14:25:10.100 回答