【问题标题】:Best Way to "tag" data for fast parsing through matlab?通过matlab快速解析“标记”数据的最佳方法?
【发布时间】:2015-08-05 13:28:01
【问题描述】:

我通过labview程序将数据收集到Excel工作表中,以固定间隔连续收集数据,并在文件中的其中一列中标记事件,TaskA_0代表事件的开始,TaskA_1代表事件的结束.这是数据的 sn-p:

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

目前我使用 xlsread 将其加载到 matlab 中,然后运行 ​​strfind 来定位事件标记的行索引,以便将我的数据分解为任务,其中每个任务都是相邻列中的数据在 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 中的列进行分析,并对剩余的任务重复该过程。

【问题讨论】:

  • 开始的事件名称总是Task x_0 和结束的Task x_1?你的任务是只有 A-D 还是有其他字母?
  • @excaza 我正在尝试设置它以使任务名称保持一致,所以是的,它们应该始终是任务 X_0,任务@_1,可以有超过 4 个任务,但不能超过 26 个所以这似乎是一个很好的命名约定,请随时提出更好的建议:)

标签: excel matlab data-processing xlsread


【解决方案1】:

假设您无法更改文件的格式,但知道您正在搜索哪些任务,您仍然可以通过创建任务名称列表来自动搜索,只需将 _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 中预先分配一个列表。

【讨论】:

    猜你喜欢
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 2020-06-03
    • 1970-01-01
    • 2020-12-05
    相关资源
    最近更新 更多