Есть ли способ поместить рабочее пространство MATLAB в стек?

Простым способом,

var a =20; function a(){this.a=10; console.log(a);} 
//20, since the context here is window.

Другой экземпляр:

var a = 20;
function ex(){
this.a = 10;
function inner(){
console.log(this.a); //can you guess the output of this line.
}
inner();
}
var test = new ex();

Ans: Консоль будет печатать 20.

Причина, функция выполняет свой собственный стек, в этом примере функция ex выполняется с оператором new, поэтому будет создан контекст, и когда inner будет выполнен, JS создаст новый стек и выполнит inner, но существует локальный контекст.

Итак, если мы хотим, чтобы функция inner имела локальный контекст, который является ex, нам нужно привязать контекст к внутренней функции .

Стрелки решают эту проблему, вместо того, чтобы принимать Global context, они берут local context, если они существуют. В given example, он примет значение new ex() как this.

Итак, во всех случаях, когда привязка является явной, Arrows решает проблему по умолчанию.

13
задан gnovice 7 December 2009 в 15:34
поделиться

2 ответа

It sounds like you'd like to switch back and forth between workspaces of variables. The best way I can think to do this is to use the SAVE, CLEAR, and LOAD commands to move sets of variables back and forth between MAT-files and the workspace:

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
7
ответ дан 1 December 2019 в 20:00
поделиться

Обычный стек вызовов функций Matlab сам по себе является стеком рабочих пространств. Простое использование функций - это самый простой способ их использования, и функция копирования при записи в Matlab делает это достаточно эффективным. Но, вероятно, вы спрашиваете не об этом.

Существует естественное соответствие между рабочими пространствами и структурами, поскольку одни и те же идентификаторы действительны для имен переменных и полей структуры. По сути, они оба являются сопоставлениями идентификатор => Mxarray.

Вы можете использовать whos и evalin для захвата состояния рабочего пространства в структуру. Используйте вектор ячейки, чтобы создать стек из них. (Структурный массив не будет работать, потому что он требует однородных имен полей.) Стек может храниться в appdata, чтобы предотвратить его появление в самой рабочей области.

Вот функции push и pop для этого метода.

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
25
ответ дан 1 December 2019 в 20:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: