MATLABでワークスペースのスタックを持つことが可能かどうか誰かが知っていますか?控えめに言っても、それは非常に便利でしょう。
研究のためにこれが必要です。興味深い方法で相互作用するスクリプトがいくつかあります。関数にはローカル変数がありますが、スクリプトはありません。
通常の Matlab 関数呼び出しスタックは、それ自体がワークスペースのスタックです。関数を使用するのが最も簡単な方法であり、Matlab のコピー オン ライトにより、これはかなり効率的になります。しかし、それはおそらくあなたが求めているものではありません。
同じ識別子が変数名と構造体フィールドに有効であるため、ワークスペースと構造体の間には自然な対応があります。どちらも本質的に識別子 => 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
変数のワークスペースを切り替えたいようです。これを行うために私が考えることができる最善の方法は、SAVE、CLEAR、およびLOADコマンドを使用して、変数のセットをMATファイルとワークスペースの間で前後に移動することです。
save workspace_1.mat %# Save all variables in the current workspace
%# to a .mat file
clear %# Clear all variables in the current workspace
load workspace_2.mat %# Load all variables from a .mat file into the
%# current workspace