Порядок определения и вызова функций
В первой главе данного пособия был показан порядок определения собственных функций в программе MatLab. В данном параграфе остановимся на более подробном описании программирования пользовательских функций.
Синтаксис для определения собственных функций в MatLab имеет следующий вид:
function [ RetVal1, RetVal2,… ] = FunctionName( arg1, arg2,… )
<тело функции>
где RetVal1, RetVal2,... – набор возвращаемых значений функцией (результаты работы); arg1, arg2,... – набор входных аргументов; тело функции – набор операторов (программа), которые выполняются при вызове функции.
Рассмотрим пример реализации функции для вычисления евклидового расстояния:
function length = euqlid(x1, y1, x2, y2)
length = sqrt((x1-x2)^2+(y1-y2)^2);
Продемонстрируем возможность возвращения нескольких параметров на примере вычисления ширины и высоты прямоугольника, заданного координатами левого верхнего угла (x1,y1) и правого нижнего (x2,y2):
function [width, height] = RectangleHW(x1,y1,x2,y2)
width = abs(x1-x2);
height = abs(y1-y2);
Данную функцию можно записать еще и с таким набором параметров:
function [width, height] = RectangleHW(P1, P2)
width = abs(P1(1)-P1(2));
height = abs(P2(1)-P2(2));
где P1 и P2 – векторы (массивы) размером в 2 элемента и описывают точку в двумерном пространстве. В этом случае при вызове функции, значения координат точек можно передавать таким образом:
[W, H] = RectangleHW([0 0], [10 20]);
Если же программист сделает ошибку и при вызове функции передаст неверный размер вектора, например, так
[W, H] = RectangleHW(0, [10 20]);
то выполнение функции завершится с ошибкой и выполнение всего алгоритма остановится. Чтобы избежать этой ситуации MatLab позволяет проводить проверку корректности переданных аргументов и корректно завершать работу функции без остановки работы всего алгоритма. Следующий пример записи функции демонстрирует работу такой проверки:
function [width, height] = RectangleHW(P1, P2)
if length(P1) < 2 | length(P2) < 2
error( 'Bad 1st or 2nd parameter' );
end
width = abs(P1(1)-P1(2));
height = abs(P2(1)-P2(2));
При выполнении данной функции с неверными параметрами, функция выдаст сообщение об ошибке в командное окно MatLab, но программа продолжит свою работу.
Предложенная проверка осуществляет контроль за корректностью переданных аргументов. Однако важной является также проверка числа переданных входных аргументов и числа возвращаемых значений функцией. Например, если вместо двух аргументов, был передан только один, то функция ошибочно завершит свою работу. Аналогично, если функция ожидает возврата трех аргументов, в то время как она определена лишь для двух, то также возникнет ошибочная ситуация.
Для проверки числа переданных аргументов и числа ожидающих возвращаемых значений используются переменные nargin и nargout. Ниже приведен пример функции, использующей проверку корректности числа входных и выходных аргументов.
function [width, height] = RectangleHW(P1, P2)
if nargin ~= 2
error( 'Bad number of parameters' );
end
if nargout ~= 2
error( 'Must be 2 return values' );
end
if length(P1) < 2 | length(P2) < 2
error( 'Bad 1st or 2nd parameter' );
end
width = abs(P1(1)-P1(2));
height = abs(P2(1)-P2(2));
При этом проверки корректности параметров функции будут срабатывать в следующих ситуациях:
[W, H] = RectangleHW([0 0]); % Bad number of parameters
[W, H, V] = RectangleHW([0 0], [10 20]); % Must be 2 return
% values
[W, H] = RectangleHW(0, [10 20]); % Bad 1st or 2nd parameter
Область видимости переменных
Следует отметить, что переменные, объявленные внутри функций, имеют область видимости только в пределах функции, и за ее пределами уже не доступны (не видны). Следующий пример программы демонстрирует механизм области видимости имен переменных в MatLab:
function MyFunc
x = 10;
disp(x);
MyFunc2();
function MyFunc2()
disp(x);
В результате на экране будет отображено
10
??? Undefined function or variable 'x'.
Этот пример показывает, что переменная с именем x, объявленная в функции MyFunc, не доступна в функции MyFunc2. Это сделано с расчетом, чтобы переменные в разных функциях не влияли друг на друга даже если они имеют одни и те же имена. Однако в некоторых случаях требуется, чтобы переменная была видна за пределами функции, в которой объявлена. Это достигается путем обращения к переменной как к глобальной с помощью ключевого слова global, за которым следует имя глобальной переменной. Перепишем пример, представленный выше с использованием глобальной переменной:
function MyFunc
x = 10;
disp(x);
MyFunc2();
function MyFunc2()
global x;
disp(x);
Обратите внимание, что ключевое слово global написано в функции MyFunc2 и говорит о том, что переменная x уже объявлена ранее и нужно ее использовать внутри текущей функции.
Глава 5. Работа с файлами в MatLab
Создание программ часто предполагает сохранение результатов расчетов в файлы для их дальнейшего анализа, обработки, хранения и т.п. В связи с этим в MatLab реализованы различные функции по работе с файлами, содержащие данные в самых разных форматах. В этой главе рассмотрим наиболее полезные функции для сохранения и загрузки результатов работы алгоритмов из файлов.
Функции save и load
В самом простом случае для сохранения и последующей загрузки каких-либо данных в MatLab предусмотрены две функции
save <имя файла> <имена переменных> % сохранение данных
load <имя файла> <имена переменных> % загрузка данных
Функция save позволяет сохранять произвольные переменные программы в файл, который будет (по умолчанию) располагаться в рабочем каталоге (обычно поддиректория work) и иметь расширение mat. Соответственно функция load позволяет загрузить из указанного mat-файла ранее сохраненные переменные. Ниже представлен пример использования данных функций:
function save_load
x = ones(5);
y = 5;
s = 'hello';
save params x y s;
x = zeros(5);
y = 0;
s = '';
load params x y s;
disp(x);
disp(y);
disp(s);
В данной программе сначала выполняется инициализация переменных x, y, s, затем, они сохраняются в файл params.mat, заменяются другими значениями и после загрузки отображаются на экране. При выполнении этой программы на экране будут показаны те же значения переменных, которые они принимали в самом начале. Таким образом демонстрируется работа функций save и load.
Следует обратить внимание, что функция load позволяет загружать из mat-файла не все, а только указанные программистом переменные, например
load params x; % загружает только значение переменной x
load params y; % загружает только значение переменной y
load params x s; % загружает значения переменных x и s