在不重新绘制 Matlab/Octave 中的所有内容的情况下更改 imagesc 图中像素的颜色
Change the color of a pixel in an imagesc plot without repainting everything in Matlab/Octave
我有一个 for 循环,我想在 imagesc 图中的每一步都绘制一个新像素。我目前正在重新绘制整个图形,但图形在闪烁,我知道这不是正确的方法。谁能帮忙找到合适的功能来完成这项任务?
如果您想绘制每个 有更新的帧,您别无选择,只能在每次迭代中绘制所有内容。但是,您可以 最小化 闪烁(或者甚至可能删除它),方法是在下一次迭代之前在循环末尾放置一个 pause
。这样,在您绘制下一帧之前,它会让帧缓冲区有机会完全绘制到屏幕上。
类似于:
for idx = 1 : total_frames
%// Do stuff
drawnow; %// Draw frame
pause(0.1); %// Pause
end
total_frames
将是您刷新绘图的总次数,在循环内您将执行必要的工作,然后绘制图形,然后暂停 0.1 毫秒。将时间调整为适合您的时间。
您可以使用图像的 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
我有一个 for 循环,我想在 imagesc 图中的每一步都绘制一个新像素。我目前正在重新绘制整个图形,但图形在闪烁,我知道这不是正确的方法。谁能帮忙找到合适的功能来完成这项任务?
如果您想绘制每个 有更新的帧,您别无选择,只能在每次迭代中绘制所有内容。但是,您可以 最小化 闪烁(或者甚至可能删除它),方法是在下一次迭代之前在循环末尾放置一个 pause
。这样,在您绘制下一帧之前,它会让帧缓冲区有机会完全绘制到屏幕上。
类似于:
for idx = 1 : total_frames
%// Do stuff
drawnow; %// Draw frame
pause(0.1); %// Pause
end
total_frames
将是您刷新绘图的总次数,在循环内您将执行必要的工作,然后绘制图形,然后暂停 0.1 毫秒。将时间调整为适合您的时间。
您可以使用图像的 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