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 行) 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM