我有一个for循环,我想在每个步骤中绘制一个imagesc图中的新像素。我正在重新绘制整个数字,但这个数字是闪烁的,我知道这不是正确的方法。任何人都可以帮忙找到合适的功能来完成这项任务吗?
答案 0 :(得分:3)
您可以使用图像的CData
属性来处理每个像素中的数据,而无需一遍又一遍地关闭和重绘图形,轴或轴对象。最终比尝试生成新图像对象或只是反复调用imagesc()
快约1.5倍 - 2倍。
在这些循环中,不要忘记drawnow
调用,否则MATLAB将尝试跳过图形绘制,直到循环完成。
示例代码:
data = rand(200, 200); % Data to display
figure(1) % Make a figure
imgHand = imagesc(data); % Display data in it
% Naive way - call imagesc() each time.
% Slow. Don't do it this way.
for k = 1:numel(data);
data(k) = data(k) + 10*rand(1,1); % Update data
imagesc(data) % Redraw it by calling imagesc()
drawnow; % Display updated figure
end
% Faster way - address CData of image object directly
% 1.5-2x faster than above method
for k = 1:numel(data);
data(k) = data(k) + 10*rand(1,1); % Update data
set(imgHand, 'CData', data); % Change CData property of object
drawnow; % Display updated figure
end
答案 1 :(得分:1)
如果要绘制具有更新的每个框架,则无法选择在每次迭代时绘制所有内容。但是,您可以最小化闪烁(或者甚至可以删除它),方法是在下一次迭代之前在循环结束时放置pause
。这样,在绘制下一帧之前,它将为帧缓冲区提供完全绘制到屏幕的机会。
类似的东西:
for idx = 1 : total_frames
%// Do stuff
drawnow; %// Draw frame
pause(0.1); %// Pause
end
total_frames
将是您刷新绘图的总次数,并且在循环内部您将完成必要的工作,然后绘制图形,然后暂停0.1 ms。调整适合你的时间。