Sto raccogliendo dati e tracciare tali dati in tempo reale. I dati sono prodotti da un sistema di motion capture. Ho una classe DynamicDataset
che è solo un wrapper attorno a una matrice a 2 colonne (sebbene sia più sfumata di quella) con un notificatore di eventi per i nuovi dati aggiunti; un'altra classe DynamicPlotter
che ascolta l'evento con aggiunta di dati e aggiorna la trama in modo dinamico. frammenti di codice appropriato:MATLAB: il modo migliore per aggiornare dinamicamente una linea gestisce XData e YData?
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
sulla base del profilo codice MATLAB, il comando set
in updatePlot()
è piuttosto costoso. Mi chiedo se c'è un modo migliore per tracciare i singoli punti man mano che arrivano? Idealmente, spingere il punto singolo in XData
e YData
e disegnare solo quel punto, ma non so se è possibile.
Si prega di notare che possono esserci più oggetti lineeries (cioè più grafici sullo stesso grafico); plot()
accetta un argomento come argomento, quindi non considererebbe le proprietà degli handle di linea precedentemente disegnati (o c'è un modo per farlo?); Ho pensato di fare solo plot(x,y);hold all;
ma questo mi avrebbe dato maniglie di linea separate ogni volta, ciascuna corrispondente ad un singolo punto.
Potrebbe essere che non c'è modo di tracciare i punti in arrivo più velocemente, ma ho pensato che avrei chiesto.
MODIFICA: OP aggiornato con il codice effettivo con cui sto lavorando, piuttosto che utilizzare un esempio generico valido per errori di interpretazione.
Non so se avete visto questo, ma dare un'occhiata a http://stackoverflow.com/questions/1693429/matlab-oop-is-it-slow-or-am- I-doing-something-wrong. Fondamentalmente usando le classi in MATLAB generalmente si ottiene una prestazione scadente – Marm0t
grazie, l'ho già visto prima. Il mio progetto richiede l'uso di classi per motivi per cui non entrerò, quindi non c'è modo di aggirare il problema ... ma la chiamata al 'set' sarebbe lenta semplicemente perché è chiamata all'interno di un metodo? –
@ strictrude27: è necessario correggere la riga addlistener come: 'addlistener (oggetto (props {i}), 'DataAdded', @ (src, ev) obj.updatePlot (i));'. Si potrebbe anche voler aggiungere 'drawnow' alla fine della funzione' updatePlot' – Amro