常规的Matlab函数调用堆栈本身就是一堆工作区.只需使用函数是最简单的方法之一,而Matlab的写时复制功能使其效率相当高.但这可能不是你所要求的.
工作空间和结构之间有一个自然的对应关系,因为相同的标识符对变量名和结构域有效.它们本质上都是identifier => Mxarray映射.
您可以使用whos和evalin将工作空间状态捕获到结构体.使用单元格向量来实现它们的堆栈. (一个结构体数组将不起作用,因为它需要均匀的字段名称.)堆栈可以存储在appdata中,以防止它出现在工作区本身.
以下是这种技术的推送和弹出功能.
function push_workspace()
c = getappdata(0, 'WORKSPACE_STACK');
if isempty(c)
c = {};
end
% Grab workspace
w = evalin('caller', 'whos');
names = {w.name};
s = struct;
for i = 1:numel(w)
s.(names{i}) = evalin('caller', names{i});
end
% Push it on the stack
c{end+1} = s;
setappdata(0, 'WORKSPACE_STACK', c);
function pop_workspace()
% Pop last workspace off stack
c = getappdata(0, 'WORKSPACE_STACK');
if isempty(c)
warning('Nothing on workspace stack');
return;
end
s = c{end};
c(end) = [];
setappdata(0, 'WORKSPACE_STACK', c);
% Do this if you want a blank slate for your workspace
evalin('caller', 'clear');
% Stick vars back in caller's workspace
names = fieldnames(s);
for i = 1:numel(names)
assignin('caller', names{i}, s.(names{i}));
end