Программы-сценарии (скрипты) и функции
Программы-сценарии (скрипты) в 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 |