【问题标题】:Convert an array of data to a timeseries object将数据数组转换为时间序列对象
【发布时间】:2013-06-11 15:30:27
【问题描述】:

我有一个 10000x43 数组,表示从数据采集硬件获取的测试数据。第一列是时间向量,其余列是每个通道。我还有一个 1x43 单元格数组,用于定义每个通道的名称。

我想从这个数组数据创建一个时间序列对象。我想这样做的原因是我可以在总线选择器块中使用通道名称 - 这使得将测试数据输入到 simulink 模型中变得很容易。

我查看了在线和文档,但在如何重现我在 simulink 中使用“ToWorkspace”块时获得的相同类型的时间序列对象方面没有太多运气。

【问题讨论】:

  • 您知道From Workspace 块让您只需插入一个对应于仿真时间和信号的数组,对吧?在任何情况下,timeseries 类上的 MATLAB documentation 看起来都非常易于使用:ts = timeseries(data, time);
  • 我知道。我想使用 timeseries 对象作为 FromWorkspace 块中的输入而不是普通数组的原因是该数组只能用于单维信号。对于多维信号,我必须至少使用一个结构(不存储信号名称)或单独的数组(意味着重复的时间序列列)。另外,如果我使用所有列的结构,那么我需要使用相同大小的解复用器,但如果我使用带总线的时间序列,我可以只选择我想要的通道,而不必担心特定的列。

标签: matlab simulink test-data


【解决方案1】:

假设您有一个包含通道名称的元胞数组和一个 mXn 数据数组,其中第一列是时间向量,其他列以与元胞数组中的值相同的顺序表示数据。

其中的主要部分是创建与数据同名的 simulink 总线对象,并创建具有相同名称的各个时间序列对象的结构。这是我无法从文档中找到的部分。

这样做的好处是:

  • 使在 Simulink 的“FromWorkspace”块中选择特定通道变得容易
  • 如果您有其他信息,例如单位,您可以将其编码到时间序列对象(以及 simulink 总线对象)中。

这是您可以复制到 Matlab 并运行的示例代码:

load count.dat
timedata = [1:24]';
count = [timedata count];
clear timedata;
chan_title = {'chan1', 'chan2','chan3'}; % make sure no spaces between words

%% create simulink bus and timeseries structure
rundata_bus = Simulink.Bus;
rundata_ts = struct; 
for i = 1:length(chan_title)
    %% create bus elements
    saveVarsTmp{1}(i, 1) = Simulink.BusElement;
    saveVarsTmp{1}(i, 1).Name = chan_title{i};

    %% create individual timeseries
    rundata_ts.(chan_title{i}) = timeseries(count(:,i),count(:,1),'name',chan_title{i});
end
rundata_bus.Elements = saveVarsTmp{1};
clear saveVarsTmp;

【讨论】:

  • 肯定有比这个更简单更通用的方法。我认为这太具体了。
猜你喜欢
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 2020-06-13
  • 2019-06-16
  • 2020-06-25
  • 2022-11-13
相关资源
最近更新 更多