MATLAB中Simulink.SimulationData.Dataset用法

avatar
作者
猴君
阅读量:10

目录

语法

说明

示例

访问使用Dataset格式记录的数据 打开模型vdp

使用 Dataset 对象来组合模拟输入信号


        Simulink.SimulationData.Dataset的功能是访问已记录的模拟数据或组合模拟输入数据。

语法

ds = Simulink.SimulationData.Dataset ds = Simulink.SimulationData.Dataset(dataToConvert) ds = Simulink.SimulationData.Dataset(dataToConvert,"DatasetName",dsName)

说明

        ds = Simulink.SimulationData.Dataset:这种语法创建一个空的、未命名的Dataset对象,可以随后手动添加元素。通常在您希望创建一个空的Dataset对象来存储要使用Inport或In Bus Element块加载的外部输入数据时使用。

        ds = Simulink.SimulationData.Dataset(dataToConvert):这种语法创建一个未命名的Dataset对象,其中包含一个或多个元素,每个元素包含由dataToConvert指定的数据。可以使用这种语法将使用其他格式的数据转换为Dataset格式。有关详细信息,请参阅将timeseries对象转换为Dataset对象。

        ds = Simulink.SimulationData.Dataset(dataToConvert, "DatasetName", dsName):这种语法创建一个以dsName指定名称的Dataset对象,其中包含一个或多个元素,每个元素包含由dataToConvert指定的数据。这种语法也用于将其他格式的数据转换为Dataset格式,但它允许您为Dataset指定名称。

示例

访问使用Dataset格式记录的数据 打开模型vdp

        该模型产生两个输出x1和x2。

mdl = "vdp"; open_system(mdl);

如图所示:

模拟该模型,并同时记录块状态和输出数据。

out = sim(mdl,"SaveState","on");

        所有已记录的数据都以单个变量 "out" 返回,它是一个 Simulink.SimulationOutput 对象。SimulationOutput 对象包含一个 Simulink.SimulationData.Dataset 对象,该对象将每种已记录的数据分组在一起。

out out =    Simulink.SimulationOutput:                    tout: [64x1 double]                     xout: [1x1 Simulink.SimulationData.Dataset]                     yout: [1x1 Simulink.SimulationData.Dataset]        SimulationMetadata: [1x1 Simulink.SimulationMetadata]             ErrorMessage: [0x0 char]  

        使用点符号访问包含已记录输出数据的 Dataset 对象 "yout"。该 Dataset 对象包含每个输出的 Simulink.SimulationData.Signal 对象。

out out =    Simulink.SimulationOutput:                    tout: [64x1 double]                     xout: [1x1 Simulink.SimulationData.Dataset]                     yout: [1x1 Simulink.SimulationData.Dataset]        SimulationMetadata: [1x1 Simulink.SimulationMetadata]             ErrorMessage: [0x0 char] 

        Signal 对象包含关于信号的元数据,包括生成信号的块的路径和端口的索引。使用 getElement 函数按名称访问包含信号 x1 数据的 Signal 对象。您还可以使用花括号({}) 按索引访问 Dataset 对象中的元素。

outputX1 = getElement(outputs,'x1') outputX1 =    Simulink.SimulationData.Signal   Package: Simulink.SimulationData    Properties:               Name: 'x1'     PropagatedName: ''          BlockPath: [1x1 Simulink.SimulationData.BlockPath]           PortType: 'inport'          PortIndex: 1             Values: [1x1 timeseries]

        信号数据存储在 Signal 对象的 Values 属性中,以 timeseries 对象的形式。

outputValsX1 = outputX1.Values   timeseries    Common Properties:             Name: 'x1'             Time: [64x1 double]         TimeInfo: tsdata.timemetadata             Data: [64x1 double]         DataInfo: tsdata.datametadata

        时间值位于 timeseries 对象的 Time 属性中,信号值位于 Data 属性中。

outputTimesX1 = outputValsX1.Time outputTimesX1 = 64×1           0     0.0001     0.0006     0.0031     0.0157     0.0785     0.2844     0.5407     0.8788     1.2788       ⋮  outputDataX1 = outputValsX1.Data outputDataX1 = 64×1      2.0000     2.0000     2.0000     2.0000     1.9998     1.9943     1.9379     1.8155     1.5990     1.2687       ⋮ 

        还可以将这些步骤合并到一行代码中以访问时间值或数据值。

outputDataX1 = getElement(out.yout,'x1').Values.Data outputDataX1 = 64×1      2.0000     2.0000     2.0000     2.0000     1.9998     1.9943     1.9379     1.8155     1.5990     1.2687       ⋮ 

使用 Dataset 对象来组合模拟输入信号

        创建三个模拟输入信号的数据,并将它们组合到一个 Dataset 对象中。一个简单的模型使用三个根级 Inport 块来加载 Dataset 对象的内容。模型中的 Dashboard Scope 块显示使用加载的输入数据创建的每个信号。

        首先,创建要加载到模型中的信号数据。在建模离散输入信号时,可以使用此示例中的表达式创建均匀间隔的时间向量。MATLAB® 支持多种其他方法来创建均匀间隔的向量,但其他方法可能会在时间数据中引入双精度舍入误差,从而导致意外的模拟结果。

sampleTime = 0.01; numSteps = 1001; time = sampleTime*(0:numSteps-1); time = time';

        创建正弦信号、余弦信号和线性信号的信号数据。

sineVals = sin(2*pi/3*time); cosVals = cos(2*pi/3*time); lineVals = time;

        创建一个 timeseries 对象来存储每个信号的数据。为每个 timeseries 对象赋予一个描述性名称,以便在它们被组合到 Dataset 对象中后,信号可以容易识别。

sineTS = timeseries(sineVals,time,'Name','Sine Wave'); cosTS = timeseries(cosVals,time,'Name','Cosine Wave'); lineTS = timeseries(lineVals,time,'Name','Line');

        创建一个 Dataset 对象,并使用 addElement 函数将每个 timeseries 对象添加到 Dataset 对象中。

inputData = Simulink.SimulationData.Dataset; inputData.Name = 'inputData'; inputData = addElement(inputData,sineTS); inputData = addElement(inputData,cosTS); inputData = addElement(inputData,lineTS) inputData =  Simulink.SimulationData.Dataset 'inputData' with 3 elements                               Name         BlockPath                               ___________  _________      1  [1x1 timeseries]      Sine Wave    ''            2  [1x1 timeseries]      Cosine Wave  ''            3  [1x1 timeseries]      Line         ''           - Use braces { } to access, modify, or add elements using index. 

        当使用根级Inport块加载外部输入数据时,您需要在“数据导入/导出”面板的“模型配置参数”中的“Input”参数中指定要加载的数据。打开模型LoadInputDataset并查看Input参数已指定为inputData。

open_system('LoadInputDataset.slx');

        对模型进行仿真。与第一个Inport块连接的Dashboard Scope块显示正弦信号,与第二个Inport块连接的Dashboard Scope块显示余弦信号,与第三个Inport块连接的Dashboard Scope块显示线性信号。

out = sim('LoadInputDataset.slx');

如图所示:

        可以交换Dataset对象中元素的顺序,然后在元素与Inport块的映射方式上看到相应的变化。

inputData{1} = lineTS; inputData{3} = sineTS inputData =  Simulink.SimulationData.Dataset 'inputData' with 3 elements                               Name         BlockPath                               ___________  _________      1  [1x1 timeseries]      Line         ''            2  [1x1 timeseries]      Cosine Wave  ''            3  [1x1 timeseries]      Sine Wave    ''           - Use braces { } to access, modify, or add elements using index.

        再次对模型进行仿真。现在,显示第一个元素的Dashboard Scope块显示直线,而显示第三个元素的Dashboard Scope块显示正弦波,反映了Dataset对象中元素的新顺序。

out = sim('LoadInputDataset.slx');

如图所示:

        一个Simulink.SimulationData.Dataset对象用于组合相关的数据。通常,已记录的模拟结果会被组织在Dataset对象中。当加载初始状态以及使用Inport块或Signal Editor块加载外部输入数据时,也可以使用Dataset对象来组合模拟输入数据。

        通过记录模拟数据创建的Dataset对象包含一个或多个元素。每个元素包含一个已记录的信号、输出、数据存储或状态的数据。每个元素都是一个对象,对象的类型取决于它所包含的数据类型。

        信号和输出 — Simulink.SimulationData.Signal对象

        状态和最终状态 — Simulink.SimulationData.State对象

        数据存储 — Simulink.SimulationData.DataStoreMemory对象

当创建一个用于组合模拟输入数据的Dataset对象时,每个元素包含一个信号、总线或总线数组的数据。可以使用任何受支持的加载方法支持的数据格式添加数据。

通常,在记录模拟数据时,会创建一个Simulink.SimulationData.Dataset对象,包括以下情况:

  1. 使用信号记录时记录数据。
  2. 使用Dataset格式记录输出、状态或最终状态数据。
  3. 记录数据存储。
  4. 使用记录块将数据记录到工作区或MAT文件中。
  5. 使用Scope块以Dataset格式记录数据。
  6. 使用Floating Scope或Scope Viewer记录数据。

要将模型的外部输入数据组合到Dataset对象中,您可以执行以下操作:

  1. 创建一个空的Dataset对象,并使用addElement函数添加输入数据。
  2. 使用createInputDataset创建一个Dataset对象,其中包含模型中每个根级Inport块或In Bus Element块的元素。然后,指定每个元素的数据。
  3. 使用Signal Editor交互式地创建和编辑包含模拟输入数据的Dataset对象。有关详细信息,请参阅创建和编辑信号数据。

        还可以通过将使用其他格式的数据转换为使用Dataset格式的数据来创建Dataset对象。将所有数据保存在一个通用格式中可以简化后处理过程。有关详细信息,请参阅将timeseries对象转换为Dataset对象。

注意:

  • 可以使用花括号({})按索引访问、添加或修改Dataset对象中的元素。

  • 要通过名称访问、添加或修改Dataset对象的元素,可以使用getElement、addElement和setElement函数。

  • 当使用Dataset对象组合模拟输入时,您可以使用Signal Editor或Signal Editor块轻松更改提供模拟输入的Dataset对象。

  • 当使用根级Inport块从Dataset对象加载外部输入数据时,可以使用Root Inport Mapper将Dataset对象中的每个元素按块名称、块路径、信号名称或端口顺序映射到Inport块。也可以编写自己的函数来进行数据映射。

  • 当将Dataset对象中的数据保存到MAT文件时,如果Dataset对象的内容过大而无法完全装入内存,考虑保存到Version 7.3 MAT文件。您可以创建一个Simulink.SimulationData.DatasetRef,它引用了一个MAT文件中的Dataset对象,而不需要将数据加载到内存中进行数据处理或加载大数据。

  • 要将Dataset对象保存到一个可以在早期版本中打开的MAT文件中,请使用save函数而不是exportToPreviousRelease函数。

  • 可以编写自己的读取器,使用Simulink.io.FileType类将数据从文件导入到基础工作区、模型工作区或Signal Editor中的Dataset对象。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!