MATLABにワークスペースのスタックを持たせることができるかどうか知りませんか?最も簡単に言えば、非常に便利です。MATLABワークスペースをスタックにプッシュする方法はありますか?
私は研究のためにこれが必要です。我々は興味深い方法で相互作用するいくつかのスクリプトを持っています。関数にはローカル変数がありますが、スクリプトはありません。
MATLABにワークスペースのスタックを持たせることができるかどうか知りませんか?最も簡単に言えば、非常に便利です。MATLABワークスペースをスタックにプッシュする方法はありますか?
私は研究のためにこれが必要です。我々は興味深い方法で相互作用するいくつかのスクリプトを持っています。関数にはローカル変数がありますが、スクリプトはありません。
変数のワークスペース間を行き来するように思えます。私はこれを行うに考えることができる最善の方法は、MAT-ファイルやワークスペース間を行き来する変数のセットを移動するSAVE、CLEAR、および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
このアイデアは、ショートカットとしてコマンドを保存した場合にうまくいく可能性があります。 –
私はディスクに保存したくありません。 – rlbond
通常の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
ワンダフル。 (どこでもカントー...文書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
このような優れた点でも、機能はまだまだ改善の余地があります。実際、これはファンクションのワークスペースが実装されていると私は思っています。 –