la pila de llamadas función regular Matlab es en sí mismo una pila de espacios de trabajo. El solo uso de funciones es la forma más fácil de usar una y la copia en escritura de Matlab lo hace razonablemente eficiente. Pero eso probablemente no es lo que estás preguntando.
Existe una correspondencia natural entre los espacios de trabajo y las estructuras, ya que los mismos identificadores son válidos para nombres de variables y campos de estructuras. Ambos son esencialmente identificadores => mapeos Mxarray.
Puede usar whos
y evalin
para capturar el estado del espacio de trabajo en una estructura. Use un vector celular para implementar una pila de ellos. (Una matriz struct no funcionará porque requiere nombres de campo homogéneos). La pila podría almacenarse en appdata para evitar que aparezca en un espacio de trabajo.
Aquí están las funciones push y pop de esta técnica.
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
Con todo esto brillantez, funciones siguen siendo una mejor forma de hacerlo .. De hecho, esto es exactamente cómo se implementan los espacios de trabajo de función sospecho. –