2011-07-20 4 views
48

Làm cách nào để khai báo hàm trong MATLAB với các đối số tùy chọn?Tùy chọn args trong các hàm MATLAB

Ví dụ: function [a] = train(x, y, opt), trong đó lựa chọn phải là đối số tùy chọn.

+1

thể trùng lặp của [Mặc định luận cứ trong Matlab] (http://stackoverflow.com/questions/795823/ default-arguments-in-matlab), [Tương đương Matlab của "None") của Python (http://stackoverflow.com/questions/1737523/the-matlab-equivalent-of-pythons-none), [Cách xử lý cặp tên/giá trị của đối số hàm trong MATLAB] (http://stackoverflow.com/questions/2775263/how-to-deal-with-name-value-pairs-of-function-arguments-in-matlab) – Amro

+1

Thảo luận tốt của h http://blogs.mathworks.com/pick/2010/04/02/setting-default-values/ và tại đây http://blogs.mathworks.com/loren/2009/05/05/nice-way-to -set-function-defaults / –

Trả lời

34

Có một vài tùy chọn khác nhau về cách thực hiện việc này. Điều cơ bản nhất là sử dụng varargin và sau đó sử dụng nargin, size v.v. để xác định xem các đối số tùy chọn đã được chuyển cho hàm hay chưa.

% Function that takes two arguments, X & Y, followed by a variable 
% number of additional arguments 
function varlist(X,Y,varargin) 
    fprintf('Total number of inputs = %d\n',nargin); 

    nVarargs = length(varargin); 
    fprintf('Inputs in varargin(%d):\n',nVarargs) 
    for k = 1:nVarargs 
     fprintf(' %d\n', varargin{k}) 
    end 

Một giải pháp tìm kiếm thanh lịch hơn một chút là sử dụng lớp học inputParser để xác định tất cả các đối số mà bạn yêu cầu, cả bắt buộc và tùy chọn. inputParser cũng cho phép bạn thực hiện kiểm tra kiểu trên tất cả các đối số.

36

Cách đơn giản để làm điều này là thông qua nargin (N đối số trong). Nhược điểm là bạn phải chắc chắn rằng danh sách đối số của bạn và kiểm tra nargin phù hợp.

Điều đáng ghi nhớ là tất cả đầu vào là tùy chọn, nhưng các hàm sẽ thoát với lỗi nếu nó gọi biến không được đặt. Ví dụ sau đặt mặc định cho b và c. Sẽ thoát nếu không có mặt.

function [ output_args ] = input_example(a, b, c) 
if nargin < 1 
    error('input_example : a is a required input') 
end 

if nargin < 2 
    b = 20 
end 

if nargin < 3 
    c = 30 
end 
end 
32

Một cách tốt để đi về việc này không phải là để sử dụng nargin, nhưng để kiểm tra xem các biến đã được thiết lập sử dụng exist('opt', 'var').

Ví dụ:

function [a] = train(x, y, opt) 
    if (~exist('opt', 'var')) 
     opt = true; 
    end 
end 

Xem câu trả lời này cho ưu điểm trong việc thực hiện nó theo cách này: How to check whether an argument is supplied in function call?