最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

matlab.io.datastore.sdidatastore クラス

パッケージ: matlab.io.datastore

シミュレーション データ インスペクター信号のデータ ストア

説明

matlab.io.datastore.sdidatastore オブジェクトを使用すると、シミュレーション データ インスペクターにログ記録された信号のうち、大きすぎてメモリに入りきらない信号にアクセスできます。sdidatastore オブジェクトは、単一の信号のデータを参照します。read メソッドは、sdidatastore オブジェクトによって参照された信号データを、各チャンクが常にメモリに収まるようにチャンク単位で読み取ります。sdidatastore オブジェクトを使用して、信号データの tall timetable を作成できます。tall 配列の使い方の詳細については、tall 配列 を参照してください。

メモ

matlab.io.datastore.sdidatastore は、並列計算をサポートしていません。Parallel Computing Toolbox™ ライセンスをお持ちの場合、matlab.io.datastore.sdidatastore から tall timetable を作成する前に、mapreducer(0) を使用して実行環境をローカル MATLAB® クライアントに設定してください。

作成

ds = dsrObj.getAsDatastore(arg) は検索基準 arg によって選択される Simulink.sdi.DatasetRef オブジェクトの信号の sdidatastoreds を作成します。arg は、Simulink.sdi.DatasetRef オブジェクト内の目的の信号のインデックスを表す整数、または信号名を含む文字ベクトルとして指定できます。

ds = matlab.io.datastore.sdidatastore(signalID) は、指定された signalID に対応する信号に対して、sdidatastoreds を作成します。

入力引数

すべて展開する

Simulink.sdi.DatasetRef オブジェクトから要素を取得するために使用される検索基準。名前ベースの検索では、arg を文字ベクトルとして指定します。インデックスベースの検索では、arg は整数で、目的の要素のインデックスを表します。

例: 'MySignal'

例: 3

その信号に対してシミュレーション データ インスペクターによって生成された、数値信号識別子。信号を含む Simulink.sdi.Run オブジェクトのメソッドを使用するか、関数 Simulink.sdi.createRun の戻り値として、信号の信号 ID を取得できます。

プロパティ

すべて展開する

文字ベクトルとして指定する信号の名前。

例: 'My Signal'

sdidatastore に関連付けられた Simulink.sdi.Signal オブジェクト。Signal プロパティを使用すると、信号データおよびメタデータにアクセスできます。

メソッド

hasdata データが読み取り可能かどうかを判別
preview sdidatstore 内のデータのプレビューを返す
read sdidatastore からデータのチャンクを読み取る
readall sdidatastore からすべてのデータを読み取る
reset 読み取り位置のリセット

コピーのセマンティクス

ハンドル。ハンドル クラスがコピー操作にどのように影響するかについては、オブジェクトのコピーを参照してください。

すべて折りたたむ

この例は、シミュレーション データ インスペクター リポジトリ内の信号の tall timetable を作成する方法を示します。tall timetable を作成するには、Simulink.sdi.Signalオブジェクトを使用するか、先に信号の matlab.io.datastore.sdidatastore を作成します。matlab.io.datastore.sdidatastore を使用すると、メモリに入りきらない信号の信号データをインクリメンタルに読み取り、処理することができます。tall timetable は、バックグラウンドでデータのチャンク化と処理を実行します。一般的に、tall timetable はメモリ内のデータとよく似た方法で扱うことができます。

データの作成と信号 ID へのアクセス

tall timetable の作成を Simulink.sdi.Signal オブジェクトによって行うか、matlab.io.datastore.sdidatastore によって行うかにかかわらず、まずはデータを作成し、対象の信号の信号 ID にアクセスします。sldemo_fuelsys モデルは、モデルのシミュレーションを実行すると、シミュレーション データ インスペクター リポジトリにストリーミングされる信号をログ記録するように構成されています。

open_system('sldemo_fuelsys')
sim('sldemo_fuelsys')

次に、シミュレーション データ インスペクターのプログラムによるインターフェイスを使用して、対象の信号の信号 ID にアクセスします。たとえば、ego 信号にアクセスします。

runCount = Simulink.sdi.getRunCount;
latestRunID = Simulink.sdi.getRunIDByIndex(runCount);
latestRun = Simulink.sdi.getRun(latestRunID);

egoSigID = latestRun.getSignalIDByIndex(7);

matlab.io.datastore.sdidatastore を使用した tall timetable の作成

一般的に、tall timetable はデータ ストアにバックアップされます。matlab.io.datastore.sdidatastore オブジェクトを作成して、シミュレーション データ インスペクター リポジトリ内の信号データを参照します。

egoDs = matlab.io.datastore.sdidatastore(egoSigID);

データ ストアの名前をチェックして、期待通りの信号が得られたことを確認します。

egoDs.Name
ans = 
'fuel'

matlab.io.datastore.sdidatastore から、信号データの処理に使用する tall timetable を作成します。Parallel Computing Toolbox™ ライセンスをお持ちの場合、tall timetable を作成する前に、mapreducer を使用して実行環境を明示的にローカル MATLAB® セッションに設定する必要があります。matlab.io.datastore.sdidatastore オブジェクトは、並列計算をサポートしていません。

mapreducer(0);

egoTt = tall(egoDs)
egoTt =

  Mx1 tall timetable

         Time          Data 
    ______________    ______

    0 sec              1.209
    0.00056199 sec     1.209
    0.0033719 sec      1.209
    0.01 sec          1.1729
    0.02 sec          1.1409
    0.03 sec          1.1124
    0.04 sec          1.0873
    0.05 sec          1.0652
          :             :
          :             :

Simulink.sdi.Signal オブジェクトを使用した tall timetable の作成

Simulink.sdi.Signal クラスは、tall timetable を直接作成するメソッドを持っています。データ ストアが内部的に作成されるため、データ ストアを作成する手順を省くことができます。信号 ID を使用して、ego 信号の Simulink.sdi.Signal オブジェクトにアクセスします。次に、getTable メソッドを使用して tall timetable を作成します。

egoSig = Simulink.sdi.getSignal(egoSigID);

egoTt = egoSig.getAsTall
egoTt =

  Mx1 tall timetable

         Time          Data 
    ______________    ______

    0 sec              1.209
    0.00056199 sec     1.209
    0.0033719 sec      1.209
    0.01 sec          1.1729
    0.02 sec          1.1409
    0.03 sec          1.1124
    0.04 sec          1.0873
    0.05 sec          1.0652
          :             :
          :             :

tall timetable を使用した信号データの処理

tall timetable egoTt を使用する場合、その基となるデータ ストアがデータのチャンクを読み取って tall timetable に渡し、処理が行われます。処理が終わった後、データ ストアと tall timetable のいずれにも、メモリ内のデータは保持されません。また、tall timetable は多くの演算の処理を遅延させます。たとえば、信号の平均値を計算します。

egoMean = mean(egoTt.Data)
egoMean =

  tall double

    ?

関数 gather を使用して変数を評価してその値をワークスペースに書き込むか、関数 write を使用して結果をディスクに書き込むことができます。gather を使用する場合は、必ず結果がメモリに収まるようにしてください。

egoMean = gather(egoMean)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 1 min 51 sec
Evaluation completed in 1 min 51 sec
egoMean = 1.3292

tall timetable で複数の演算を行う場合、各ステップの結果の評価は、write または gather によって明示的に結果をリクエストするまで遅延されます。MATLAB では、評価中に tall timetable を通す回数を最適化することで、大規模な信号の処理時間を著しく短縮できます。tall 配列の使い方の詳細については、メモリに収まらないデータの tall 配列 を参照してください。

matlab.io.datastore.sdidatastore は、シミュレーション データ インスペクター リポジトリ内の信号データを参照します。信号が大きすぎてメモリに入りきらない場合、matlab.io.datastore.sdidatastore を使用して手動でデータをインクリメンタルに処理するか、信号のインクリメンタル処理をユーザーに代わって実行する tall timetable を作成します。この例は、matlab.io.datastore.sdidatastore を使用してデータを処理する方法を示します。

信号の matlab.io.datastore.sdidatastore の作成

sldemo_fuelsys モデルをシミュレートします。このモデルは、複数の信号をログに記録して、シミュレーション データ インスペクター リポジトリ内にデータを作成するよう構成されています。

sim('sldemo_fuelsys')

シミュレーション データ インスペクターのプログラムによるインターフェイスを使用して、信号の信号 ID を取得します。

runCount = Simulink.sdi.getRunCount;

latestRunID = Simulink.sdi.getRunIDByIndex(runCount);

latestRun = Simulink.sdi.getRun(latestRunID);

speedSigID = latestRun.getSignalIDByIndex(4);

信号 ID を使用して、speed 信号の matlab.io.datastore.sdidatastore を作成します。

speedSDIds = matlab.io.datastore.sdidatastore(speedSigID);

データ ストアの内容の確認

matlab.io.datastore.sdidatastoreName プロパティをチェックして、想定のとおりの内容であることを確認します。

speedSDIds.Name
ans = 
'map'

また、preview メソッドを使用して、信号内の最初の 10 個のサンプルが正しく見えることを確認することもできます。

speedSDIds.preview
ans=10×1 timetable
         Time          Data  
    ______________    _______

    0 sec               0.589
    0.00056199 sec    0.58772
    0.0033719 sec     0.58148
    0.01 sec          0.56765
    0.02 sec          0.54897
    0.03 sec          0.53264
    0.04 sec          0.51837
    0.05 sec          0.50594
    0.055328 sec          0.5
    0.055328 sec          0.5

matlab.io.datastore.sdidatastore による信号データの処理

信号が大きすぎてメモリに入りきらない場合、readData メソッドを使用して、シミュレーション データ インスペクター リポジトリからデータのチャンクを読み取り、データをインクリメンタルに処理することができます。hasdata メソッドを、信号全体をインクリメンタルに処理する際の while ループの条件として使用します。たとえば、信号の最大値を見つけます。

latestMax = [];

while speedSDIds.hasdata
    
    speedChunk = speedSDIds.read;
    speedChunkData = speedChunk.Data;
    latestMax = max([speedChunkData; latestMax]);
    
end

latestMax
latestMax = 0.8897

各読み取り操作で、read メソッドは、読み取り位置を次の読み取り操作の開始位置に更新します。matlab.io.datastore.sdidatastore の一部またはすべてを読み取った後、読み取り位置をリセットして、信号の先頭から再度開始することができます。

speedSDIds.reset

メモリ内の信号データの処理

matlab.io.datastore.sdidatastore で参照された信号がメモリに収まる場合、read メソッドでデータをインクリメンタルに読み込んで処理する代わりに、readall メソッドを使用してすべての信号データをメモリに読み込んで処理することができます。readall メソッドは、すべての信号データを含む timetable を返します。

speedTimetable = speedSDIds.readall;

speedMax = max(speedTimetable.Data)
speedMax = 0.8897
R2017b で導入