Matlab 手动实现plot——输入参数数可变的函数
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 行)