В проекте алгоритма прогнозирующего обслуживания вы часто работаете с большими наборами данных, собранных от операции вашей системы при переменных условиях. Объект fileEnsembleDatastore
помогает вам справиться и взаимодействовать с такими данными. В данном примере создайте объект fileEnsembleDatastore
, который указывает на данные ансамбля по диску. Сконфигурируйте его с функциями, которые считывают данные из и записывают данные ансамблю.
В данном примере у вас есть два файла данных, содержащие здоровые эксплуатационные данные от системы переноса, baseline_01.mat
и baseline_02.mat
. У вас также есть три файла данных, содержащие дефектные данные из той же системы, FaultData_01.mat
, FaultData_02.mat
и FaultData_03.mat
. На практике у вас может быть намного больше файлов данных.
Каждый из этих файлов данных содержит одну структуру данных, bearing
. Загрузите и исследуйте структуру данных от первого здорового набора данных. (Из-за объема данных операция unzip
занимает несколько минут.)
unzip fileEnsData.zip % extract compressed files load baseline_01.mat bearing
bearing = struct with fields:
sr: 97656
gs: [585936x1 double]
load: 270
rate: 25
Структура содержит вектор данных об акселерометре gs
, частота дискретизации sr
, в котором те данные были зарегистрированы, и другие переменные данных.
Чтобы работать с этими данными для прогнозирующего проекта алгоритма обслуживания, сначала создайте datastore ансамбля файла, который указывает на файлы данных в текущей папке.
fensemble = fileEnsembleDatastore(pwd,'.mat');
Прежде чем можно будет взаимодействовать с данными в ансамбле, необходимо создать функции, которые говорят программное обеспечение, как обработать файлы данных, чтобы считать переменные в рабочую область MATLAB® и записать данные назад к файлам. В данном примере используйте следующее, обеспеченное функции:
readBearingData
— Извлеките требуемые переменные из структуры, bearing
и других переменных, сохраненных в файле. Эта функция также анализирует имя файла для состояния отказа данных. Функция возвращает строку таблицы, содержащую одну табличную переменную для каждой требуемой переменной.
writeBearingData
— Возьмите структуру и запишите ее переменные в файл данных, когда человек сохранил переменные.
Присвойте эти функции свойствам ReadFcn
и WriteToMemberFcn
datastore ансамбля, соответственно.
addpath(fullfile(matlabroot,'examples','predmaint','main')) % Make sure functions are on path fensemble.ReadFcn = @readBearingData; fensemble.WriteToMemberFcn = @writeBearingData;
Наконец, установите свойства ансамбля идентифицировать переменные данных и условные переменные.
fensemble.DataVariables = ["gs";"sr";"load";"rate"]; fensemble.ConditionVariables = ["label";"file"];
Исследуйте ансамбль. Функции и имена переменных присвоены соответствующим свойствам.
fensemble
fensemble = fileEnsembleDatastore with properties: ReadFcn: @readBearingData WriteToMemberFcn: @writeBearingData DataVariables: [4x1 string] IndependentVariables: [0x0 string] ConditionVariables: [2x1 string] SelectedVariables: [0x0 string] ReadSize: 1 NumMembers: 5 LastMemberRead: [0x0 string] Files: [5x1 string]
Функции, которые вы присвоили, говорят read
и команды writeToLastMemberRead
, как взаимодействовать с файлами данных, которые составляют datastore ансамбля. Таким образом, когда вы вызываете команду read
, она использует readBearingData
, чтобы считать все переменные в fensemble.SelectedVariables
.
Задайте переменные, чтобы считать, и считать их от первого члена ансамбля. Команда read
считывает данные от первого члена ансамбля в строку таблицы в рабочем пространстве MATLAB. Программное обеспечение определяет который член ансамбля читать сначала.
fensemble.SelectedVariables = ["file";"label";"gs";"sr";"load";"rate"]; data = read(fensemble)
data=1×6 table
label file gs sr load rate
________ ______________ _________________ _____ ____ ____
"Faulty" "FaultData_01" [146484x1 double] 48828 0 25
Предположим, что вы хотите анализировать данные об акселерометре gs
путем вычисления его спектра мощности, и затем записать данные о спектре мощности обратно в ансамбль. Для этого первое извлечение данные из таблицы и вычисляет спектр.
gsdata = data.gs{1};
sr = data.sr;
[pdata,fpdata] = pspectrum(gsdata,sr);
pdata = 10*log10(pdata); % Convert to dB
Можно записать вектору частоты fpdata
и спектр мощности pdata
к файлу данных как отдельные переменные. Во-первых, добавьте новые переменные в список переменных данных в datastore ансамбля.
fensemble.DataVariables = [fensemble.DataVariables;"freq";"spectrum"]; fensemble.DataVariables
ans = 6x1 string array
"gs"
"sr"
"load"
"rate"
"freq"
"spectrum"
Затем, запишите новые значения в файл, соответствующий считанному в последний раз члену ансамбля. Когда вы вызываете writeToLastMemberRead
, он преобразовывает данные в структуру и вызывает fensemble.WriteToMemberFcn
, чтобы записать данные в файл.
writeToLastMemberRead(fensemble,'freq',fpdata,'spectrum',pdata);
Можно добавить новую переменную в fensemble.SelectedVariables
или другие свойства для идентификации переменных по мере необходимости.
Вызов read
снова считывает данные из следующего файла в datastore ансамбля и обновляет свойство fensemble.LastMemberRead
.
data = read(fensemble)
data=1×6 table
label file gs sr load rate
________ ______________ _________________ _____ ____ ____
"Faulty" "FaultData_02" [146484x1 double] 48828 50 25
Можно подтвердить, что эти данные от различного участника переменной load
в таблице. Здесь, его значение равняется 50, в то время как в ранее участнике чтения, это было 0.
Можно повторить, что обработка продвигается, чтобы вычислить и добавить спектр для этого члена ансамбля. На практике более полезно автоматизировать процесс чтения, обработки и записывания данные. Для этого сбросьте datastore ансамбля к состоянию, в котором не были считаны никакие данные. (Операция reset
не изменяет fensemble.DataVariables
, который содержит две новых переменные, которые вы уже добавили.) Затем цикл через ансамбль и выполняют чтение, процесс и шаги записи для каждого участника.
reset(fensemble) while hasdata(fensemble) data = read(fensemble); gsdata = data.gs{1}; sr = data.sr; [pdata,fpdata] = pspectrum(gsdata,sr); writeToLastMemberRead(fensemble,'freq',fpdata,'spectrum',pdata); end
Команда hasdata
возвращает false
, когда каждый член ансамбля был считан. Теперь, каждый файл данных в ансамбле включает переменные spectrum
и freq
, выведенные от данных об акселерометре в том файле. Можно использовать методы как этот цикл, чтобы извлечь и обработать данные из файлов ансамбля, когда вы разрабатываете алгоритм прогнозирующего обслуживания. Для примера, иллюстрирующего более подробно использование datastore ансамбля файла в процессе разработки алгоритмов, смотрите Диагностику отказа Подшипника качения. Тот пример также показывает использование Parallel Computing Toolbox™, чтобы ускорить обработку более многочисленного ансамбля.
Чтобы подтвердить, что выведенные переменные присутствуют в datastore ансамбля файла, считайте их от первых и вторых членов ансамбля. Для этого сбросьте ансамбль снова и добавьте новые переменные в выбранные переменные. На практике, после того, как вы вычислили полученные значения, это может быть полезно для только для чтения те значения, не перечитывая необработанные данные, которые могут занять значительное место в памяти. В данном примере считайте выбранные переменные, которые включают новые переменные, но не включают необработанные данные, gs
.
reset(fensemble) fensemble.SelectedVariables = ["label","load","freq","spectrum"]; data1 = read(fensemble)
data1=1×4 table
label load freq spectrum
________ ____ _______________ _______________
"Faulty" 0 [4096x1 double] [4096x1 double]
data2 = read(fensemble)
data2=1×4 table
label load freq spectrum
________ ____ _______________ _______________
"Faulty" 50 [4096x1 double] [4096x1 double]
rmpath(fullfile(matlabroot,'examples','predmaint','main')) % Reset path
fileEnsembleDatastore
| read
| writeToLastMemberRead