Der reguläre Matlab-Stack Funktionsaufruf selbst ein Stapel von Arbeitsbereichen. Die Verwendung von Funktionen ist am einfachsten, und Matlab's Copy-on-Write macht dies relativ effizient. Aber das ist wahrscheinlich nicht das, was du fragst.
Es gibt eine natürliche Entsprechung zwischen Arbeitsbereichen und Strukturen, da dieselben Bezeichner für Variablennamen und Strukturfelder gültig sind. Sie sind beide im Wesentlichen Bezeichner => Mxarray-Zuordnungen.
Sie können whos
und evalin
verwenden, um den Arbeitsbereich in einer Struktur zu erfassen. Verwenden Sie einen Zellenvektor, um einen Stapel von ihnen zu implementieren. (Ein struct-Array funktioniert nicht, weil es homogene Feldnamen benötigt.) Der Stack könnte in appdata gespeichert werden, um zu verhindern, dass er in einem Arbeitsbereich selbst erscheint.
Hier sind Push- und Pop-Funktionen für diese Technik.
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
Mit all diesem Glanz, Funktionen sind immer noch ein besserer Weg, es zu tun .. In der Tat, dies ist genau, wie Funktion Workspaces implementiert ich vermute. –