Как мога да докладвам персонализирани грешки, когато при извикване на функция липсват някои аргументи?

Обучавам се на основите на MATLAB и съм заседнал как да създавам грешки за функции. Ето моят опит:

function kinetic = KE(m,v)

KE = 0.5*m*v*v

%error messages 
if (isempty(m))
  % mass is empty
  error('No mass given (argument 1)');
elseif (isempty(v))  
  % velocity is empty
  error('No velocity given (argument 2)');
end

fprintf('The kinetic energy is %d joules\n', KE);

Така че, ако потребителят не посочи 2 променливи, функцията дава грешка, казвайки на потребителя коя променлива не е посочил. Когато се опитам да получа това съобщение за грешка, MATLAB връща общо съобщение за грешка:

 kinetic(,3)
   kinetic(,3)
     |
 Error: Expression or statement is incorrect--possibly unbalanced (, {, or [.

Не знам как да поправя това. Опитах да заменя аргументите на isempty с arg1 или arg2, но нямаше значение. След това се опитах да копирам примерния код на http://www.mathworks.co.uk/help/matlab/ref/error.html, но пак не помогна.

Как се генерират конкретни грешки за функции на няколко променливи?

Знам, че това е доста основен въпрос, всяка помощ ще бъде оценена.


person user78655    schedule 12.10.2014    source източник
comment
kinetic(,3) е просто невалиден синтаксис на Matlab. Не можете да пишете това.   -  person Oliver Charlesworth    schedule 12.10.2014


Отговори (1)


Има няколко проблема с вашия код:

  1. Синтаксисът на сигнатурата на функцията е

    въведете описание на изображението тук

    (Квадратните скоби не са задължителни, ако функцията има само един изход.) Тук kinetic е изходът на вашата функция, докато KE е името на функцията; следователно извикването на вашата функция има формата

    KE(m,v)
    

    не

    kinetic(m,v)
    
  2. Функцията isempty е предназначена само да открие дали даден масив (а в MATLAB всичко е 2D масив по подразбиране) е празен или не. Не можете да го използвате, за да откриете дали при повикване на функция липсват аргументи.

  3. Както беше посочено от Оливър, KE(,v) не е правилен синтаксис на MATLAB и MATLAB ще спре и ще уведоми потребителя за нейната грешка, преди да се опита да обработи извикването на функцията.

Това, което вероятно искате да направите тук, е да дефинирате променлива функция, т.е. функция, която може да приема различен брой аргументи. Използвайте varargin и nargin за това; за повече подробности вижте тези в помощта на MATLAB.

И накрая, вероятно искате

  • векторизирайте функцията си, т.е. направете я съвместима с векторни входове, като използвате оператори за въвеждане (.* и .^),
  • предотвратява отпечатването на резултатите в командния прозорец, като завършва всички изрази за присвояване с точка и запетая.

function kinetic = KE(varargin)

if nargin == 0
    error('No mass or velocity given')
elseif nargin == 1
    error('No velocity given (argument 2)')
elseif nargin == 2
    m=varargin{1};
    v=varargin{2};
else
    error('Too many inputs')
end

KE = 0.5*m.*v.^2;
fprintf('The kinetic energy is %d joules\n', KE)
person jub0bs    schedule 12.10.2014
comment
Страхотно, това и отговорът на Оливърс изясниха всичко. Сега изглежда толкова просто! - person user78655; 12.10.2014