1.5.5. Два вида m-файлов: скрипты и функции
Все m-файлы, содержащие исходные коды на языке MATLAB, делятся на два типа: файлы-сценарии и файлы-функции.
Файлы-сценарии (или script-файлы) являются просто записью серии команд, которые могли бы быть набраны и выполнены в командном окне MATLAB. Главная их особенность состоит в том, что файлы-сценарии не имеют входных и выходных параметров. В них используются переменные из общего рабочего пространства MATLAB. В процессе выполнения они не компилируются в двоичный код. Обычно файл-сценарий имеет следующую структуру:
% Основной комментарий
% Дополнительный комментарий
Тело скрипта, состоящее из любой совокупности операторов.
Основным комментарием является первая строка текстовых комментариев, а дополнительным – последующие строки. Основной комментарий выводится при выполнении команд lookfor и «help имя_каталога». Полный комментарий выводится при выполнении команды «help имя_файла».
Замечание: так же, как и при работе в командном окне MATLAB, если в m-файле в конце какой-либо строки с вычислениями не поставить знак «;» (точка с запятой), то результат этих вычислений выведется в окне MATLAB.
М-файл типа «функция» является типичным элементом языка программирования MATLAB. Файлы-функции обязательно начинаются с объявления function, после которого указывается имя переменой (или имена нескольких переменных) – выходного параметра, имя самой функции и список ее входных параметров.
Все переменные, используемые в теле файла-функции, являются локальными, т.е. действуют только в пределах тела функции. При этом переменные общего рабочего пространства внутри функции не видны.
При обнаружении файла-функции, он компилируется в промежуточный двоичный код и затем исполняется, а указанный код хранится в рабочей области системы MATLAB. Подобное сохранение позволяет избежать повторной компиляции при последующих вызовах функции, что существенно экономит время вычислений.
Правила вводов комментариев те же, что у файлов-сценариев.
Структура файла-функции с одним выходным параметром выглядит следующим образом:
function v=f_name(список_параметров) заголовок
% Основной комментарий
% Дополнительный комментарий
Тело функции, состоящее из любой совокупности операторов
var=выражение
Замечание 1: оператор v=выражение (и сама переменная v) используются в тех случаях, когда требуется, чтобы функция возвращала некоторый результат.
Замечание 2: Если выходных параметров больше одного, то необходимо использовать конструкцию типа: function [var1, var2, …]=f_name(список_параметров). Если функция, имеющая несколько выходных параметров, входит в состав математического выражения, то для выполнения вычислений в выражении будет использоваться первый из выходных параметров. Для получения значения всех выходных параметров функции ее необходимо вызывать в виде:
[res1, res2, …]=f_name(список_параметров);
В состав функций (но не скриптов!) можно включать встроенные функции (подфункции). Они объявляются и записываются в теле основных файлов и имеют конструкцию, идентичную основной функции. Пример функции с подфункциями:
function [avg,med] = newstats(u) основная функция
% NEWSTATS Find mean and median
% with internal functions.
n = length(u);
avg = mean(u,n);
med = median(u,n);
function a = mean(v,n) подфункция
% Calculate average.
a = sum(v)/n;
function m = median(v,n) подфункция
% Calculate median.
w = sort(v);
if rem(n,2) == 1
m = w((n+1)/2);
else
m = (w(n/2)+w(n/2+1))/2;
end;
Подфункции определены и действуют только в пределах основного m-файла. Поэтому их имена могут совпадать с именами любых других функций системы.
Как было сказано выше, в файлах-функциях используются локальные переменные. Но наряду с ними нередко возникает необходимость в использовании данных, находящихся в рабочем пространстве MATLAB, или передача данных из одной функции в другую не через выходные параметры. В этих случаях используется понятие глобальных переменных, описываемых командой
global var1 var2 …;
Здесь переменные var1 и var2 определены как глобальные. Чтобы несколько программных модулей могли совместно использовать глобальную переменную, ее идентификатор должен быть объявлен как global во всех этих модулях. Если в функции и подфункциях должны использоваться общие переменные, их необходимо также объявить глобальными как в функции, так и в ее подфункциях.
При написании программного кода на языке MATLAB целесообразно учитывать следующие практические рекомендации.
1. При написании программ желательно «векторизовывать» алгоритмы, т.е. преобразовывать циклы for и while с использованием векторов или матриц. Это значительно ускоряет работу программы. Например, один из способов получения вектора с компонентами, являющимися синусом 0 до 10 с шагом 0.001 (10001 компонент) реализуется фрагментом
i = 0;
for t = 0:.001:10
i = i+1;
y(i) = sin(t);
end
С использованием векторов эту же операцию можно выполнить иначе:
t = 0:.001:10;
y = sin(t);
При этом второй фрагмент будет выполняться значительно быстрее: для первого случая время составляет приблизительно 4 секунды (процессор Pentium-III 600MHz). Во втором случае временные затраты на вычисление, оцениваемые специальными функциями MATLAB tic и toc, практически равны нулю.
2. Время выполнения программного кода можно также значительно уменьшить, если заранее задавать размерности используемых массивов. При этом MATLAB освобождается от необходимости постепенного увеличения размерности, за счет чего и происходит экономия времени. Кроме того, это также помогает предотвратить фрагментацию памяти при работе с большими массивами данных. Например,
y = zeros(1,100)
for i = 1:100
y(i) = det(X^i);
end
выполнится намного быстрее, чем
for i = 1:100
y(i) = det(X^i);
end
Еще более показательным является следующий пример
y = zeros(1,10000)
for i = 1:10000 for i = 1:10000
y(i) = i^2; y(i) = i^2;
end end
0.109999 сек 3.68 сек