我需要做以下事情:
我的工作是
function getPixels(state)
fig = figure('visible','off')
hold all
plot_environment() % calls patch and other stuff
plot(state(1),state(2),'r+')
f = getframe();
data = f.cdata;
close(fig)
问题是它非常慢(0.6s
对我来说实在是太多了)。
我尝试使用persistent fig
,我可以下到0.4s
,但仍然太多。
我读过关于使用print
或hardcopy
的内容,但它没有帮助。即使按-r20
(默认大小为1/5
)减少像素数也不会加快速度。
有什么建议吗?是否有更快的方法来获取像素?
编辑:其他详细信息
state
仅为2分。
环境由用于绘制形状的一些固定已知变量定义。更具体地说,我有一些观点
points = [c11 c12
c21 c22
.....]
用于修补矩形,圆形和三角形。为此,我使用patch
和circles
。
所以最后我想将所有内容绘制在一起,得到结果像素。有没有办法在没有getframe
或加快速度的情况下做到这一点?
完整示例
需要circles
。
启动tic, getPixels([0.1, 0.2]'); toc
平均需要0.43s
。仅getframe
命令需要0.29s
。
function data = getPixels(state)
fig = figure('visible','off');
hold all
c1 = [0.1 0.75;
0.45 0.75];
c2 = [0.45 0.4;
0.45 0.8];
radius = 0.1;
grey = [0.4,0.4,0.4];
% Circles
p = [c1; c2];
circles(p(:,1), p(:,2), radius, 'color', grey, 'edgecolor', grey)
% Rectangles
patch([0.1 0.45 0.45 0.1], [0.65 0.65 0.85 0.85], grey, 'EdgeAlpha', 0)
patch([0.35 0.55 0.55 0.35], [0.4 0.4 0.8 0.8], grey, 'EdgeAlpha', 0)
% Triangle
x = [0.95, 1.0, 1.0];
y = [1.0, 0.95, 1.0];
fill(x, y, 'r')
axis([0 1 0 1])
box on
axis square
% Point
plot(state(1),state(2),'ro','MarkerSize',8,'MarkerFaceColor','r');
f = getframe();
data = f.cdata;
close(fig)
答案 0 :(得分:2)
您可以将Matlab的getframe()
函数的执行时间缩短十倍。每次调用getPixels()
函数但使用现有函数时,诀窍包括不创建数字。您可以通过函数参数传递图形句柄。并使用Matlab的函数clf
清除两次调用之间的当前数字窗口。
修改
以下是我与figure
et getframe
一起玩的方式示例。
以下表现图
由
提供%%
clear al
close all
clc
nbSim = 10 %number of getframe calls
tElapsed = zeros(nbSim, 2); %two types of getting frames
%% METHOD 1: figure within loop
for ind_sim = 1:nbSim
fig = figure;
%some graphical elements
hold all
patch(rand(1,4), rand(1,4), rand(1,3), 'EdgeAlpha', 0)
patch(rand(1,4), rand(1,4), rand(1,3), 'EdgeAlpha', 0)
fill(rand(1,3), rand(1,3), 'r')
plot(rand,rand,'ro','MarkerSize',8,'MarkerFaceColor','k');
%some axes properties
axis([0 1 0 1])
box on
axis square
tStart = tic;
f = getframe();
tElapsed(ind_sim,1) = toc(tStart);
data = f.cdata;
close(fig)
end
%% METHOD 2: figure outside loop
fig = figure;
for ind_sim = 1:nbSim
%some graphical elements
hold all
patch(rand(1,4), rand(1,4), rand(1,3), 'EdgeAlpha', 0)
patch(rand(1,4), rand(1,4), rand(1,3), 'EdgeAlpha', 0)
fill(rand(1,3), rand(1,3), 'r')
plot(rand,rand,'ro','MarkerSize',8,'MarkerFaceColor','k');
%some axes properties
axis([0 1 0 1])
box on
axis square
tStart = tic;
f = getframe();
tElapsed(ind_sim,2) = toc(tStart);
data = f.cdata;
clf
end
close(fig)
%% plot results
plot(tElapsed);
set(gca, 'YLim', [0 max(tElapsed(:))+0.1])
xlabel('Number of calls');
ylabel('Execution time');
legend({'within (method 1)';'outside (method 2)'});
title('GetFrame exectution time');
即使宣布图形不可见,也必须删除图形的创建。这会影响执行时间。