La normale stack di chiamata di funzione MATLAB è stesso una pila di spazi di lavoro. Usare le funzioni è il modo più semplice per usarne una e la copia su scrittura di Matlab lo rende ragionevolmente efficiente. Ma probabilmente non è quello che stai chiedendo.
C'è una corrispondenza naturale tra spazi di lavoro e strutture, poiché gli stessi identificatori sono validi per nomi di variabili e campi struct. Sono entrambi essenzialmente identificatori => mapping Mxarray.
È possibile utilizzare whos
e evalin
per acquisire lo stato dell'area di lavoro in una struttura. Usa un vettore cellulare per implementare una pila di essi. (Una struct array non funzionerà perché richiede nomi di campi omogenei.) Lo stack potrebbe essere memorizzato in appdata per impedirne la visualizzazione in uno spazio di lavoro stesso.
Qui ci sono le funzioni push e pop per questa tecnica.
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
fonte
2009-12-01 15:47:58
Con tutto questo splendore, le funzioni sono ancora un modo migliore di farlo .. In realtà, questo è esattamente come le aree di lavoro delle funzioni sono implementate ho il sospetto. –