Программы-сценарии (скрипты) и функции

 

Программы-сценарии (скрипты) в MATLAB используют рабочую область программы, из которой они были вызваны, что можно использовать для передачи параметров скриптам. Например напишем скрипт, вычисляющий гипотенузу прямоугольного треугольника:

% скрипт, вычисляющий гипотенузу прямоугольного треугольника

% a, b - катеты прямоугольного треугольника

% с - вычисляемая гипотенуза

 

% промежуточные расчеты

x = a^2 + b^2;

 

% вычисляем гипотенузу

c = sqrt(x);

Пример использования данного скрипта:

>> a = 3;

>> b = 4;

>> hypScr

>> c

c =

>> x

x =

То есть, вызванные из консоли переменные a и b были созданы в базовой рабочей области. Далее из консоли вызывается программа-сценарий (скрипт) hypScr, которая в базовой рабочей области создаст переменные с и х, используя ранее созданные переменные а и b.

У данного подхода имеются следующие недостатки:

· необходимо заранее создать переменные с заранее заданными именами (a, b);

· после вычислений появится ненужная переменная x;

· все четыре переменные (a, b, c и x) могут использоваться в коде ранее и в них могут уже содержаться данные, которые нельзя терять, поэтому неосторожное использование скриптов может привести к возникновению ошибок.

Этих недостатков лишены функции:

function c = hypFun( a, b )

% функция, вычисляющая гипотенузу прямоугольного треугольника

% a, b - катеты прямоугольного треугольника, скаляры

% с - вычисляемая гипотенуза, скаляр

 

% промежуточные расчеты

x = a^2 + b^2;

 

% вычисляем гипотенузу

c = sqrt(x);

 

end

Пример использования данной функции:

>> a = 2; % некие важные данные, которые нужно сохранить

>> x = 3; % некие важные данные, которые нужно сохранить, со скриптом это не получится

>> c = hypFun(3,4)

c =

>> a

a =

>> x

x =

Так как функция создает свою рабочую область, переменные а и х, содержащиеся в базовой рабочей области, переопределены не будут.

Передача параметров по значению

 

В MATLAB параметры всегда передаются по значению. Передача по значению означает, что вызывающая функция копирует в рабочую область функции непосредственное значение параметра. Изменение копии переменной, соответственно, оригинал не затрагивает.

Приведем пример. Функция demoTrFun:

function [ ] = demoTrFun( x )

% демонстрация передачи параметров по значению

 

% увеличим переменную x

x = x + 5;

 

end

Демонстрация использования данной функции:

>> x = 0; % создадим переменную x

>> demoTrFun(x); % вызовем тестовую функцию, чтобы показать передачу по значению

>> x % покажем, что действительно была передана копия переменной x (x не должна изменится)

x =

 

Проверка корректности входных переменных

 

Как правило, функция должна выполнять проверку корректности своих параметров. В случае, если параметры имеют некорректное значение, функция должна каким-то образом сообщить об этом вызывающей программе. В MATLAB как правило используется функция error, принимающая самом простом случае текст, описывающей ошибку, и прерывающая работу текущей функции и, если ошибка не перехвачена, то и работу программы. Приведем пример использования функции error:

function [ res ] = myGCD( a, b )

% вычисление наибольшего общего делителя чисел a и b

 

% проверка, что числа a и b не имеют дробных частей

if a ~= round(a) || b ~= round(b)

error('Входные аргументы должны быть целыми');

end

 

while a ~= b

if a > b

a = a - b;

else

b = b - a;

end

end

 

% сохранить результат в выходную переменную

res = a;

 

end

Пример использования этой функции:

>> myGCD(78, 66)

ans =

 

 

>> myGCD(32, 48.5)

Error using myGCD (line 6)

Входные аргументы должны быть целыми

 

 

Анонимные функции

 

В MATLAB существует еще один вид функций, так называемые анонимные функции. Эти функции не имеют файла определения, а лишь ассоциированы с переменной, имеющей тип function_handle. Обращение к анонимным функциям (АФ) производится с помощью данных переменных.

Создадим АФ, вычисляющую квадрат числа:

>> sqr = @(x) x.^2;

Теперь квадрат 5 можно вычислить следующим образом

>> sqr(5)

ans =

 

Ограничением для функций является то, что при определении тела АФ может быть использовано только одно выражение. Внутри АФ могут вызываться другие функции, в том числе и другие анонимные. Нельзя использовать управляющие конструкции условия и цикла.

При написании тела функции могут использоваться переменные, уже существующие в рабочем пространстве. Значения данных переменных будут сохранены в определении АФ и использоваться независимо от своих глобальных определений. Даже если вы удалите переменные после того, как определили АФ, значения данных переменных будут использованы при выполнении функции.

>> a = -1.3; b = .2; c = 30;

>> parabola = @(x) a*x.^2 + b*x + c;

>> clear a b c

>> x = 1;

>> y = parabola(1)

 

y =

31.5000

 

Если есть необходимость изменить значения используемых переменных, то придется создать АФ заново.

>> a = -1.3; b = .2; c = 30;

>> parabola = @(x) a*x.^2 + b*x + c;

>> a = -3.9; b = 52; c = 0;

>> parabola = @(x) a*x.^2 + b*x + c; % Создание АФ с новыми значениями a, b, c

>> x = 1;

>> y = parabola(1)

 

y =

48.1000

 

Сравнения таких объектов MATLAB, как скрипт, функция и анонимная функция, приведено в таблице 3.1.

 

 

Таблица 3.1. Сравнение программ-сценариев, функций и анонимных функций

  Объявление Вызов Рабочая область Где хранится
Программа-сценарий (скрипт) Построчное написание       name base Файл с расширением .m
Функция function []=name()   end []=name() function Файл с расширением .m
Анонимная функция name=@(x)f(x) a=name() function Переменная типа function_handle