Dataset 形式へのデータの変換
Dataset 形式に変換する理由
次のいずれかの形式で記録されたログ データを含む MATLAB® ワークスペース変数は、Simulink.SimulationData.Dataset
コンストラクターを使用して Dataset
形式に変換できます。
配列
構造体
時間付き構造体
MATLAB
timeseries
オブジェクトModelDataLogs
他のログ形式のデータを 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.Signal
Dataset
形式の状態ログでは
要素として格納されます。それぞれの要素では MATLAB Simulink.SimulationData.State
timeseries
オブジェクトとしてデータが格納されます。変換の実行時は、要素や 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
形式に変換します。モデル vdpConvertStructure
は、データのログを simout
および simout1
という名前の構造体形式の変数に記録する 2 つの To Workspace ブロックがある vdp
モデルです。
モデルをシミュレートします。
out = sim("vdpConvertStructure");
変数 simout
にデータを保存する To Workspace ブロックは、データのログを時間付き構造体として記録します。変数 simout1
にデータを保存する To Workspace ブロックは、データのログを時間なしの構造体として記録します。
simout = out.simout
simout = struct with fields:
time: [64x1 double]
signals: [1x1 struct]
blockName: 'vdpConvertStructure/To Workspace'
simout1 = out.simout1
simout1 = struct with fields:
time: []
signals: [1x1 struct]
blockName: 'vdpConvertStructure/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
⋮
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
⋮
ModelDataLogs
を使用するレガシ コードの移行
ログ記録に ModelDataLogs
形式を使用する R2016a より前のリリースで作成されたモデルをシミュレートするスクリプトでは、Dataset
形式でログ記録するようにコードを更新します。
信号データを ModelDataLogs
形式で既にログに記録している場合、関数 convertToDataset
を使用して、ModelDataLogs
信号のログ データを Dataset
形式を使用するように更新できます。たとえば、older_model_data
を ModelDataLogs
形式から Dataset
形式に更新します。
new_dataset = convertToDataset(logsout,"older_model_data")
ModelDataLogs
形式を使用するモデルを Dataset
形式を使用するモデルに変換する場合、既存モデルや、コールバック、関数、スクリプトまたはテストのコードに変更を加えなければならない場合があります。以下の表は、Dataset
形式への変換後に発生する可能性がある問題を示しています。
予想される Dataset 形式への変換後の問題 | 解決法 |
---|---|
|
たとえば、既存のコードに以下の行が含まれるとします。 logsout.('Subsystem Name').X.data このコードを get(logsout,"x").Values.data |
Mux ブロック信号名が失われる。 |
|
信号ログに信号ビューアーを使用できない。 | 信号ログ データは信号ビューアーに記録されません。 信号のログ出力変数を使用してログ データを表示します。 |
関数 | 関数 たとえば、
|
| 必要に応じて、信号名を追加します。
|
参照モデル内のテスト ポイントがログに記録されない。 | 参照モデル内のテスト ポイントに対して信号ログの有効化を検討します。 |
スクリプトは関数 | 代わりに |
データセット変換の制限
ログ データを
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