Main Content

writeToLastMemberRead

アンサンブル データストアのメンバーにデータを書き込み

説明

writeToLastMemberRead(ensemble,Name,Value) は、1 つ以上の Name,Value のペアの引数で指定されたデータをアンサンブル データストアの最後に読み取られたメンバーに書き込みます。最後に読み取られたメンバーは、read コマンドを使用して最後にアクセスしたメンバーです。(状態監視と予知保全のためのデータ アンサンブルを参照)。Name はそれぞれ ensemble.DataVariables プロパティのエントリと一致していなければなりません。関数は対応する Value をアンサンブル データストアに書き込みます。

  • ensemblesimulationEnsembleDatastore オブジェクトの場合、writeToLastMemberRead は、最後に読み取られたアンサンブル メンバー (ensemble.LastMemberRead) に対応する MAT ファイルにデータを書き込みます。

  • ensemblefileEnsembleDatastore オブジェクトの場合、writeToLastMemberRead は、ensemble.WriteToMemberFcn プロパティで識別される関数を使用してデータを書き込みます。そのプロパティが定義されていない場合、writeToLastMemberRead はエラーを生成します。

この構文は、ensembleReadSize プロパティが 1 より大きい場合は使用できません。代わりに writeToLastMemberRead(ensemble,data) を使用してください。

writeToLastMemberRead(ensemble,data) は、table のデータを最後に読み取られたアンサンブル メンバーに書き込みます。table の変数は ensemble.DataVariables プロパティのエントリと一致していなければなりません。

すべて折りたたむ

アンサンブル データストアのデータを処理し、派生した変数をアンサンブル メンバーに追加できます。この例では、変数の値を処理して、アンサンブル メンバーに故障ありで取得されたデータが含まれているかどうかを示すラベルを計算します。その後、そのラベルをアンサンブルに追加します。

この例では、次のコードを使用して、前に Simulink® モデルをさまざまな故障値で実行して生成されたデータを使って simulationEnsembleDatastore オブジェクトを作成します。(generateSimulationEnsembleを参照。)アンサンブルには、モデル パラメーター ToothFaultGain の 5 つの異なる値についてのシミュレーション データが含まれます。モデルは、この例のために simEnsData.zip に格納されている MAT ファイルの logsout という名前の変数にシミュレーション データを記録するように構成されています。データのボリュームにより、unzip 操作に 1 ~ 2 分かかることがあります。

unzip simEnsData.zip  % extract compressed files
ensemble = simulationEnsembleDatastore(pwd,'logsout')
ensemble = 
  simulationEnsembleDatastore with properties:

           DataVariables: [5x1 string]
    IndependentVariables: [0x0 string]
      ConditionVariables: [0x0 string]
       SelectedVariables: [5x1 string]
                ReadSize: 1
              NumMembers: 5
          LastMemberRead: [0x0 string]
                   Files: [5x1 string]

アンサンブルの最初のメンバーからデータを読み取ります。最初のメンバーであるアンサンブルがソフトウェアで判定され、対応するファイルの名前を反映するように ensemble.LastMemberRead プロパティが更新されます。

data = read(ensemble)
data=1×5 table
    PMSignalLogName           SimulationInput                   SimulationMetadata                   Tacho                Vibration     
    _______________    ______________________________    _________________________________    ___________________    ___________________

      {'logsout'}      {1x1 Simulink.SimulationInput}    {1x1 Simulink.SimulationMetadata}    {20202x1 timetable}    {20202x1 timetable}

既定では、アンサンブル データに格納されているすべての変数が SelectedVariables として指定されます。そのため、返される table の行には、すべてのアンサンブル変数が含まれます。これには、このアンサンブル メンバーのシミュレーションについて構成した Simulink.SimulationInput オブジェクトを格納する変数 SimulationInput も含まれます。そのオブジェクトの Variables プロパティに、アンサンブル メンバーに使用される ToothFaultGain の値がデータ構造体として格納されています。その値を調べます。(シミュレーションの構成の格納方法の詳細については、Simulink.SimulationInput (Simulink)を参照してください。)

data.SimulationInput{1}
ans = 
  SimulationInput with properties:

          ModelName: 'TransmissionCasingSimplified'
       InitialState: [0x0 Simulink.op.ModelOperatingPoint]
      ExternalInput: []
    ModelParameters: [0x0 Simulink.Simulation.ModelParameter]
    BlockParameters: [0x0 Simulink.Simulation.BlockParameter]
          Variables: [1x1 Simulink.Simulation.Variable]
          PreSimFcn: []
         PostSimFcn: []
         UserString: ''

Inputvars = data.SimulationInput{1}.Variables;
Inputvars.Name
ans = 
'ToothFaultGain'
Inputvars.Value
ans = -2

各アンサンブル メンバー内の ToothFaultGain 値を、ギア故障の有無を示すバイナリ インジケーターに変換すると仮定します。さらに、システムの使用経験から、ギア歯故障のゲイン値の大きさが 0.1 より小さい場合は健全動作と見なすのに十分であることがわかっているとします。このアンサンブルのゲイン値を、–0.1 < ゲイン < 0.1 の場合は 0 (故障なし)、そうでない場合は 1 (故障あり) のインジケーターに変換します。

sT = abs(Inputvars.Value) < 0.1;

新しい歯の故障インジケーターを対応するアンサンブル データに追加するには、まずアンサンブルのデータ変数のリストを拡張して、インジケーターの変数を含めます。

ensemble.DataVariables = [ensemble.DataVariables; "ToothFault"];
ensemble.DataVariables
ans = 6x1 string
    "PMSignalLogName"
    "SimulationInput"
    "SimulationMetadata"
    "Tacho"
    "Vibration"
    "ToothFault"

この操作は、概念的にはアンサンブル データの table に列を追加することと同じです。新しい変数の名前が DataVariables に格納されたので、メンバーのその列に writeToLastMemberRead を使用して派生値を代入します。

writeToLastMemberRead(ensemble,'ToothFault',sT);

実際には、歯の故障インジケーターをアンサンブルのすべてのメンバーに追加することが望まれます。そのためには、アンサンブル データストアを未読の状態にリセットして、次回の読み取り操作が最初のアンサンブル メンバーから開始されるようにします。その後、すべてのアンサンブル メンバーをループ処理して各メンバーの ToothFault を計算し、これを追加します。reset 操作では ensemble.DataVariables は変更されないため、"ToothFault" はそのリストに存在したままになります。

reset(ensemble);

sT = false; 
while hasdata(ensemble)
    data = read(ensemble);
    InputVars = data.SimulationInput{1}.Variables;
    TFGain = InputVars.Value;
    sT = abs(TFGain) < 0.1;
    writeToLastMemberRead(ensemble,'ToothFault',sT);
end

最後に、新しい歯の故障インジケーターをアンサンブル データストア内に状態変数として指定します。この指定を使用して、メンバー データが生成された状態を表す変数をアンサンブル データ内で追跡および参照することができます。

ensemble.ConditionVariables = {"ToothFault"};
ensemble.ConditionVariables
ans = 
"ToothFault"

新しい変数をさらなる解析のために読み取る場合は ensemble.SelectedVariables に追加できます。simulationEnsembleDatastore オブジェクトに格納されているデータを操作し解析するための他の方法を示す例については、Simulink を使用した故障データの生成を参照してください。

MATLAB ファイルに保存されたデータ用にファイル アンサンブル データストアを作成し、データストアからの読み取りとデータストアへの書き込み方法をソフトウェアに指示する関数で構成します。(ファイル アンサンブル データストアの構成の詳細については、測定データを含むファイル アンサンブル データストアを参照してください。)

% Create ensemble datastore that points to datafiles in current folder
unzip fileEnsData.zip  % extract compressed files
location = pwd;
extension = '.mat';
fensemble = fileEnsembleDatastore(location,extension);

% Specify data and condition variables
fensemble.DataVariables = ["gs";"sr";"load";"rate"];
fensemble.ConditionVariables = "label";

% Configure with functions for reading and writing variable data
fensemble.ReadFcn = @readBearingData;
fensemble.WriteToMemberFcn = @writeBearingData; 

関数は、アンサンブルを構成するデータ ファイルの操作方法を read コマンドと writeToLastMemberRead コマンドに指示します。したがって、read コマンドを呼び出すと、コマンドは readBearingData を使用して fensemble.SelectedVariables 内のすべての変数を読み取ります。この例では、readBearingData が、要求された変数を構造体 bearing から抽出し、ファイルに保存されている他の変数を抽出します。また、データの故障状態についてファイル名の解析も行います。

読み取る変数を指定して、アンサンブルの最初のメンバーからそれらを読み取ります。

fensemble.SelectedVariables = ["gs";"load";"label"];
data = read(fensemble)
data=1×3 table
     label            gs           load
    ________    _______________    ____

    "Faulty"    {5000x1 double}     0  

これで、メンバーからのデータを必要に応じて処理できます。この例では、変数 gs に保存されている信号の平均値を計算します。read によって返された table からデータを抽出します。

gsdata = data.gs{1};
gsmean = mean(gsdata);

平均値 gsmean は、新しい変数としてデータ ファイルに書き戻すことができます。これを行うには、まずアンサンブルのデータ変数のリストを拡張して、新しい値の変数を含めます。新しい変数 gsMean を呼び出します。

fensemble.DataVariables = [fensemble.DataVariables;"gsMean"]
fensemble = 
  fileEnsembleDatastore with properties:

                 ReadFcn: @readBearingData
        WriteToMemberFcn: @writeBearingData
           DataVariables: [5x1 string]
    IndependentVariables: [0x0 string]
      ConditionVariables: "label"
       SelectedVariables: [3x1 string]
                ReadSize: 1
              NumMembers: 5
          LastMemberRead: "/tmp/Bdoc23b_2395265_1676057/tp56ad5ed4/predmaint-ex34165887/FaultData_01.mat"
                   Files: [5x1 string]

次に、派生した平均値を、最後に読み取られたアンサンブル メンバーに対応するファイルに書き込みます。(状態監視と予知保全のためのデータ アンサンブルを参照してください。)writeToLastMemberRead を呼び出すと、これはデータを構造体に変換し、fensemble.WriteToMemberFcn を呼び出してデータをファイルに書き込みます。

writeToLastMemberRead(fensemble,'gsMean',gsmean);

read を再度呼び出すと、最後に読み取られたメンバーのインジケーターがアンサンブルの次のファイルに進み、そのファイルからデータが読み取られます。

data = read(fensemble)
data=1×3 table
     label            gs           load
    ________    _______________    ____

    "Faulty"    {5000x1 double}     50 

これが別のメンバーからのデータであることは、table 内の load 変数を調べることによって確認できます。ここでの値は 50 ですが、前に読み取られたメンバーでは 0 でした。

処理手順を繰り返してこのアンサンブル メンバーの平均を計算し追加することは可能です。実際には、データの読み取り、処理、および書き込みのプロセスを自動化するとさらに便利です。これを行うには、アンサンブルをデータが読み取られていない状態にリセットします。その後、アンサンブルをループ処理して、各メンバーの読み取り、処理、および書き込みの手順を実行します。

reset(fensemble)
while hasdata(fensemble)
    data = read(fensemble);
    gsdata = data.gs{1};
    gsmean = mean(gsdata);
    writeToLastMemberRead(fensemble,'gsMean',gsmean);
end

アンサンブルのすべてのメンバーが読み取られると、hasdata コマンドは false を返します。ここで、アンサンブル内の各データ ファイルには、そのファイルのデータ gs から求められた変数 gsMean が含まれています。予知保全アルゴリズムを開発する際、このループのような手法を使ってアンサンブル ファイルからデータを抽出し処理することができます。アルゴリズム開発のプロセスにおけるファイル アンサンブル データストアの使用をさらに詳しく説明する例は、転動体ベアリングの故障診断を参照してください。また、この例には Parallel Computing Toolbox™ を使って大規模なデータ アンサンブルの処理を高速化する方法も示されています。

派生した変数がファイル アンサンブル データストアに存在することを確認するには、最初と 2 番目のアンサンブル メンバーからこれらを読み取ります。そのためには、アンサンブルを再びリセットし、選択した変数に新しい変数を追加します。実際には、派生値を計算した後はその値のみを読み取り、かなりのメモリ空間をとる可能性のある未処理データは読み取らないようにするのが有益です。この例では、新しい変数 gsMean を含み、未処理のデータ gs は含まない、選択した変数を読み取ります。

reset(fensemble)
fensemble.SelectedVariables = ["label";"load";"gsMean"];
data1 = read(fensemble)
data1=1×3 table
     label      load     gsMean 
    ________    ____    ________

    "Faulty"     0      -0.22648

data2 = read(fensemble)
data2=1×3 table
     label      load     gsMean 
    ________    ____    ________

    "Faulty"     50     -0.22937

入力引数

すべて折りたたむ

データ変数を追加するアンサンブル データストア。以下として指定します。

writeToLastMemberRead は、指定されたアンサンブルの最後に読み取られたメンバーにデータを書き込みます。これは、アンサンブルの LastMemberRead プロパティで識別されます。最後に読み取られたアンサンブル メンバーは、read コマンドを使用して最後にアクセスしたメンバーです。(状態監視と予知保全のためのデータ アンサンブルを参照)。

現在のアンサンブル メンバーに書き込む新しいデータ。table として指定します。たとえば、計算した 2 つの値を現在のメンバーに追加するとします。MATLAB® ワークスペース変数 Afilt として格納されたベクトルと Amean として格納されたスカラーです。data を構成するには次のコマンドを使用します。

data = table(Afilt,Amean,'VariableNames',{'Afilt','Amean'});

table の行数は ensembleReadSize プロパティと一致していなければなりません。既定では ReadSize = 1 であり、1 行の table を 1 つのアンサンブル メンバーに書き込みます。複数のメンバーを一度に読み取るように ensemble を構成している場合は、同じ数のメンバーに書き込む必要があります。たとえば、ReadSize = 3 の場合、data は 3 行の table になります。

制限

  • Amazon S3™ (Simple Storage Service)、Windows Azure® Blob Storage、Hadoop® 分散ファイル システム (HDFS™) を使用するクラウド ストレージなど、リモートの場所にあるデータを simulationEnsembleDatastore を使用して管理している場合、アンサンブル データストアに writeToLastMemberRead を使用してデータを追加することはできません。

バージョン履歴

R2018a で導入