13

MATLABでワークスペースのスタックを持つことが可能かどうか誰かが知っていますか?控えめに言っても、それは非常に便利でしょう。

研究のためにこれが必要です。興味深い方法で相互作用するスクリプトがいくつかあります。関数にはローカル変数がありますが、スクリプトはありません。

4

3 に答える 3

25

通常の Matlab 関数呼び出しスタックは、それ自体がワークスペースのスタックです。関数を使用するのが最も簡単な方法であり、Matlab のコピー オン ライトにより、これはかなり効率的になります。しかし、それはおそらくあなたが求めているものではありません。

同じ識別子が変数名と構造体フィールドに有効であるため、ワークスペースと構造体の間には自然な対応があります。どちらも本質的に識別子 => Mxarray マッピングです。

とを使用whosevalinて、ワークスペースの状態を構造体にキャプチャできます。それらのスタックを実装するには、セル ベクトルを使用します。(構造体配列は同種のフィールド名を必要とするため機能しません。) スタックを 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
于 2009-12-01T15:47:58.933 に答える
7

変数のワークスペースを切り替えたいようです。これを行うために私が考えることができる最善の方法は、SAVECLEAR、および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
于 2009-12-01T05:37:46.830 に答える