Matlab 图 'age'
Matlab figure 'age'
这是 'experts in the less documented part of Matlab' 的一个问题:是否有一种(未记录的?)方法来确定图已打开多长时间(即图的 'age')?
figure; spy;
myfig=gcf;
age=get_age() %shoud output age of figure in some format
据我所知,图形对象不会公开此类信息。甚至在其未记录的底层 Java
class 中也没有。但我有一个想法可能代表一个很好的解决这个问题的方法。
使用 figure function 的以下重载:
figure(n) finds a figure in which the Number property is equal to n,
and makes it the current figure. If no figure exists with that
property value, MATLAB® creates a new figure and sets its Number
property to n.
为了给每个现有图形分配一个 "unique identifier",并将这些标识符关联到表示创建时间的 datenum
值:
% Initialize the lookup table somewhere in your code:
lookup_table = zeros(0,2);
% Together with a variable that stores the next unique identifier to be assigned:
next_id = 1;
% When you need to instantiate a new figure...
% 1) Retrieve the current datetime:
cdate = now();
% 2) Update the lookup table:
lookup_table = [lookup_table; next_id cdate];
% 3) Initialize the new figure:
figure(next_id);
% 4) Increment the next unique identifier:
next_id = next_id + 1;
查找的每一行 table 将包含一个唯一的图形标识符及其各自的创建日期。
其他的都很好办。当你想查询一个图形正常运行时间...在查找中找到它的唯一标识符 table 并将当前时间(使用 now()
命令获得)减去创建时间。我建议您为您创建的每个图形定义一个 CloseRequestFcn
句柄,这样当一个图形关闭时,您可以更新 lookup_table
并将其删除。可以使用其 Number
属性 检索您分配给特定图形的标识符。这是一个完整的工作实现:
global lookup_table;
global next_id;
lookup_table = zeros(0,2);
next_id = 1;
f1 = create_figure();
f2 = create_figure();
pause(10);
f1_ut = get_figure_uptime(f1)
f2_ut = get_figure_uptime(f2)
function f = create_figure()
global lookup_table;
global next_id;
cdate = now();
f = figure(next_id);
f.CloseRequestFcn = @update_lookup_table;
lookup_table = [lookup_table; next_id cdate];
next_id = next_id + 1;
end
function ut = get_figure_uptime(f)
global lookup_table;
tn = now();
tc = lookup_table(lookup_table(:,1) == f.Number,2);
if (isempty(tc))
ut = -1;
else
ut = etime(datevec(tn),datevec(tc));
end
end
function update_lookup_table(f,~)
global lookup_table;
lookup_table(lookup_table(:,1) == f.Number,:) = [];
delete(f);
end
或者,正如您在评论中所建议的那样,您可以向您创建的每个图形添加一个 属性 以存储其创建时间。它更加直接并且消除了处理查找的需要 table。为此,只需使用 addprop functon 如下:
cdate = now();
f = figure();
addprop(f,'CreationTime');
f.CreationTime = cdate;
参考这个link
您的问题的答案可能是这段代码(这适用于 MATLAB R2014b 及更高版本)。我用 R2015a 测试过。
figure; spy;
my_fig=groot;
cnt = 0;
pause(0.05)
while ~isempty(my_fig.Children)
cnt=cnt+1
pause(0.01)
end
这里的cnt值会和时间成正比,window在close之前存在。
注:
- 可以减少暂停的参数值,在计算时间的时候,暂停时间也要考虑进去
- 可以使用系统时钟时间代替计数器方法的cnt变量。
您可以使用以下机制:
首先,创建一个如下所示的小 Matlab 函数,将 CreationTime 属性 附加到图形:
function setCreationTime(hFig,varargin)
hProp = addprop(hFig,'CreationTime');
hFig.CreationTime = now;
hProp.SetAccess = 'private'; %make property read-only after setting its initial value
hProp = addprop(hFig,'Age');
hProp.GetMethod = @(h,e) etime(datevec(hFig.CreationTime), clock); %compute on-the-fly
hProp.SetAccess = 'private'; %make property read-only
end
现在将此函数指定为默认的 CreateFcn 回调函数,用于所有新图形:
set(0,'DefaultFigureCreateFcn',@setCreationTime)
就是这样 - 大功告成!
例如:
>> newFig = figure;
>> newFig.CreationTime
ans =
737096.613706748
>> ageInDays = now - newFig.CreationTime
ageInDays =
0.01625078368466347
>> ageDuration = duration(ageInDays*24,0,0)
ageDuration =
duration
00:23:24
>> ageString = datestr(ageInDays, 'HH:MM:SS.FFF')
ageString =
'00:23:24.068'
>> ageInSecs = newFig.Age
ageInSecs =
1404.067710354923808
这是 'experts in the less documented part of Matlab' 的一个问题:是否有一种(未记录的?)方法来确定图已打开多长时间(即图的 'age')?
figure; spy;
myfig=gcf;
age=get_age() %shoud output age of figure in some format
据我所知,图形对象不会公开此类信息。甚至在其未记录的底层 Java
class 中也没有。但我有一个想法可能代表一个很好的解决这个问题的方法。
使用 figure function 的以下重载:
figure(n) finds a figure in which the Number property is equal to n, and makes it the current figure. If no figure exists with that property value, MATLAB® creates a new figure and sets its Number property to n.
为了给每个现有图形分配一个 "unique identifier",并将这些标识符关联到表示创建时间的 datenum
值:
% Initialize the lookup table somewhere in your code:
lookup_table = zeros(0,2);
% Together with a variable that stores the next unique identifier to be assigned:
next_id = 1;
% When you need to instantiate a new figure...
% 1) Retrieve the current datetime:
cdate = now();
% 2) Update the lookup table:
lookup_table = [lookup_table; next_id cdate];
% 3) Initialize the new figure:
figure(next_id);
% 4) Increment the next unique identifier:
next_id = next_id + 1;
查找的每一行 table 将包含一个唯一的图形标识符及其各自的创建日期。
其他的都很好办。当你想查询一个图形正常运行时间...在查找中找到它的唯一标识符 table 并将当前时间(使用 now()
命令获得)减去创建时间。我建议您为您创建的每个图形定义一个 CloseRequestFcn
句柄,这样当一个图形关闭时,您可以更新 lookup_table
并将其删除。可以使用其 Number
属性 检索您分配给特定图形的标识符。这是一个完整的工作实现:
global lookup_table;
global next_id;
lookup_table = zeros(0,2);
next_id = 1;
f1 = create_figure();
f2 = create_figure();
pause(10);
f1_ut = get_figure_uptime(f1)
f2_ut = get_figure_uptime(f2)
function f = create_figure()
global lookup_table;
global next_id;
cdate = now();
f = figure(next_id);
f.CloseRequestFcn = @update_lookup_table;
lookup_table = [lookup_table; next_id cdate];
next_id = next_id + 1;
end
function ut = get_figure_uptime(f)
global lookup_table;
tn = now();
tc = lookup_table(lookup_table(:,1) == f.Number,2);
if (isempty(tc))
ut = -1;
else
ut = etime(datevec(tn),datevec(tc));
end
end
function update_lookup_table(f,~)
global lookup_table;
lookup_table(lookup_table(:,1) == f.Number,:) = [];
delete(f);
end
或者,正如您在评论中所建议的那样,您可以向您创建的每个图形添加一个 属性 以存储其创建时间。它更加直接并且消除了处理查找的需要 table。为此,只需使用 addprop functon 如下:
cdate = now();
f = figure();
addprop(f,'CreationTime');
f.CreationTime = cdate;
参考这个link 您的问题的答案可能是这段代码(这适用于 MATLAB R2014b 及更高版本)。我用 R2015a 测试过。
figure; spy;
my_fig=groot;
cnt = 0;
pause(0.05)
while ~isempty(my_fig.Children)
cnt=cnt+1
pause(0.01)
end
这里的cnt值会和时间成正比,window在close之前存在。 注:
- 可以减少暂停的参数值,在计算时间的时候,暂停时间也要考虑进去
- 可以使用系统时钟时间代替计数器方法的cnt变量。
您可以使用以下机制:
首先,创建一个如下所示的小 Matlab 函数,将 CreationTime 属性 附加到图形:
function setCreationTime(hFig,varargin)
hProp = addprop(hFig,'CreationTime');
hFig.CreationTime = now;
hProp.SetAccess = 'private'; %make property read-only after setting its initial value
hProp = addprop(hFig,'Age');
hProp.GetMethod = @(h,e) etime(datevec(hFig.CreationTime), clock); %compute on-the-fly
hProp.SetAccess = 'private'; %make property read-only
end
现在将此函数指定为默认的 CreateFcn 回调函数,用于所有新图形:
set(0,'DefaultFigureCreateFcn',@setCreationTime)
就是这样 - 大功告成!
例如:
>> newFig = figure;
>> newFig.CreationTime
ans =
737096.613706748
>> ageInDays = now - newFig.CreationTime
ageInDays =
0.01625078368466347
>> ageDuration = duration(ageInDays*24,0,0)
ageDuration =
duration
00:23:24
>> ageString = datestr(ageInDays, 'HH:MM:SS.FFF')
ageString =
'00:23:24.068'
>> ageInSecs = newFig.Age
ageInSecs =
1404.067710354923808