2009-12-01 48 views
13

MATLABにワークスペースのスタックを持たせることができるかどうか知りませんか?最も簡単に言えば、非常に便利です。MATLABワークスペースをスタックにプッシュする方法はありますか?

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

+1

このような優れた点でも、機能はまだまだ改善の余地があります。実際、これはファンクションのワークスペースが実装されていると私は思っています。 –

答えて

7

変数のワークスペース間を行き来するように思えます。私はこれを行うに考えることができる最善の方法は、MAT-ファイルやワークスペース間を行き来する変数のセットを移動するSAVECLEAR、およびLOADコマンドを使用することです:

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 
+0

このアイデアは、ショートカットとしてコマンドを保存した場合にうまくいく可能性があります。 –

+0

私はディスクに保存したくありません。 – rlbond

25

通常のMATLAB関数の呼び出しスタックがありますそれ自体は作業領域のスタックです。関数を使うだけでもっとも簡単に使うことができます.Matlabのcopy-on-writeはこれを合理的に効率的にします。しかし、それはおそらくあなたが求めているものではありません。

同じ識別子が変数名と構造体フィールドに有効であるため、ワークスペースと構造体の間には自然な対応があります。それらは本質的にはidentifier => 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 
+0

+1:これは興味深い考えです。 – gnovice

+0

クールなアイデア。私はこれを試してみよう! – rlbond

+0

これは魅力のように機能します。 – sage

0

ワンダフル。 (どこでもカントー...文書getappdataを持つ0を使用して見つかったので、これは可能性かもしれません離れて将来的にはないか。)私のutilライブラリにプッシュ&ポップを追加した、とも次

pop_workspace(keep_current) 
% keep_current: bool: if true, current vars retained after pop 
. . . 
if (~keep_current) 
    evalin('caller','clear'); 
end 

少しの創造選択した瓶のみを残し、ポップ上に上書きしないようにすることができます。

function pull_workspace(names) 
% pulls variablesin cell array names{} into workspace from stack without 
% popping the workspace stack 
% 
% pulled variable will be a local copy of the stack's variable, 
% so modifying it will leave the stack's variable untouched. 
% 
    if (~exist('names','var') || isempty(names)) 
     pull_all = true; 
    else 
     pull_all = false; 
%   if names is not a cell array, then user gave us 
%   just 1 var name as a string. make it a cell array. 
     if (~iscell(names)) 
      names = {names}; 
     end 
    end 

    % Peek at last workspace on stack 
    c = getappdata(0, 'WORKSPACE_STACK'); 
    if isempty(c) 
     warning('Nothing on workspace stack'); 
     return; 
    end 
    s = c{end}; 

    % Stick vars back in caller's workspace 
    if (pull_all) 
     names = fieldnames(s); 
    end 
    for i = 1:numel(names) 
     assignin('caller', names{i}, s.(names{i})); 
    end 
end 
関連する問題