MATLAB - лучший способ динамически обновлять линейные дескрипторы «XData и YData»?

Я собираю данные и рисую их в режиме реального времени. Данные создаются системой захвата движения. У меня есть один класс DynamicDataset , который представляет собой просто оболочку вокруг двухколоночной матрицы (хотя он более детализирован) с добавленным уведомителем событий для новых данных; другой класс DynamicPlotter , который прослушивает событие с добавлением данных и динамически обновляет график. Соответствующие фрагменты кода:

classdef DynamicDataset < handle
    properties
        newestData = [];
        data = []
    end
    events
        DataAdded
    end
    methods
        function append(obj, val)
            obj.data(end+1,:) = val;
            obj.newestData = val;
            notify(obj, 'DataAdded');
        end
    end
end

classdef DynamicPlotter < dynamicprops
    properties
        FH %# figure handle
        AH %# axes handle
        LH %# array of line handles - may have multiple lines on the plot

        dynProps = {} %# cell array of dynamic property names - 
                      %# use to access individual datasets
    end
    methods
        function obj = DynamicPlotter(props) %# props is a cell array of dynamic 
                                             %# properties to store information
            for i = 1:length(props) 
                addprop(obj, props{i});
                obj.(props{i}) = DynamicDataset;
                obj.dynProps = [obj.dynProps props{i}];

                addlistener(obj.(props{i}), 'DataAdded', @obj.updatePlot(i));
            end
            obj.createBlankPlot();
        end

        function createBlankPlot(obj)
            obj.FH = figure;
            obj.AH = axes;

            hold all;

            for i = 1:length(obj.dynProps)
                obj.LH(i) = plot(nan); %# only used to produce a line handle
                    set(obj.LH(i), 'XData', [], 'YData', []);
            end
        end

        function updatePlot(obj, propNum)
            X = get(obj.LH(propNum), 'XData');
            Y = get(obj.LH(propNum), 'YData');

            X(end+1) = obj.(dynProps{propNum}).newestData(1);
            Y(end+1) = obj.(dynProps{propNum}).newestData(2);

            set(obj.LH(propNum), 'XData', X, 'YData', Y);
        end
    end
end

На основе профиля кода MATLAB, команда set в updatePlot () довольно дорога. Если есть лучший способ построить отдельные точки по мере их поступления? В идеале я бы вставил одну точку в XData и YData и нарисовал бы только эту точку, но я не знаю, это возможно.

Обратите внимание, что может быть несколько объектов линейной серии (т. е. несколько графов на одном участок); plot () принимает дескриптор оси в качестве аргумента, поэтому он не будет учитывать свойства ранее нарисованных маркеров линии (или есть способ сделать это?); Я подумал о том, чтобы просто сделать plot (x, y); hold all; , но это дало бы мне каждый раз отдельные дескрипторы строк, каждый из которых соответствует одной точке.

Возможно, нет способа ускорить построение входящих точек, но я решил, что спрошу.

РЕДАКТИРОВАТЬ : обновлен OP фактическим кодом, с которым я работаю, вместо использования общего примера, который может быть неправильно истолкован.

6
задан Dang Khoa 17 September 2011 в 22:33
поделиться