2011-12-20 9 views
12

Có điều gì đó tương tự như assignin() để tìm biến tồn tại trong không gian làm việc khác và đưa nó vào không gian làm việc cục bộ, ví dụ: giống như truy cập biến cơ sở-không gian làm việc trong một hàm !?Biến truy cập từ không gian làm việc khác trong Matlab?

Một ví dụ tôi hiện đang cố gắng đạt được là: Tôi có chức năng bla(x) có một tham số. Khi x không được chỉ định, chức năng sẽ tự động sử dụng x tồn tại trong không gian làm việc matlab cơ sở (nếu có x).

Something đẹp sẽ

function bla(x) 
    if(nargin == 0 && exist('x', 'base', 'var')) 
    x = fetchin('base', 'x'); 
    end 

    % ... 
end 

Tôi biết rằng fetchin() không tồn tại và rằng exist() doesn # t mất một tham số thứ hai như vậy để kiểm tra trong một không gian làm việc nhất định! Cảm ơn rất nhiều trước!

Trả lời

18

Các Matlab chức năng evalin thể làm điều đó:

x=evalin('base','x'); 

EDIT: Như mentionned bởi Col Heather, bạn có thể sử dụng một câu lệnh try/catch để xử lý các lỗi có thể được tạo ra bởi các chức năng evalin (trong bạn trường hợp nếu biến không tồn tại chẳng hạn) và sau đó kiểm tra xem biến có đúng loại hay không.

+0

Ahh đó là những gì có nghĩa 'thực hiện'. Tôi nghĩ rằng điều này sẽ chỉ để tính toán, nhưng có bạn là đúng! Gọi biểu thức 'x' chỉ cho các giá trị của' x'. Cảm ơn. Là một cách tiếp cận tốt để đơn giản hóa các cuộc gọi của các chức năng cho người dùng nhưng vẫn cho anh ta khả năng để vượt qua các giá trị riêng của mình (chỉ trong trường hợp anh ta cần phải gọi nó từ nơi khác)? Điều gì sẽ xảy ra khi không có 'x'? Làm thế nào để kiểm tra điều này trước khi gọi 'evalin'? – tim

+1

Nếu người dùng 'x' của bạn không được gọi là' x' thì sao? –

+1

Tôi chắc chắn rằng :-) Để thoát khỏi sự kiểm tra sự tồn tại, tôi nghĩ ra cách sử dụng 'if (nargin == 0), thử, x = evalin ('base', 'x'); bắt lỗi, lỗi ('Không gian làm việc var x phải tồn tại, hoặc bạn cần truyền x cho hàm'); kết thúc, kết thúc' – tim

2

Kiểm tra tồn tại biến trong người gọi/cơ sở có thể được thực hiện thông qua:

existStr=sprintf('exist(''%s'', ''var'')==1', varNames{iVar}); % verify variable exists 
    isVarExist=evalin(ws, existStr); 
    if isVarExist 
     valVar=evalin(ws, varNames{iVar}); 
    else 
     valVar=[]; 
    end