套用
在matlab中, varargin提供了一種函式可變參數列表機制。 就是說, 使用了“可變參數列表機制”的函式允許調用者調用該函式時根據需要來改變輸入參數的個數。
matlab中很多內建函式和工具箱函式都使用了這種機制。 比如圖像處理工具箱中的imshow函式。 該函式允許我們根據圖像數據特點來調用:
比如, 顯示一張真彩色點陣圖, 我們可以簡單的使用:
imshow(RGB), 其中RGB是通過imread函式讀取圖像獲得的圖像數據。這裡我們只給了一個參數。
但是在顯示索引圖像時, 因為索引圖像使用了調色板,因此為了正確顯示圖像, 除了圖像數據外, 我們還要額外指定顯示圖像所使用的調色板(一般也由imread函式獲得),這樣就出現了以下的調用格式:
imshow(X, map)
那么, 這種機制是怎么實現的呢? 藉助於varargin。
相關:varargout、nargin
例子寫法
下面我們來看一個簡單的例子,(本例子參考了matlab中varargin文檔)
function retvar = vartest(varargin)
optargin = size(varargin, 2); % number of inputs.
ndims(varargin)
varargin
stdargin = nargin - optargin; % 'nargin' in matlab means number of input arguments.
fprintf('Number of inputs: %d\n', nargin);
fprintf('Inputs from individual arguments: %d\n', stdargin)
for k = 1:size(varargin, 2)
fprintf('%d: %d\n', k, varargin{k});
end
end
這裡定義了一個函式, 利用了可變參數列表。然後我們這樣調用這個函式:
>> vartest(1, 2, 3)
ans = 2
varargin =
[1] [2] [3]
Number of inputs: 3
Inputs from individual arguments: 0
1: 1
2: 2
3: 3
我們看到, 這裡varargin是一個1*3的二維矩陣, 這個矩陣即我們調用這個函式時傳入的參數列表。
通過size(varargin, 2)獲得的varargin第二維的尺寸(即varargin的列數)就是我們傳入的參數個數。
stdargin = nargin - optargin;這一句是獲取可變參數列表從第幾個參數開始的。 其中, nargin也是matlab中的, 不能拼錯了, nargin的
值即傳入的所有參數個數。
也許你會問, 咦? 這不就是size(varargin, 2)嗎?
對於本例,的確這樣子。
但是有的函式, 參數列表是這樣的:
function vartest_2(arg1, argb, varargin)
optargin = size(varargin, 2); % number of inputs.
stdargin = nargin - optargin; % 'nargin' in matlab means number of input arguments.
fprintf('Number of inputs: %d\n', nargin);
fprintf('Inputs from individual arguments: %d\n', stdargin)
for k = 1:size(varargin, 2)
fprintf('%d: %d\n', k, varargin{k});
end
end
這次我們調用:
>> vartest_2(1, 2, 3)
Number of inputs: 3
Inputs from individual arguments: 2
1: 3
你會看到, 由於vartest_2的第一二個參數不是可變參數列表的一部分, 可變參數列表從第三個參數開始。因此
nargin等於3, 而size(varargin, 2) 等於1。