このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
MDF ファイルから有効性データを読み取る
この例では、前処理のために MDF ファイルから有効性データを読み取って使用する方法を示します。
妥当性情報の概要
ASAM MDF 規格によれば、「無効化ビット」は各レコードに少なくとも 1 バイトの追加バイトを必要とするオプションの機能であり、レコード内の信号値を「無効」としてマークするために使用されます。つまり、各チャネルの個々のサンプルには独自の無効化ビットがあります。
mdfRead
関数は、デフォルトで無効化ビットの逆である有効データを返します。つまり、ファイル内の無効化ビットが false としてマークされ、有効なサンプルを示している場合、mdfRead
は対応する有効サンプルに対して true 値を返します。
mdfRead
の ValidityRule
名前値引数は、有効性データの処理方法を制御します。
"
ignore
":有効性データを読み取りません。"
include
" (デフォルト):有効性データを読み取り、timetable のValidity
カスタム プロパティに保存します。"
replace
":有効性データを読み取り、すべての無効なサンプルを MATLAB ®missing
値に置き換えます。(注: 整数チャネルは double に変換されます。
名前値引数なしで有効性データを読み取る
MDF ファイルからすべてのデータを読み取るには、入力引数としてファイル名のみを指定して mdfRead
関数を使用します。デフォルトでは、有効性データが読み取られ、返される timetable のカスタム プロパティに保存されます。各 timetable は特定のチャネル グループのデータに対応し、そのチャネル グループの有効性データを表す関連する timetable が含まれています。次の mdfRead
呼び出しは ValidityRule='include'
を指定するのと同じです。
dataWithValidity = mdfRead("VehicleDataWithInvalidSamples.mf4")
Warning: mdfRead returned data that contains invalid samples in channel groups: 1, 2. Get validity data for a channel group from the timetable’s property Properties.CustomProperties.Validity.
dataWithValidity=2×1 cell array
{100×2 timetable}
{100×3 timetable}
chanGrp1Data = dataWithValidity{1}
chanGrp1Data=100×2 timetable
time Throttle EngineRPM
______ ________ _________
0 sec 50 0
1 sec 53.333 1
2 sec 56.667 2
3 sec 60 3
4 sec 63.333 4
5 sec 66.667 4
6 sec 70 6
7 sec 73.333 7
8 sec 76.667 8
9 sec 80 9
10 sec 80 9
11 sec 80 9
12 sec 80 9
13 sec 80 9
14 sec 80 9
15 sec 80 9
⋮
mdfRead
呼び出しでスローされた警告は、チャネル グループ 1 と 2 の両方で返されたデータに無効なサンプルが含まれていることを示します。チャネル グループ 1 の有効性データを取得するには、timetable の Validity
カスタム プロパティにアクセスします。データ timetable と有効期間 timetable が同じサイズであることに注意してください。有効期間テーブルの各論理値は、データ期間テーブル内の対応するサンプルの有効期間に対応します。
chanGrp1Validity = chanGrp1Data.Properties.CustomProperties.Validity
chanGrp1Validity=100×2 timetable
time Throttle EngineRPM
______ ________ _________
0 sec true true
1 sec true true
2 sec true true
3 sec true true
4 sec true true
5 sec true false
6 sec true true
7 sec true true
8 sec true true
9 sec true true
10 sec false false
11 sec false false
12 sec false false
13 sec false false
14 sec false false
15 sec false false
⋮
有効性データを使用して、データ timetable を手動で前処理できます。たとえば、有効性データを使用して、無効なサンプルを含むチャネル グループのすべての行を削除できます。
validSampleRowsMask = all(chanGrp1Validity{:,:} == 1,2); dataWithInvalidRowsRemoved = chanGrp1Data(validSampleRowsMask, :)
dataWithInvalidRowsRemoved=37×2 timetable
time Throttle EngineRPM
______ ________ _________
0 sec 50 0
1 sec 53.333 1
2 sec 56.667 2
3 sec 60 3
4 sec 63.333 4
6 sec 70 6
7 sec 73.333 7
8 sec 76.667 8
9 sec 80 9
31 sec 63.684 31
32 sec 59.474 32
33 sec 55.263 33
34 sec 51.053 34
35 sec 46.842 35
36 sec 42.632 36
37 sec 38.421 37
⋮
有効性データを無視
解析に有効性データが必要ない場合にメモリと処理時間を節約するには、引数 ValidityRule="ignore"
を使用します。
dataValidityIgnored = mdfRead("VehicleDataWithInvalidSamples.mf4", ValidityRule="ignore", GroupNumber=1)
dataValidityIgnored = 1×1 cell array
{100×2 timetable}
timetable には Validity
カスタム プロパティが含まれていないことに注意してください。
dataValidityIgnored{1}.Properties
ans = TimetableProperties with properties: Description: '' UserData: [] DimensionNames: {'time' 'Variables'} VariableNames: {'Throttle' 'EngineRPM'} VariableTypes: ["double" "double"] VariableDescriptions: {'Throttle' 'EngineRPM'} VariableUnits: {'*10^2' '*10^2'} VariableContinuity: [] RowTimes: [100×1 duration] StartTime: 0 sec SampleRate: 1 TimeStep: 1 sec Events: [0×8 eventtable] CustomProperties: No custom properties are set. Use addprop and rmprop to modify CustomProperties.
"replace"
で有効性データを読み取る
dataInvalidReplaced = mdfRead("VehicleDataWithInvalidSamples.mf4", ValidityRule="replace", GroupNumber=1)
dataInvalidReplaced = 1×1 cell array
{100×2 timetable}
すべての無効なサンプルは missing
値に置き換えられました。たとえば、「EngineRPM」チャネルには t = 5 秒の無効なサンプルが含まれているため、値は NaN になります。
dataInvalidReplaced{1}
ans=100×2 timetable
time Throttle EngineRPM
______ ________ _________
0 sec 50 0
1 sec 53.333 1
2 sec 56.667 2
3 sec 60 3
4 sec 63.333 4
5 sec 66.667 NaN
6 sec 70 6
7 sec 73.333 7
8 sec 76.667 8
9 sec 80 9
10 sec NaN NaN
11 sec NaN NaN
12 sec NaN NaN
13 sec NaN NaN
14 sec NaN NaN
15 sec NaN NaN
⋮
データの前処理
MATLAB は、fillmissing
のような timetable 内の欠落値を処理するためのさまざまな関数を提供します。塗りつぶし方法が 'linear'
に設定されたこの関数は、隣接する欠損していない値 (有効なサンプル) の線形補間を使用して、無効なサンプルに新しい値を設定します。
dataPreprocessed = fillmissing(dataInvalidReplaced{1}, 'linear')
dataPreprocessed=100×2 timetable
time Throttle EngineRPM
______ ________ _________
0 sec 50 0
1 sec 53.333 1
2 sec 56.667 2
3 sec 60 3
4 sec 63.333 4
5 sec 66.667 5
6 sec 70 6
7 sec 73.333 7
8 sec 76.667 8
9 sec 80 9
10 sec 82.149 10
11 sec 84.298 11
12 sec 86.447 12
13 sec 88.596 13
14 sec 90.746 14
15 sec 92.895 15
⋮
プロプロセッシング データの詳細については、データ前処理 を参照してください。
スロットルチャネルの視覚的な比較
ファイル内に存在する元のデータと、無効なサンプルの新しい値で線形補間されたデータの両方について、時間チャネルに対して "Throttle"
チャネルをプロットします。
subplot(2, 1, 1) plot(chanGrp1Data.time, chanGrp1Data.Throttle, "r") title("Throttle Signal as Represented in the File", "FontWeight", "bold") xlabel("Timestamp") ylabel("Throttle") subplot(2, 1, 2) plot(dataPreprocessed.time, dataPreprocessed.Throttle, "b") title("Throttle Signal with Invalid Samples Replaced with Linearly Interpolated Values", "FontWeight", "bold") xlabel("Timestamp") ylabel("Throttle")
まとめ
必要に応じて ValidityRule
オプションを使用します。
有効性データが解析に関係ない場合は、メモリと処理時間を節約するために「
ignore
」を使用します。無効なサンプルを手動で処理するには、「
include
」を使用します。fillmissing
やrmmissing
などの関数を使用して無効なサンプルを処理する場合は、便宜上「replace
」を使用します。