Main Content

Dataset 形式へのデータの変換

Dataset 形式に変換する理由

次のいずれかの形式で記録されたログ データを含む MATLAB® ワークスペース変数は、Simulink.SimulationData.Dataset コンストラクターを使用して Dataset 形式に変換できます。

  • 配列

  • 構造体

  • 時間付き構造体

  • MATLAB timeseries オブジェクト

  • ModelDataLogs

他のログ形式のデータを Dataset 形式に変換すると、ログ データの後処理を実行するスクリプトの作成が簡単になります。たとえば、複数の To Workspace ブロックをもつモデルはさまざまなデータ形式を使用できます。ログ データを Dataset 形式に変換すると、さまざまな形式を処理するために特別なコードを記述する必要がなくなります。

データ ログ形式のサポート レベルはシミュレーション モードごとに異なります。ノーマル モードとアクセラレータ モードの間でモードを切り替えるときは、使用するログ形式の変更が必要になることがあります。

Dataset 形式に変換することで、Dataset 形式を必要とする機能も簡単に利用できるようになります。以前のリリースで記録された Dataset 以外の形式のログ データを簡単に変換して、新しいリリースの Dataset データと一緒に使用できます。

Dataset 形式には次のような特徴があります。

  • MATLAB timeseries オブジェクトを使用してログ データを格納すると、MATLAB で Simulink® ライセンスなしでログ データを操作可能。たとえば、ログ データを操作するには、filterdetrendresample などの MATLAB timeseries オブジェクト関数を使用可能。

  • 反復サブシステムや Stateflow® 信号ログに重要となる所定のタイム ステップでの複数データ値のログをサポート。

既定では、生成される Dataset オブジェクトのオブジェクト名には変数の名前が使用されます。名前と値の引数を使用して Dataset の名前を指定できます。

関数 concat を使用して、複数の Dataset オブジェクトを 1 つの Dataset オブジェクトに連結することもできます。

変換結果

Dataset オブジェクトでは、データが要素として格納されます。オブジェクト変数 Dataset の要素を表示するには、MATLAB コマンド プロンプトで変数名を入力します。各要素はオブジェクトです。オブジェクトのタイプは各要素に格納されるデータによって異なります。たとえば、信号ログでは Simulink.SimulationData.Signal 要素としてデータが格納され、Dataset 形式の状態ログでは Simulink.SimulationData.State 要素として格納されます。それぞれの要素では MATLAB timeseries オブジェクトとしてデータが格納されます。変換の実行時は、要素や timeseries のフィールドに変換後のオブジェクトからできるだけ多くの値が読み込まれるように処理されます。

形式変換結果に関するメモ

MATLAB timeseries オブジェクト

非バス データのログを変換するときは、ソフトウェアによって、まず Simulink.SimulationData.Signal オブジェクトとしてデータが追加されます。その後、そのオブジェクトが新たに作成された Dataset の要素として追加されます。

timeseries 形式のバス データのログでは、それぞれの timeseries オブジェクトがバスの各要素に対応します。これらのログ データは、変換すると timeseries オブジェクトをリーフ ノードとする構造体にまとめられ、この構造体の階層はバスの階層に対応します。このタイプの構造体を変換するときは、構造体が Signal オブジェクトに追加されます。その後、Signal オブジェクトが Dataset オブジェクトに要素として追加されます。

timeseries オブジェクトには、ブロック パスやタイムスタンプなどの関連情報が格納されています。変換時には、その情報を維持するように処理されます。

構造体および時間付き構造体

構造体および時間付き構造体の形式では、Dataset 形式で記録した場合ほど多くの情報が格納されるとは限りません。ただし、構造体および時間付き構造体の形式を変換するときは、データ構造体に time フィールドと signals フィールドがなければなりません。

構造体の変換では、構造体が Simulink.SimulationData.Signal オブジェクトに追加され、そのオブジェクトが Dataset オブジェクトの要素として追加されます。他の情報がある場合は、その情報も要素または timeseries オブジェクトの値に追加されます。たとえば、構造体に blockName というフィールドがある場合、ブロック名がブロック パスに追加されます。それ以外の場合、ブロック パスは空になります。

スコープ データを構造体形式で記録する場合、その構造体には PlotStyle フィールドが含まれます。このフィールドを使用して、Dataset オブジェクトの内挿が設定されます。

配列

配列に格納される情報は多くありません。たとえば、ブロック パスの情報は格納されません。

配列の変換では、配列が Simulink.SimulationData.Signal オブジェクトに追加され、Signal オブジェクトが Dataset オブジェクトの要素として追加されます。ブロック パスやタイムスタンプなどの情報がないフィールドについては、空として扱われるか既定値が使用されます。

ModelDataLogs

ModelDataLogs 形式から Dataset 形式にデータが変換されます。

メモ

ModelDataLogs 形式は信号のログには使われなくなります。

timeseries オブジェクトから Dataset オブジェクトへの変換

timeseries 形式から Dataset 形式にデータを変換します。モデル vdpConvert は、データのログを simout および simout1 という名前の変数に記録する 2 つの To Workspace ブロックがある vdp モデルです。

Model of the van der Pol equation.

モデルをシミュレートします。既定では、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 モデルです。

Model of the van der Pol equation.

モデルをシミュレートします。

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_dataModelDataLogs 形式から Dataset 形式に更新します。

new_dataset = convertToDataset(logsout,"older_model_data")

ModelDataLogs 形式を使用するモデルを Dataset 形式を使用するモデルに変換する場合、既存モデルや、コールバック、関数、スクリプトまたはテストのコードに変更を加えなければならない場合があります。以下の表は、Dataset 形式への変換後に発生する可能性がある問題を示しています。

予想される Dataset 形式への変換後の問題解決法

ModelDataLogs のプログラム インターフェイスによりデータにアクセスしていた既存のコールバック、関数、スクリプトまたはテストのコードが、エラー終了する場合がある。

ModelDataLogs 形式のアクセス メソッドを使用するコードがあるかどうかをチェックします。そのコードを、Dataset 形式のアクセス メソッドを使用するように更新します。

たとえば、既存のコードに以下の行が含まれるとします。

logsout.('Subsystem Name').X.data

このコードを Dataset アクセス関数に置き換えます。

get(logsout,"x").Values.data

Mux ブロック信号名が失われる。

Dataset 形式では、Mux ブロック信号をベクトルとして処理します。信号名で信号を特定するには、Mux ブロックを Bus Creator ブロックに置き換えます。

信号ログに信号ビューアーを使用できない。

信号ログ データは信号ビューアーに記録されません。

信号のログ出力変数を使用してログ データを表示します。

関数 unpack でエラーが生成される。

関数 unpack は、Simulink.ModelDataLogs および Simulink.SubsysDataLogs オブジェクトではサポートされていますが、Simulink.SimulationData.Dataset オブジェクトではサポートされて "いません"

たとえば、mlog のデータに、xy および z の 3 つのフィールドがあるとします。

  • ModelDataLogs 形式データの場合、関数 mlog.unpack がベース ワークスペースに 3 つの変数を作成します。

  • Dataset 形式データの場合、関数 get が名前でデータにアクセスします。

    x = get(logsout,"x").Values

ModelDataLogs 形式と Dataset 形式で、名前のない信号に対する命名規則が異なる。

必要に応じて、信号名を追加します。

ModelDataLogs 形式では、ブロックから出力される名前のない信号に対し、SL_BlockName+<portIndex> という形式の名前 (SL_Gain1 など) が割り当てられます。

Dataset 形式では、要素に名前は不要であるため、信号名は空のままになります。

ModelDataLogs 形式と Dataset 形式の両方について、Bus Selector ブロックから出力された名前のない信号に同じ名前が割り当てられます。

参照モデル内のテスト ポイントがログに記録されない。

参照モデル内のテスト ポイントに対して信号ログの有効化を検討します。

スクリプトは関数 who または関数 whos を使用します。

代わりに find の使用を検討してください。

データセット変換の制限

  • ログ データを Dataset 形式に変換すると、元のログ データに含まれていたすべての情報が Dataset オブジェクトに格納されます。ただし、対応する情報がない Dataset の他のプロパティについては既定値が使用されます。

  • To Workspace ブロックを使用してログ記録された可変サイズの信号のデータを変換すると、構造体の valueDimensions フィールドの情報が変換で失われます。

  • バスを配列、構造体、時間付き構造体の形式で記録すると、ログ データは次のように整理されます。

    • バスの最初の信号のデータが 1 列目に含まれる

    • 2 番目のバス信号のデータが 2 列目に含まれる (それ以降も同様)

    このデータを Dataset 形式に変換するときは、Dataset オブジェクトでもこの構成が維持されます。ただし、変換ではなく Dataset 形式でバスのログを作成する場合は、このバス データは timeseries オブジェクトの構造体として取得されます。

  • ログ データに時間ベクトルが含まれていない場合、そのデータを Dataset 形式に変換すると、変換によって時間ベクトルが挿入されます。時間ベクトルでは、それぞれのデータ値にタイム ステップが 1 つずつあります。ただし、シミュレーションのタイム ステップと Dataset のタイム ステップは可変です。

  • Dataset 形式ではフレーム信号の仕様は無視されます。構造体または時間付き構造体のデータを Dataset 形式に変換する際、フレーム信号のログ データは形状変更されます。

参考

オブジェクト

関数

関連するトピック