मैं डेटा एकत्र कर रहा हूं और वास्तविक समय में उस डेटा को साजिश कर रहा हूं। डेटा मोशन कैप्चर सिस्टम द्वारा उत्पादित किया जाता है। मेरे पास एक वर्ग DynamicDataset
है जो कि 2-कॉलम मैट्रिक्स के आसपास सिर्फ एक रैपर है (हालांकि यह उससे अधिक प्रचलित है) नए डेटा के लिए एक ईवेंट नोटिफ़ायर के साथ; एक और वर्ग DynamicPlotter
जो डेटा-जोड़े गए ईवेंट की सुनता है और साजिश को गतिशील रूप से अपडेट करता है। उचित कोड के टुकड़े:MATLAB - एक लाइन हैंडल 'XData और 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
MATLAB कोड प्रोफाइल के आधार पर, updatePlot()
में set
आदेश नहीं बल्कि महंगा है। मैं सोच रहा हूं कि क्या व्यक्तिगत अंक प्लॉट करने के लिए एक बेहतर तरीका है? आदर्श रूप में मैं एकल बिंदु को XData
और YData
में धक्का दूंगा और केवल उस बिंदु को खींचूंगा, लेकिन मुझे नहीं पता कि यह संभव है या नहीं।
कृपया ध्यान दें कि कई लाइनरीज़ ऑब्जेक्ट्स हो सकती हैं (यानी, एक ही प्लॉट पर एकाधिक ग्राफ); plot()
अक्ष के हैंडल को तर्क के रूप में लेता है, इसलिए यह पहले खींचे गए लाइन हैंडल के गुणों पर विचार नहीं करेगा (या ऐसा करने का कोई तरीका है?); मैंने बस plot(x,y);hold all;
करने के बारे में सोचा था, लेकिन यह मुझे हर बार अलग लाइन हैंडल देगा, प्रत्येक एक बिंदु से संबंधित होगा।
ऐसा हो सकता है कि आने वाले बिंदुओं को किसी भी तेजी से साजिश करने का कोई तरीका नहीं है, लेकिन मुझे लगा कि मैं पूछूंगा।
EDIT: वास्तविक कोड के साथ अपडेट किया गया ओपी, जो कि गलत व्याख्या के लिए एक सामान्य उदाहरण का उपयोग करने के बजाय मैं काम कर रहा हूं।
मैं नहीं जानता कि आप इस देखा है अगर लेकिन http://stackoverflow.com/questions/1693429/matlab-oop-is-it-slow-or-am- पर एक नज़र मैं कर रहा हूँ-कुछ गलत। मूल रूप से मैटलैब में कक्षाओं का उपयोग करने से आम तौर पर खराब प्रदर्शन – Marm0t
धन्यवाद होता है, मैंने इसे पहले देखा है। मेरे प्रोजेक्ट के कारणों के लिए कक्षाओं के उपयोग की आवश्यकता है, जिन कारणों में मैं नहीं जाऊंगा, इसलिए उसके आस-पास कोई रास्ता नहीं है .. लेकिन क्या 'सेट' कॉल धीमा हो जाएगा क्योंकि इसे किसी विधि के अंदर बुलाया जाता है? –
@ hardlyrude27: आपको एडलिस्टर लाइन को इस प्रकार सही करना चाहिए: 'addlistener (obj। (Props {i}),' DataAdded ', @ (src, ev) obj.updatePlot (i)); '। आप 'UpdatePlot' फ़ंक्शन – Amro