Программы-сценарии (скрипты) в 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) могут использоваться в коде ранее и в них могут уже содержаться данные, которые нельзя терять, поэтому неосторожное использование скриптов может привести к возникновению ошибок.
<p>Этих недостатков лишены функции:
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 ab
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 |
Статьи к прочтению:
- Программы тестирования на оценку личных качеств кандидатов на занятие должностей правоохранительной службы
- Программный принцип работы компьютера
03 Написание программы MATLAB
Похожие статьи:
-
Тема 3.4.М-файлы и программирование средствами MatLab Основные понятия и средства программированиям в MatLab M-файлы, программ и функций Работа с…
-
Объявление (или описание) функции в программе.
Вопрос Вопрос Пример: Если или Вопрос mkdir команда для создания новых каталогов$ mkdir имя_каталогаилиmkdir имя_каталога1 имя_каталога2 имя_каталога3…