Можно ли выполнять программирование без сохранения состояния в Matlab / Как избежать проверки целостности данных?

Мой рабочий день выглядит примерно так:

  • получить необработанные данные (~50 ГБ)
  • анализировать временные данные необработанных данных и строить структуру исходных данных (структуру / объект) из временных данных (какое событие произошло, когда, в каком порядке, в каком файле, какие другие события произошли одновременно и т. д.)
  • загружать только необходимые части необработанных данных в структуру / объект, выбранные из предыдущей информации о времени (в основном это способ подбора данных)
  • для каждого блока необработанных данных рассчитайте / извлеките определенные метрики, такие как СКО сигнала, события, где данные> порог, d' / z-оценка, и сохраните их со структурой / объектом
  • с учетом ранее рассчитанных показателей загрузите некоторые необработанные данные эпизодов одного и того же времени из другого канала данных и сравните определенные данные и т. д.
  • визуализировать результаты x, y, z

У меня есть два способа справиться с такого рода данными / рабочим процессом:

  1. используйте struct()
  2. использовать объекты

Есть определенные преимущества / недостатки в обоих случаях:

  1. структура:

    • можете добавлять свойства / поля на лету
    • нужно проверять состояние структуры каждый раз, когда я передаю структуру функции
    • продолжайте переписывать определенные функции, потому что каждый раз, когда я слегка изменяю структуру, я а) склоняюсь к тому, что забываю, что функция для нее уже существует, или б) я пишу новую версию, которая обрабатывает особый случай состояния структуры.
  2. объекты:

    • используя методы 'get.property()', я могу проверить состояние свойства до того, как оно будет доступно внутри функции / метода -> позволяет выполнять проверки целостности данных.
    • Я всегда знаю, какие методы работают с моим объектом, так как они являются частью определения объекта.
    • нужно clear classes каждый раз, когда я добавляю новое свойство или метод - очень раздражает!

Теперь мой вопрос: как другие люди справляются с такой ситуацией? как вы организуете свои данные? в структурах? в объектах? как вы обрабатываете государственные проверки? Есть ли способ сделать программирование без сохранения состояния в Matlab?

1 ответ

Решение

Мне нравится использовать объекты. Вам не нужно вызывать чистые классы при каждом изменении. Достаточно удалить все экземпляры "старого" объекта.

Два очень мощных дополнения, которые я часто наследую, это handle и dynamicprops.

  1. Ручка заставляет объект вести себя как ручка. Очень приятно, что Matlabs копирует при изменении.
  2. Динамический реквизит - заняться метапрограммированием.

О проверках согласованности - почему нет делать их, когда вы используете 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
Другие вопросы по тегам