Dataset 形式へのデータの変換
Dataset 形式に変換する理由
次のいずれかの形式で記録されたログ データを含む MATLAB® ワークスペース変数は、Simulink.SimulationData.Dataset コンストラクターを使用して Dataset 形式に変換できます。
配列
構造体
時間付き構造体
MATLAB
timeseriesオブジェクト
他のログ形式のデータを Dataset 形式に変換すると、ログ データの後処理を実行するスクリプトの作成が簡単になります。たとえば、複数の To Workspace ブロックをもつモデルはさまざまなデータ形式を使用できます。ログ データを Dataset 形式に変換すると、さまざまな形式を処理するために特別なコードを記述する必要がなくなります。
データ ログ形式のサポート レベルはシミュレーション モードごとに異なります。ノーマル モードとアクセラレータ モードの間でモードを切り替えるときは、使用するログ形式の変更が必要になることがあります。
Dataset 形式に変換することで、Dataset 形式を必要とする機能も簡単に利用できるようになります。以前のリリースで記録された Dataset 以外の形式のログ データを簡単に変換して、新しいリリースの Dataset データと一緒に使用できます。
Dataset 形式には次のような特徴があります。
MATLAB
timeseriesオブジェクトを使用してログ データを格納すると、MATLAB で Simulink® ライセンスなしでログ データを操作可能。たとえば、ログ データを操作するには、filter、detrend、resampleなどの MATLABtimeseriesオブジェクト関数を使用可能。反復サブシステムや Stateflow® 信号ログに重要となる所定のタイム ステップでの複数データ値のログをサポート。
既定では、生成される Dataset オブジェクトのオブジェクト名には変数の名前が使用されます。名前と値の引数を使用して Dataset の名前を指定できます。
関数 concat を使用して、複数の Dataset オブジェクトを 1 つの Dataset オブジェクトに連結することもできます。
変換結果
Dataset オブジェクトでは、データが要素として格納されます。オブジェクト変数 Dataset の要素を表示するには、MATLAB コマンド プロンプトで変数名を入力します。各要素はオブジェクトです。オブジェクトのタイプは各要素に格納されるデータによって異なります。たとえば、信号ログでは 要素としてデータが格納され、Simulink.SimulationData.SignalDataset 形式の状態ログでは 要素として格納されます。それぞれの要素では MATLAB Simulink.SimulationData.Statetimeseries オブジェクトとしてデータが格納されます。変換の実行時は、要素や timeseries のフィールドに変換後のオブジェクトからできるだけ多くの値が読み込まれるように処理されます。
| 形式 | 変換結果に関するメモ |
|---|---|
MATLAB | 非バス データのログを変換するときは、ソフトウェアによって、まず
|
構造体および時間付き構造体 | 構造体および時間付き構造体の形式では、 構造体の変換では、構造体が スコープ データを構造体形式で記録する場合、その構造体には |
配列 | 配列に格納される情報は多くありません。たとえば、ブロック パスの情報は格納されません。 配列の変換では、配列が |
timeseries オブジェクトから Dataset オブジェクトへの変換
timeseries 形式から Dataset 形式にデータを変換します。モデル vdpConvert は、データのログを simout および simout1 という名前の変数に記録する 2 つの To Workspace ブロックがある vdp モデルです。

モデルのシミュレーションを実行します。既定では、To Workspace ブロックはデータを timeseries オブジェクトとしてログに記録します。
out = sim("vdpConvert")out =
Simulink.SimulationOutput:
simout: [1x1 timeseries]
simout1: [1x1 timeseries]
SimulationMetadata: [1x1 Simulink.SimulationMetadata]
ErrorMessage: [0x0 char]
Simulink.SimulationData.Dataset コンストラクターを使用して timeseries オブジェクトを Dataset 形式に変換します。
ds = Simulink.SimulationData.Dataset(out.simout)
ds =
Simulink.SimulationData.Dataset '' with 1 element
Name BlockPath
____ _________
1 [1x1 Signal] x1 ''
- Use braces { } to access, modify, or add elements using index.
ds1 = Simulink.SimulationData.Dataset(out.simout1)
ds1 =
Simulink.SimulationData.Dataset '' with 1 element
Name BlockPath
____ _________
1 [1x1 Signal] x2 ''
- Use braces { } to access, modify, or add elements using index.
関数 concat を使用して、2 つの Dataset オブジェクトを 1 つの Dataset オブジェクトに連結できます。
dsFinal = concat(ds,ds1)
dsFinal =
Simulink.SimulationData.Dataset '' with 2 elements
Name BlockPath
____ _________
1 [1x1 Signal] x1 ''
2 [1x1 Signal] x2 ''
- Use braces { } to access, modify, or add elements using index.
構造体から Dataset オブジェクトへの変換
構造体を Dataset 形式に変換します。モデル vdpConvert は、データのログを simout および simout1 という名前の変数に記録する 2 つの To Workspace ブロックがある vdp モデルです。

既定では、To Workspace ブロックはデータを timeseries オブジェクトとしてログに記録します。変数 simout にデータを保存する To Workspace ブロックについて、データのログを時間付き構造体として記録するように設定します。変数 simout1 にデータを保存する To Workspace ブロックについては、データのログを時間なしの構造体として記録するように設定します。
mdl = "vdpConvert"; load_system(mdl) set_param("vdpConvert/To Workspace","SaveFormat","Structure With Time") set_param("vdpConvert/To Workspace1","SaveFormat","Structure")
モデルのシミュレーションを実行します。
out = sim(mdl);
To Workspace ブロックからのデータが単一の SimulationOutput オブジェクト out に格納されます。このデータにアクセスするには、ドット表記を使用します。
simout = out.simout
simout = struct with fields:
time: [64×1 double]
signals: [1×1 struct]
blockName: 'vdpConvert/To Workspace'
simout1 = out.simout1
simout1 = struct with fields:
time: []
signals: [1×1 struct]
blockName: 'vdpConvert/To Workspace1'
両方の To Workspace ブロックの構造体データを Dataset 形式に変換します。
ds = Simulink.SimulationData.Dataset(simout); ds1 = Simulink.SimulationData.Dataset(simout1);
要素 ds の時間値にアクセスします。
get(ds,1).Values.time
ans = 64×1
0
0.0001
0.0006
0.0031
0.0157
0.0785
0.2844
0.5407
0.8788
1.2788
1.6788
2.0788
2.4788
2.8788
3.2138
⋮
simout1 の時間フィールドが空の配列であることに注目してください。時間なしの構造体または配列が Dataset オブジェクトに変換されると、0 で始まって 1 ずつインクリメントする時間ベクトルが挿入されます。
ds1 の要素の時間値を取得します。構造体 simout1 には時間ベクトルが含まれていないため、Dataset オブジェクト ds1 のタイム ステップはシミュレーション タイム ステップと一致しません。
get(ds1,1).Values.Time
ans = 64×1
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
⋮
データセット変換の制限
ログ データを
Dataset形式に変換すると、元のログ データに含まれていたすべての情報がDatasetオブジェクトに格納されます。ただし、対応する情報がないDatasetの他のプロパティについては既定値が使用されます。To Workspace ブロックを使用してログ記録された可変サイズの信号のデータを変換すると、構造体の
valueDimensionsフィールドの情報が変換で失われます。バスを配列、構造体、時間付き構造体の形式で記録すると、ログ データは次のように整理されます。
バスの最初の信号のデータが 1 列目に含まれる
2 番目のバス信号のデータが 2 列目に含まれる (それ以降も同様)
このデータを
Dataset形式に変換するときは、Datasetオブジェクトでもこの構成が維持されます。ただし、変換ではなくDataset形式でバスのログを作成する場合は、このバス データはtimeseriesオブジェクトの構造体として取得されます。ログ データに時間ベクトルが含まれていない場合、そのデータを
Dataset形式に変換すると、変換によって時間ベクトルが挿入されます。時間ベクトルでは、それぞれのデータ値にタイム ステップが 1 つずつあります。ただし、シミュレーションのタイム ステップとDatasetのタイム ステップは可変です。Dataset形式ではフレーム信号の仕様は無視されます。構造体または時間付き構造体のデータをDataset形式に変換する際、フレーム信号のログ データは形状変更されます。
参考
オブジェクト
Simulink.SimulationData.BlockPath|Simulink.SimulationData.Signal|Simulink.SimulationData.DataStoreMemory|Simulink.SimulationData.Dataset
関数
addElement|concat|find|get|getElementNames|numElements|setElement