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} = xvarargin{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]);

的运行效果是一样的。参考实现如下:

  1. 定义结构体 params ,包含一些合法的字段和默认值,后续若需要增加字段或修改默认值,只需修改这一步骤的代码即可;
  2. 根据 varargin 转换为结构体,并赋值给 params,可以参考 Matlab 结构体之间相同字段的赋值。转换为结构体的好处就是避开了输入参数顺序的影响;
  3. 根据 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 行) 

posted @ 2021-09-28 14:10  Wreng  阅读(508)  评论(0编辑  收藏  举报