目录
语法
说明
示例
访问使用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.SignalPackage: Simulink.SimulationDataProperties:Name: 'x1'PropagatedName: ''BlockPath: [1x1 Simulink.SimulationData.BlockPath]PortType: 'inport'PortIndex: 1Values: [1x1 timeseries]
信号数据存储在 Signal 对象的 Values 属性中,以 timeseries 对象的形式。
outputValsX1 = outputX1.ValuestimeseriesCommon Properties:Name: 'x1'Time: [64x1 double]TimeInfo: tsdata.timemetadataData: [64x1 double]DataInfo: tsdata.datametadata
时间值位于 timeseries 对象的 Time 属性中,信号值位于 Data 属性中。
outputTimesX1 = outputValsX1.Time
outputTimesX1 = 64×100.00010.00060.00310.01570.07850.28440.54070.87881.2788⋮outputDataX1 = outputValsX1.Data
outputDataX1 = 64×12.00002.00002.00002.00001.99981.99431.93791.81551.59901.2687⋮
还可以将这些步骤合并到一行代码中以访问时间值或数据值。
outputDataX1 = getElement(out.yout,'x1').Values.Data
outputDataX1 = 64×12.00002.00002.00002.00001.99981.99431.93791.81551.59901.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 elementsName 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 elementsName 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对象,包括以下情况:
- 使用信号记录时记录数据。
- 使用Dataset格式记录输出、状态或最终状态数据。
- 记录数据存储。
- 使用记录块将数据记录到工作区或MAT文件中。
- 使用Scope块以Dataset格式记录数据。
- 使用Floating Scope或Scope Viewer记录数据。
要将模型的外部输入数据组合到Dataset对象中,您可以执行以下操作:
- 创建一个空的Dataset对象,并使用addElement函数添加输入数据。
- 使用createInputDataset创建一个Dataset对象,其中包含模型中每个根级Inport块或In Bus Element块的元素。然后,指定每个元素的数据。
- 使用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对象。