2009-12-01 26 views
13

Có ai biết nếu có thể có một chồng không gian làm việc trong MATLAB? Nó sẽ rất thuận tiện, để nói rằng ít nhất.Có cách nào để đẩy không gian làm việc MATLAB lên ngăn xếp không?

Tôi cần điều này để nghiên cứu. Chúng tôi có một số kịch bản tương tác theo những cách thú vị. Các hàm có biến cục bộ, chứ không phải tập lệnh ...

+1

Với tất cả rực rỡ này, chức năng vẫn là một cách tốt hơn để làm việc đó .. Trong thực tế, đây là chính xác như thế nào chức năng không gian làm việc được thực hiện tôi nghi ngờ. –

Trả lời

7

Có vẻ như bạn muốn chuyển đổi qua lại giữa không gian làm việc của biến. Cách tốt nhất tôi có thể nghĩ để làm điều này là sử dụng SAVE, CLEAR, và LOAD lệnh để di chuyển bộ biến qua lại giữa MAT-file và không gian làm việc:

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

Ý tưởng này có thể hoạt động tốt nếu bạn đã lưu các lệnh dưới dạng lối tắt. –

+0

Tôi không muốn lưu vào đĩa. – rlbond

25

sự thường xuyên Matlab chức năng gọi stack là chính nó là một đống không gian làm việc. Chỉ cần sử dụng các hàm là cách dễ nhất để sử dụng một hàm, và bản sao chép-ghi-viết của Matlab làm cho việc này trở nên hiệu quả một cách hợp lý. Nhưng đó có lẽ không phải những gì bạn đang yêu cầu.

Có sự tương ứng tự nhiên giữa không gian làm việc và cấu trúc, vì cùng số nhận dạng hợp lệ cho các tên biến và trường cấu trúc. Cả hai bản chất đều là định danh => ánh xạ Mxarray.

Bạn có thể sử dụng whosevalin để nắm bắt trạng thái vùng làm việc thành cấu trúc. Sử dụng một vector tế bào để thực hiện một chồng của chúng. (Một mảng cấu trúc sẽ không hoạt động vì nó yêu cầu tên trường đồng nhất.) Ngăn xếp có thể được lưu trữ trong appdata để ngăn không cho nó xuất hiện trong chính vùng làm việc.

Dưới đây là các chức năng push và pop cho kỹ thuật này.

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: Bây giờ đó là một ý tưởng thú vị! – gnovice

+0

Ý tưởng hay. Tôi sẽ thử cái này! – rlbond

+0

Điều này hoạt động như một sự quyến rũ. – sage

0

Tuyệt vời. (Đã không tìm thấy bằng 0 với getappdata tài liệu bất cứ nơi nào tho ... vì vậy đây có thể có thể biến mất trong tương lai.) Đã bổ sung push & pop vào thư viện util của tôi, và cũng có thể như sau:

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

Một chút sáng tạo và người ta chỉ có thể giữ lại các vars đã chọn và tránh ghi đè lên một cửa sổ bật lên. Tôi tìm thấy tôi cũng cần những chức năng sau đây trong công việc của tôi:

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 
Các vấn đề liên quan