メインコンテンツ

readall

R2026b

データ ストアのすべてのデータの読み取り

説明

data = readall(dst) は、データストア dst 内のすべてのデータを返します。関数 readall は、データストアによって参照される信号がメモリに収まる場合のみ使用してください。

例

例

すべて折りたたむ

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

信号の sdidatastore の作成

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

mdl = "ThreeSigs";
out = sim(mdl);

モデルは、out という名前の単一の Simulink.SimulationOutput オブジェクトを使用してデータを記録するように構成されています。SimulationOutput オブジェクトには、yout という名前の Simulink.SimulationData.Dataset オブジェクト内に記録された出力データが含まれています。ドット表記を使用して、記録されたデータにアクセスします。

out.yout
ans = 
Simulink.SimulationData.Dataset 'yout' with 3 elements

                         Name      BlockPath      
                         ________  ______________ 
    1  [1x1 Signal]      sineSig   ThreeSigs/Out1
    2  [1x1 Signal]      randSig   ThreeSigs/Out2
    3  [1x1 Signal]      chirpSig  ThreeSigs/Out3

  - Use braces { } to access, modify, or add elements using index.

sineSig という名前の信号の信号 ID を取得します。

runCount = Simulink.sdi.getRunCount;
latestRunID = Simulink.sdi.getRunIDByIndex(runCount);
latestRun = Simulink.sdi.getRun(latestRunID);
sineSigID = getSignalIDsByName(latestRun,"sineSig");

信号 ID を使用して、sineSig 信号の sdidatastore オブジェクトを作成します。

sineSDIds = matlab.io.datastore.sdidatastore(sineSigID);

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

sdidatastore オブジェクトの Name プロパティをチェックして、想定のとおりの内容であることを確認します。

sineSDIds.Name
ans = 
'sineSig'

また、関数 preview を使用して、信号内の最初の 10 個のサンプルを確認することもできます。

preview(sineSDIds)
ans = 10×1 timetable
     Time        Data  
    _______    ________

    0 sec             0
    0.1 sec    0.099833
    0.2 sec     0.19867
    0.3 sec     0.29552
    0.4 sec     0.38942
    0.5 sec     0.47943
    0.6 sec     0.56464
    0.7 sec     0.64422
    0.8 sec     0.71736
    0.9 sec     0.78333

sdidatastore オブジェクトによる信号データの処理

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

latestMax = [];

while hasdata(sineSDIds)
    sineChunk = read(sineSDIds);
    sineChunkData = sineChunk.Data;
    latestMax = max([sineChunkData; latestMax]);
end

latestMax
latestMax = 
0.9996

各読み取り操作で、関数 read は、読み取り位置を次の読み取り操作の開始位置に更新します。sdidatastore オブジェクトの一部またはすべてを読み取った後、読み取り位置をリセットして、信号の先頭から再度開始できます。

reset(sineSDIds)

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

sdidatastore オブジェクトで参照された信号がメモリに収まる場合、readall 関数を使用してすべての信号データをメモリに読み取って処理できます。関数 readall は、すべての信号データを含む timetable を返します。

sineTimetable = readall(sineSDIds);
sineMax = max(sineTimetable.Data)
sineMax = 
0.9996

シミュレーションからのビッグ データをログに記録し、matlab.io.datastore.SimulationDatastore オブジェクトを操作してそのデータの一部を検査および解析できます。この例はデモ用であり、ビッグ データの記録は行いません。

モデルからのビッグ データのログ記録

モデル ThreeSigs を開きます。

mdl = "ThreeSigs";
open_system(mdl)

データを永続ストレージに記録するには、[コンフィギュレーション パラメーター]、[データのインポート/エクスポート]、[データのログを作成] を選択します。あるいは、ワークスペースの代わりに MAT ファイルにプログラムによって Dataset 形式のデータを記録できます。

set_param(mdl,"LoggingToFile","on")

シミュレーションの終了時間を 3000 秒に設定し、モデルをシミュレーションします。

set_param(mdl,StopTime="3000")
out = sim(mdl);

現在のフォルダーに MAT ファイル out.mat が表示されます。記録された出力データは、変数名 yout を使用して MAT ファイルに格納されます。

ログに記録された信号データを参照する DatasetRef オブジェクトを作成します。

DSRef = Simulink.SimulationData.DatasetRef("out.mat","yout");

ビッグ データのプレビュー

DatasetRef オブジェクト DSRef の最初の要素である sineSig 信号の SimulationDatastore 表現を返すには、中かっこを使用します。SimulationDatastore オブジェクトは、返される Signal オブジェクトの Values プロパティに存在します。

SimDataSig = DSRef{1};
DStore = SimDataSig.Values;

記録された sineSig データの最初の 10 個のサンプルを検査するには、preview を使用します。

preview(DStore)
ans = 10×1 timetable
     Time        Data  
    _______    ________

    0 sec             0
    0.1 sec    0.099833
    0.2 sec     0.19867
    0.3 sec     0.29552
    0.4 sec     0.38942
    0.5 sec     0.47943
    0.6 sec     0.56464
    0.7 sec     0.64422
    0.8 sec     0.71736
    0.9 sec     0.78333

特定のサンプルの検査

ログに記録された sineSig データの 603 番目のサンプルを検査するとします。DStore の ReadSize プロパティを、メモリ リソースを考慮して、コンピューターで許容できる数値に設定します。たとえば、ReadSize を 200 に設定します。

DStore.ReadSize = 200;

データ ストアから 3 回読み取りを実行します。各読み取り操作で、読み取り位置は 200 サンプル進みます。

read(DStore);
read(DStore);
read(DStore);

603 番目のサンプルに近くなったため、ReadSize を小さい数値に設定して、ターゲット サンプルを見つけやすくします。たとえば、ReadSize を 5 に設定します。

DStore.ReadSize = 5;

データ ストアからの読み込みを再度実行します。読み取られたデータの 3 番目のサンプルは、データ ストアの 603 番目のサンプルになります。

read(DStore)
ans = 5×1 timetable
      Time        Data  
    ________    ________

    60 sec      -0.30481
    60.1 sec    -0.39837
    60.2 sec    -0.48795
    60.3 sec    -0.57265
    60.4 sec    -0.65164

以前のサンプルの検査

以前のサンプルを検査するには、データストアをリセットして最初のサンプルからの読み取りを開始します。たとえば、ログに記録された sinSig データの 403 番目のサンプルを検査します。前の読み取り操作により、データストアは 606 番目のサンプルから読み取りを開始します。

DStore を最初から読み取るには、reset を使用します。次に、ReadSize を 200 に設定し、データストアから 2 回読み取って、読み取り位置を 401 番目のサンプルまで進めます。

reset(DStore);
DStore.ReadSize = 200;

read(DStore);
read(DStore);

ReadSize を 5 に設定してデータストアから読み取ります。ここで、読み取られたデータの 3 番目のサンプルが、データストアの 403 番目のサンプルになります。

DStore.ReadSize = 5;
read(DStore)
ans = 5×1 timetable
      Time       Data  
    ________    _______

    40 sec      0.74511
    40.1 sec    0.67481
    40.2 sec    0.59776
    40.3 sec    0.51474
    40.4 sec    0.42658

複数のサンプルの抽出

関数 read を使用して、複数のサンプルを抽出することもできます。たとえば、サンプル 1001 ~ 1020 を抽出します。

データ ストアをリセットします。次に、ReadSize プロパティを 200 に設定してデータストアを 5 回読み取り、サンプル 1001 に進みます。

reset(DStore)

DStore.ReadSize = 200;
for i = 1:5
    read(DStore);
end

ReadSize を 20 に設定して、データストアから 20 サンプルを抽出します。

DStore.ReadSize = 20;

サンプル 1001 ~ 1020 を抽出します。抽出したデータを targetSamples という名前の変数に格納します。

targetSamples = read(DStore)
targetSamples = 20×1 timetable
      Time         Data  
    _________    ________

    100 sec      -0.50637
    100.1 sec    -0.41775
    100.2 sec    -0.32496
    100.3 sec    -0.22892
    100.4 sec    -0.13059
    100.5 sec    -0.03096
    100.6 sec     0.06898
    100.7 sec     0.16823
    100.8 sec      0.2658
    100.9 sec     0.36072
    101 sec       0.45203
    101.1 sec     0.53882
    101.2 sec     0.62023
    101.3 sec     0.69544
    101.4 sec     0.76371
    101.5 sec     0.82434
      ⋮

データ ストア内のデータの最大値の検出

関数 hasdata を while ループの条件として使用し、200 サンプルのチャンク単位でデータをインクリメンタルに解析します。

reset(DStore);
DStore.ReadSize = 200;
runningMax = [];
while hasdata(DStore)
    tt = read(DStore);
    rawChunk = tt.Data;
    runningMax = max([rawChunk; runningMax]);
end

変数 runningMax にはデータストア全体における最大値が格納されます。

runningMax
runningMax = 
1.0000

入力引数

すべて折りたたむ

読み取るデータストア。matlab.io.datastore.sdidatastore オブジェクト、matlab.io.datastore.SimulationDatastore オブジェクト、または matlab.io.datastore.MLDATXSignalDatastore オブジェクトとして指定します。

出力引数

すべて折りたたむ

データストア内のすべてのデータ。timetable オブジェクトとして返されます。timetable オブジェクトの詳細については、timetableを参照してください。

代替方法

信号がメモリに収まる場合、Simulink.sdi.Signal オブジェクトや Simulink.SimulationData.Signal オブジェクトなど、他のオブジェクトや関数を使用して、シミュレーション データにアクセスし、処理することができます。

バージョン履歴

R2017b で導入