【发布时间】:2011-11-16 19:39:00
【问题描述】:
我正在收集数据并实时绘制数据。数据由动作捕捉系统产生。我有一个类DynamicDataset,它只是一个围绕 2 列矩阵的包装器(尽管它比那更细微),并添加了一个用于添加新数据的事件通知器;另一个类DynamicPlotter 监听数据添加事件并动态更新绘图。对应代码sn-ps:
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 Code Profile,updatePlot() 中的 set 命令相当昂贵。我想知道是否有更好的方法来绘制各个点?理想情况下,我会将单点推入 XData 和 YData 并仅绘制该点,但我不知道这是否可能。
请注意,可能有多个线序列对象(即,同一图上的多个图形); plot() 将轴句柄作为参数,因此它不会考虑先前绘制的线句柄的属性(或者有没有办法让它这样做?);我想只做plot(x,y);hold all;,但这每次都会给我单独的线句柄,每个句柄对应一个点。
可能没有办法更快地绘制传入点,但我想我会问。
编辑:使用我正在使用的实际代码更新 OP,而不是使用容易引起误解的通用示例。
【问题讨论】:
-
我不知道你是否看过这个,但看看stackoverflow.com/questions/1693429/…。基本上在matlab中使用类通常会导致性能不佳
-
谢谢,我以前见过。我的项目需要使用类,因为我不会进入,所以没有任何办法解决这个问题.. 但是
set调用会因为在方法内部调用而变慢吗? -
@strictlyrude27:您应该将 addlistener 行更正为:
addlistener(obj.(props{i}), 'DataAdded', @(src,ev) obj.updatePlot(i));。您可能还想在updatePlot函数的末尾添加drawnow -
@Amro - 哎呀,应该是
props,转录错误。添加@(src,ev)- 如果我不使用这些参数,它们真的需要在那里吗?最后,我之前确实有drawnow,但这并不影响设置XData和YData的绘制方式.. -
@strictlyrude27:还要注意收集的数据会随着时间的推移而变大。因此,如果您不必在每次追加后从头开始绘制整个事物,那么我发布的 previous solution 可以适应您的情况(OOP 风格),我在其中以滑动窗口方式显示数据,使用一个循环缓冲区...