2016-01-21 138 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個輸出)。