Можно ли выполнять программирование без сохранения состояния в Matlab / Как избежать проверки целостности данных?
Мой рабочий день выглядит примерно так:
- получить необработанные данные (~50 ГБ)
- анализировать временные данные необработанных данных и строить структуру исходных данных (структуру / объект) из временных данных (какое событие произошло, когда, в каком порядке, в каком файле, какие другие события произошли одновременно и т. д.)
- загружать только необходимые части необработанных данных в структуру / объект, выбранные из предыдущей информации о времени (в основном это способ подбора данных)
- для каждого блока необработанных данных рассчитайте / извлеките определенные метрики, такие как СКО сигнала, события, где данные> порог, d' / z-оценка, и сохраните их со структурой / объектом
- с учетом ранее рассчитанных показателей загрузите некоторые необработанные данные эпизодов одного и того же времени из другого канала данных и сравните определенные данные и т. д.
- визуализировать результаты x, y, z
У меня есть два способа справиться с такого рода данными / рабочим процессом:
- используйте struct()
- использовать объекты
Есть определенные преимущества / недостатки в обоих случаях:
структура:
- можете добавлять свойства / поля на лету
- нужно проверять состояние структуры каждый раз, когда я передаю структуру функции
- продолжайте переписывать определенные функции, потому что каждый раз, когда я слегка изменяю структуру, я а) склоняюсь к тому, что забываю, что функция для нее уже существует, или б) я пишу новую версию, которая обрабатывает особый случай состояния структуры.
объекты:
- используя методы 'get.property()', я могу проверить состояние свойства до того, как оно будет доступно внутри функции / метода -> позволяет выполнять проверки целостности данных.
- Я всегда знаю, какие методы работают с моим объектом, так как они являются частью определения объекта.
- нужно
clear classes
каждый раз, когда я добавляю новое свойство или метод - очень раздражает!
Теперь мой вопрос: как другие люди справляются с такой ситуацией? как вы организуете свои данные? в структурах? в объектах? как вы обрабатываете государственные проверки? Есть ли способ сделать программирование без сохранения состояния в Matlab?
1 ответ
Мне нравится использовать объекты. Вам не нужно вызывать чистые классы при каждом изменении. Достаточно удалить все экземпляры "старого" объекта.
Два очень мощных дополнения, которые я часто наследую, это handle и dynamicprops.
- Ручка заставляет объект вести себя как ручка. Очень приятно, что Matlabs копирует при изменении.
- Динамический реквизит - заняться метапрограммированием.
О проверках согласованности - почему нет делать их, когда вы используете set.property?
Изменить 1:
упрощенный класс, который использует базу данных:
classdef measurement
class
id
properties (SetAccess = private)
end
methods
function obj = measurement(varargin)
obj.id = varargin{1};
end
function cs = get.class(obj)
if isempty(obj.id)
cs = '';
return
end
mc = mydb.local; % use some tricks here to keep the connection open
tmp = mym(mc,...
'SELECT class FROM measurements WHERE id = {Si}'...
,obj.id);
cs = tmp{1};
end
end
Редактировать 2: пример для события - наблюдатель
classdef ObservableClass < handle
properties
ListObservers=[]
data
end
methods
function obj = ObservableClass(varargin)
obj.data = rand(100,2);
end
function addObserver(obj,observer)
obj.ListObservers = [obj.ListObservers,observer];
end
function fireUpdate(obj)
for i=1:numel(obj.ListObservers)
obj.ListObservers(i).update();
end
end
function set.data(obj,newData)
obj.data = newData;
obj.fireUpdate;
end
end
end
и слушатель:
classdef ObservingPlot
properties
fig
observedClass
end
methods
function obj = ObservingPlot(varargin)
obj.observedClass = varargin{1};
obj.createPlot;
obj.observedClass.addObserver(obj);
end
function createPlot(obj)
obj.fig=figure;
plot(obj.observedClass.data);
end
function update(obj)
gcf(obj.fig)
clf
plot(obj.observedClass.data);
end
end
end
Пример:
a = ObservableClass()
b = ObservingPlot(a)
Затем вы можете наблюдать, когда вы делаете: a.data=rand(100,3)
- сюжет изменится сразу.
Редактировать 3: простой класс сохранения
classdef SavingClass < handle
properties
saveName
data
end
methods
function set.data(obj,input)
if isempty(obj.saveName)
obj.saveName = [tempname '.mat'];
end
save(obj.saveName,'input')
end
function out = get.data(obj)
out = [];
if exist(obj.saveName,'file')
tmp = load(obj.saveName);
out = tmp.input;
end
end
end
end
Пример:
a = SavingClass;
b=rand(1000,1000);
a.data = b;
посмотрите на "чьи":
Name Size Bytes Class Attributes
a 1x1 60 SavingClass
ans 1x5 10 char
b 1000x1000 8000000 double
хотя вы можете делать вычисления, как d = a.data-b
- a
занимает всего 60 байтов в памяти - в отличие от ~8 МБ b
,
Редактировать 4: трюк для часто меняющихся функций. Когда вы помещаете логику во внешние команды, Matlab не будет жаловаться, когда вы меняете определение функции там.
classdef MyOftenEditedClass < handle
properties
a
end
methods
function set.a(obj,val)
mySetFunctionA(obj,val)
end
function out=get.a(obj)
out = myGetFunctionA(obj);
end
end
end