zoukankan      html  css  js  c++  java
  • 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 imes 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('
    ');
            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 行) 
    

  • 相关阅读:
    模拟器安装.apk包_夜神模拟器
    SDK安装报错_2019
    Jenkins安装插件方法
    Jenkins安装
    Python项目第三方库安装_pip freeze命令
    深入理解Java虚拟机—内存分配
    深入理解Java虚拟机—垃圾回收 下
    深入理解Java虚拟机—垃圾回收 上
    深入理解Java虚拟机—OutOfMemoryError异常
    深入理解Java虚拟机—Java内存区域
  • 原文地址:https://www.cnblogs.com/wreng/p/15347652.html
Copyright © 2011-2022 走看看