重载功能

时间:2011-12-25 18:27:23

标签: oop matlab overloading

有没有办法在Matlab中的同一个类中有两个具有相同名称但具有不同参数的函数?

2 个答案:

答案 0 :(得分:21)

简而言之:不,这是不可能的。

但是,您可以模仿这种行为:

显然,由于Matlab是一种动态语言,你可以传递任何类型的参数并检查它们。

function foo(x)
    if isnumeric(x)
        disp(' Numeric behavior');
    elseif ischar(x)
        disp(' String behavior');
    end
end

您还可以使用varargin,并检查参数的数量,并更改行为

function goo(varargin)
    if nargin == 2
        disp('2 arguments behavior');
    elseif nargin == 3
        disp('3 arguments behavior');   
    end
end

答案 1 :(得分:2)

安德烈已经给出了正确答案。但是,我已经进行了一段时间的实验,我想展示一下我认为另一种相对简单的方法,它有一些好处。此外,它是MATLAB用于内置函数的一种方法。

我指的是传递参数的这种键值对方式:

x = 0:pi/50:2*pi;
y = sin(x);
plot(x, y, 'Color', 'blue', 'MarkerFaceColor', 'green');

解析varargin单元格数组的方法有很多,但到目前为止我发现的最干净的方法是使用MATLAB inputParser类。

示例:

function makeSandwiches(amount, varargin)
%// MAKESANDWICHES Make a number of sandwiches.
%// By default, you get a ham and egg sandwich with butter on white bread.
%// Options:
%// amount       : number of sandwiches to make (integer)
%// 'butter'     : boolean
%// 'breadType'  : string specifying 'white', 'sourdough', or 'rye'
%// 'topping'    : string describing everything you like, we have it all!

p = inputParser();                          %// instantiate inputParser
p.addRequired('amount', @isnumeric);        %// use built-in MATLAB for validation
p.addOptional('butter', 1, @islogical);
p.addOptional('breadType', 'white', ...     %// or use your own (anonymous) functions
    @(x) strcmp(x, 'white') || strcmp(x, 'sourdough') || strcmp(x, 'rye'));
p.addOptional('toppings', 'ham and egg', @(x) ischar(x) || iscell(x))
p.parse(amount, varargin{:});               %// Upon parsing, the variables are
                                            %// available as p.Results.<var>

%// Get some strings
if p.Results.amount == 1
    stringAmount = 'one tasty sandwich';
else
    stringAmount = sprintf('%d tasty sandwiches', p.Results.amount);
end

if p.Results.butter
    stringButter = 'with butter';
else
    stringButter = 'without butter';
end

%// Make the sandwiches
fprintf(['I made you %s %s from %s bread with %s and taught you ' ...
    'something about input parsing and validation in MATLAB at ' ...
    'the same time!\n'], ...
    stringAmount, stringButter, p.Results.breadType, p.Results.toppings);

end

(评论后斜线,因为SO不支持MATLAB语法高亮显示)

这种方法的附加好处是:
- 可以设置默认值(如Python,您可以在函数签名中设置arg=val
- 以简单的方式执行输入验证的可能性
- 您只需记住选项名称,而不是订单,因为订单无关紧要

缺点:
- 在执行许多函数调用时可能会有一些开销可能变得很重要而其他方面(未测试)可能会变得很重要 - 您必须使用Results类中的inputParser属性,而不是直接使用变量