Tôi đang thu thập dữ liệu và vẽ sơ đồ dữ liệu đó theo thời gian thực. Dữ liệu được tạo ra bởi một hệ thống chụp chuyển động. Tôi có một lớp DynamicDataset
chỉ là một trình bao bọc xung quanh ma trận 2 cột (mặc dù nó có nhiều sắc thái hơn) với một trình thông báo sự kiện cho dữ liệu mới được thêm vào; một lớp khác DynamicPlotter
lắng nghe sự kiện được thêm dữ liệu và cập nhật cốt truyện động. đoạn mã thích hợp:MATLAB - cách tốt nhất để tự động cập nhật một dòng xử lý 'XData và 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
Dựa trên hồ sơ MATLAB Mã, lệnh set
trong updatePlot()
là khá tốn kém. Tôi tự hỏi nếu có một cách tốt hơn để âm mưu các điểm cá nhân khi họ đến? Lý tưởng nhất là tôi sẽ đẩy điểm duy nhất vào XData
và YData
và vẽ điểm đó, nhưng tôi không biết nếu điều này là có thể.
Xin lưu ý rằng có thể có nhiều đối tượng dòng (ví dụ: nhiều đồ thị trên cùng một ô); plot()
mất một trục xử lý như một đối số, do đó, nó sẽ không xem xét các thuộc tính của xử lý dòng vẽ trước đó (hoặc là có một cách để làm cho nó làm như vậy?); Tôi nghĩ chỉ cần làm plot(x,y);hold all;
nhưng điều đó sẽ cho tôi xử lý dòng riêng biệt mỗi lần, mỗi lần tương ứng với một điểm duy nhất.
Nó có thể là không có cách nào để làm cho âm mưu điểm đến nhanh hơn, nhưng tôi figured tôi muốn hỏi.
EDIT: Đã cập nhật OP bằng mã thực tế mà tôi đang làm việc, thay vì sử dụng ví dụ chung để giải thích sai.
Tôi không biết nếu bạn đã nhìn thấy điều này, nhưng hãy nhìn vào http://stackoverflow.com/questions/1693429/matlab-oop-is-it-slow-or-am- tôi đang làm gì đó. Về cơ bản sử dụng các lớp học trong MATLAB thường kết quả trong hiệu suất kém – Marm0t
cảm ơn, tôi đã thấy rằng trước đây. Dự án của tôi yêu cầu sử dụng các lớp vì lý do tôi sẽ không đi vào, vì vậy không có cách nào xung quanh đó .. nhưng cuộc gọi 'set' sẽ chậm lại đơn giản chỉ vì nó được gọi bên trong một phương thức? –
@ strictrude27: bạn nên sửa dòng addlistener như: 'addlistener (obj. (Đạo cụ {i}), 'DataAdded', @ (src, ev) obj.updatePlot (i));'. Bạn cũng có thể muốn thêm 'drawow' vào cuối hàm' updatePlot' – Amro