Matlab 輸入參數數可變的函數
varargin
是函數定義語句中的一個輸入變量,允許函數接受任意數量的輸入參數。
在執行函數時,varargin
是一個 \(1×N\) 元胞數組,其中 \(N\) 是函數在顯式聲明的輸入后收到的輸入項數。但是,如果該函數在顯式聲明的輸入后未收到任何輸入,則 varargin
是空元胞數組。
例子 1
重新包裝 plot
,使得繪制的線條的默認顏色為紅色。
function varargout = redplot(varargin)
[varargout{1:nargout}] = plot(varargin{:},'Color',[1,0,0]);
end
執行函數,在 redplot
中的 varargin
是一個 \(1\times 2\) 的元胞數組,varargin{1} = x
,varargin{2} = y
。
x = 0:pi/100:2*pi;
y = sin(x);
redplot(x,y)
例子 2
plot
是一個比較常用的函數,可變數量的輸入可以不考慮“順序”,如
plot(x, y, 'Color', [1,0,0], 'LineStyle', '--');
plot(x, y, 'LineStyle', '--', 'Color', [1,0,0]);
的運行效果是一樣的。參考實現如下:
- 定義結構體
params
,包含一些合法的字段和默認值,后續若需要增加字段或修改默認值,只需修改這一步驟的代碼即可; - 根據
varargin
轉換為結構體,並賦值給params
,可以參考 Matlab 結構體之間相同字段的賦值。轉換為結構體的好處就是避開了輸入參數順序的影響; - 根據
params
對目標對象進行賦值。
function [line_obj] = myplot(x, y, varargin)
%% 可選參數的默認值
% 可直接在這添加參數而不需要修改后面的代碼(一般情況)
params.Color = [0, 1, 0];
params.LineStyle = '-';
params.LineWidth = 0.5;
params.Marker = 'none';
params.MarkerSize = 6;
%% 輸入參數處理
% 將輸入的元胞數組轉化為結構體
input_params = struct(varargin{:});
% 將 input_params 與 params 相同字段的值賦值給 params 對應的字段
keys = fieldnames(input_params);
for i = 1:length(keys)
cur_key = keys{i};
if isfield(params, cur_key)
params.(cur_key) = input_params.(cur_key);
else
warning('字段"%s"不存在', cur_key);
fprintf('\n');
end
end
%% 修改目標類
line_obj = line(x, y);
keys = fieldnames(params);
for i = 1:length(keys)
cur_key = keys{i};
line_obj.(cur_key) = params.(cur_key);
end
end
執行函數
x = linspace(0, 2*pi, 100);
y = sin(2*pi*x);
[lineobj] = myplot(x, y, ...
'Color', [1,0,0], ...
'LineStyle', '--', ...
'Name', 'Jake', ... % 非法字段
'Marker', '*');
運行結果:
警告: 字段"Name"不存在
> 位置:untitled>myplot (第 32 行)
位置: untitled (第 6 行)