Обычный стек вызовов функций Matlab сам по себе является стеком рабочих пространств. Простое использование функций - это самый простой способ их использования, а копирование при записи в Matlab делает это достаточно эффективным. Но это, вероятно, не то, что вы спрашиваете.
Существует естественное соответствие между рабочими пространствами и структурами, поскольку одинаковые идентификаторы действительны для имен переменных и структурных полей. Они оба по сути являются идентификаторами => Mxarray mapping.
Вы можете использовать whos
и evalin
для записи состояния рабочего пространства в структуру. Используйте вектор ячейки, чтобы реализовать их стек. (Массив структуры не будет работать, поскольку он требует однородных имен полей.) Стек может храниться в appdata, чтобы предотвратить его появление в самой рабочей области.
Вот функции push и pop для этой техники.
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