2016-01-21 139 views
1
function [ muln, varargout ] = my_mul(varargin) 
%MY_MUL This function is used to multiply numbers. 
% My_mul function multiplies array of entered numbers, and outputs single 
% solution. 
% For example: my_mul(12, 2, 3, 5) gives ans = 360 

if nargout >=1 
    disp('Error, wrong number of output arguments'); 
    varargout{1} = 0; 
    return 

end 
if nargin <= 1 
    disp('Error, small number of input argumnets'); 
    return 
else 
    muln = 1; 
    for i = 1:nargin 
     muln = muln*varargin{i}; 
    end 
end 
end 

嗨,大家好,我只是做我的任务,并有一个奇怪的问题。 如何使这个函数给出一个错误,如果它被多个输出调用(这意味着只给出一个)谢谢!MatLab功能,可变输出

+2

如果它只能有一个输出,请移除'varargout'并只返回'muln'。否则,你也可以检查'nargout',它的工作方式与'nargin'完全一样,仅用于输出。 – hbaderts

+1

我会使用引发异常的[error](http://se.mathworks.com/help/matlab/ref/error.html)。 IE浏览器。 '错误('没有足够的输入参数'),则不使用返回值。 –

回答

1

在您的函数定义中,您已经定义了函数以允许无限数量的输出。关键字varargout是可变数量输出的占位符。

正如你在你的问题中所述,你只需要一个可能的输出,在你的情况下看起来是muln。所以,如果你只是从你的函数定义中删除varargout,MATLAB会自动如果有太多的输出要求

function muln = my_mul(varargin) 

如果你需要使用varargout但要放置多少输出限制抛出一个错误为任何给定的场景提供,您可以使用nargout检查请求的输出参数的数量,然后用error函数抛出错误。

if nargout > 4 
    error('my_mul:TooManyOutputs', 'Too many outputs requested'); 
end 
0

我的意见是,如果返回值是预期的功能需要抛出。否则,调用者(调用这个函数的函数)会期待一切正常。请注意,disp('Error')向开发人员提供了信息,但它并未向程序提供有关发生情况的任何指示。更重要的是,这些信息并没有给出任何错误发生的迹象。这可能会迫使开发人员为了发现错误而进行大量调试,这是完全不必要的。

只有在应该预期不同数量的输出参数的情况下,才应该使用变量输出参数。一个例子是一些定制的绘图功能

function varargout = myplot(varargin) 
filename = ''; 
idx = find(strcmp(varargin,'filename')); 
if (~isempty(idx) && length(varargin)<idx+1 && ~ischar(varargin{idx+1})) 
    error('filename property must be followed by a directory'); 
elseif(~isempty(idx)) 
    filename = varargin{idx+1}; 
    varargin([idx,idx+1]) = []; 
end 
h = plot(varargin{:}); 
varagout{1} = h; 

if (~isempty(idx)) 
    save(filename, h); 
end 
varagout{2} = filename; 

此功能的作用plot除了它保存图中指定的文件名的情况下,以文件。如果开发者需要这个句柄,它将被返回,如果开发者想要保存目录,它也可以被返回。尽管这些论据都不是必要的。开发人员可能希望将此函数用作标准绘图函数,这意味着用户可能想要调用myplot作为myplot(x,y);,该函数不返回值。还要注意的是,即使'filename'未被指定,该函数仍然可以返回2个输出。第二个输出可能是char的空数组,但调用者的两个输出不会导致崩溃。

另外,请注意,不需要进一步的错误处理。唯一未经检查的崩溃在plotsave。对于不同的用户来说,这种处理方式可能会有所不同,这意味着让用户抓住错误并处理错误是合理的(正如他在保存或绘制图像时所做的那样)。

除此之外,您还可能希望进行检查,以确保输出变量的数量在正确的范围内(在本例中为0,1或2个输出)。