Операторы выполняются до тех пор, пока в коде не встретится следующее ключевое слово: case, либо otherwise, либо end. Необязательный опера-
тор otherwise предлагает альтернативу для случая по умолчанию – когда переменная выбора не принимает предложенных значений.
Оператор цикла типа for…end используется для организации вычислений
с заданным числом повторяющихся итераций. Конструкция такого оператора имеет вид
for v=М
операторы end
Параметр М – это чаще всего вектор. В большинстве случаев он представляется с использованием оператора перечисления «:» в виде s:d:e, где s – начальное значение управляющей переменной цикла (v); d – приращение этой переменной; e – конечное значение управляющей переменной. На каждом шаге цикла переменная v последовательно принимает значения, соответствующие компонентам вектора М. Цикл выполняется до тех пор, пока v<=d.
Возможен также вариант, когда М – не вектор, а матрица. Тогда цикл будет работать иначе: на каждом шаге управляющая переменная будет вектором, последовательно совпадающим со столбцами матрицы М. В этом случае в цикле будет столько шагов, сколько имеется столбцов в указанной матрице.
Оператор цикла типа while выполняется до тех пор, пока выполняется условие, указанное в заголовке:
while условие операторы
end
Если есть необходимость в досрочном прерывании выполнения цикла, используется оператор break. Оператор continue досрочно возобновляет цикл. Вне циклов слова continue и break не применяются.
Подробную справку по любой функции или оператору можно получить,
введя команду help имя_функции/оператора.
4.2. Функции пользователя
Создание функций позволяет организовать алгоритм модульной структуры, локализовать часто выполняющиеся операции с разными наборами входных данных, распределить области видимости переменных.
16
Файлы-функции в языке MATLAB обязательно начинаются с объявления function, после которого указывается имя переменной (или имена нескольких переменных) – выходного параметра, имя самой функции и список ее входных параметров.
Все переменные, используемые в теле файла-функции, являются локальными, т. е. действуют только в пределах тела функции. При этом переменные общего рабочего пространства внутри функции не видны.
Структура файла-функции с одним выходным параметром выглядит следующим образом:
function var=f_name(список_параметров) заголовок
%Основной комментарий
%Дополнительный комментарий
Тело функции, состоящее из любой совокупности операторов var=выражение
Замечания: 1. Оператор var=выражение (и сама переменная var) используются в тех случаях, когда требуется, чтобы функция возвращала некоторый результат.
2. Если выходных параметров больше одного, то необходимо использовать конструкцию типа
function [var1, var2, …] = f_name(список_параметров)
В теле функции должны быть проинициализированы все выходные параметры.
3. Имя функции f_name, указанное в определении функции, может не совпадать с именем файла, но вызов функции будет осуществляться по имени файла. Для лучшей читаемости программы рекомендуется назначать одинаковыми имена файлов и функций в описании (функция должна соответствовать файлу f_name.m).
Как уже было сказано, в файлах-функциях используются локальные переменные. Но наряду с ними нередко возникает необходимость в использовании данных, находящихся в рабочем пространстве MATLAB, или передача данных из одной функции в другую не через выходные параметры. В этих случаях используется понятие глобальных переменных, объявляемых командой
global var1 var2 …;
Чтобы несколько программных модулей могли совместно использовать глобальную переменную, ее идентификатор должен быть объявлен как global
17
во всех этих модулях. Если в функции будут использоваться общие переменные, их необходимо также объявить глобальными в функции.
Внутри файла-функции также допускается описывать и вызывать другие функции, называемые локальными. Программный модуль будет иметь вид
function val = func(var1, var2)
%осн. комментарий
%доп. комментарий xl = sub_func(var1)
операторы
val = выражение
end
val = sub_func(x1) val = выражение
end
Функция sub_func локальная для функции func. Другим функциям и программным модулям локальная функция будет недоступна. При этом у локальной функции область видимости своя, отличающаяся от области видимости «старшей» функции. При наличии локальных функций для обозначения тел функций необходимо писать ключевое слово end.
Кроме файлов-функций в MATLAB также различают файлы-сценарии. Они не имеют ключевого слова function, используют общую область переменных. В прежних версиях пакета MATLAB не допускалось размещение локальных функций внутри сценариев, но в последних версиях такая возможность реализована.
4.3. Индексация матриц
Пакет MATLAB специально предназначен для обработки матриц, или многомерных массивов. Операции над матрицами, реализуемые в других языках с помощью дополнительных библиотек, в MATLAB – встроенные.
Как видно из постановки задачи курсового проекта, информацию о графах удобно хранить в виде матриц, например в виде матрицы смежности и матрицы весов. В то же время, рассмотренные алгоритмы обработки графов не содержат операций над матрицами. Зато многие действия в указанных алгоритмах связаны с получением и обработкой индексов матриц. Рассмотрим возможности MATLAB, связанные с индексацией матриц.
18
При обращении к элементам матриц можно использовать один индекс вместо двух. В памяти матрицы хранятся по столбцам, поэтому увеличение индекса соответствует направлению сверху вниз по первому столбцу, затем по второму, и т. д. Взаимный переход между линейной и матричной (по строкам
истолбцам) индексацией осуществляется функциями sub2ind() и ind2sub().
Вкачестве индексов матрицы можно указывать не только целые числа, но также векторы или матрицы, состоящие из целых чисел. Такая индексация называется блочной, поскольку ее результат – матрица, блоком входящая в индексируемую:
A1 |
= 2:2:20; |
% A1 = [2 4 6 8 10 12 14 16 18 20] |
B1 |
= A1(1:2:9); |
% B1 = [2 4 10 14 18] |
C1 = B1([2 4]): |
% C1 = [4 14] |
|
При обращении к матрицам можно применять индексы типа logical, т. е. имеющие два значения: «истина» (true или 1) и «ложь» (false или 0). При этом элементы с индексами, соответствующими значению «ложь», будут удалены из матрицы:
A2 |
= 1:9; |
% A2 |
= [1 2 3 4 5 6 7 8 9] |
|
B2 |
= A2 > 6 | A2 < 3: % |
B2 = [1 1 0 0 0 0 1 1 1] |
||
C2 = A2(B2); |
% |
C2 |
= [1 2 7 8 9] |
|
Функция find() позволяет определить индексы ненулевых элементов для аргумента числового типа либо индексы истинных элементов, если аргумент относится к логическому типу. Данную функцию можно использовать, чтобы найти индекс элемента матрицы по его значению:
A3 = [1 2 3; 4 5 6; 7 8 9]; |
|
ind = find(A3 == 6); |
% ind = 8 – линейный индекс элемента |
|
% со значением 6 в матрице A3 |
[i, j] = ind2sub(size(A3), ind); |
% i = 2, j = 3 – матричный индекс элемента |
4.4. Функции ввода-вывода в MATLAB
При разработке программы необходимо предусмотреть способы получения исходных данных и вид представления результатов обработки этих данных. Типовыми источниками информации для программы служат средства ввода (клавиатура, мышь) или файлы. Результаты обработки данных могут выводиться на экран в виде текста и графики, а также в файлы различных форматов. Рассмотрим функции MATLAB для ввода и вывода данных.
Функция input(‘prompt’) позволяет ввести с клавиатуры любые данные, в соответствии с синтаксическими правилами языка программирования
19
MATLAB. Таким способом можно задавать числа, матрицы, выражения, даже вызывать функции, которые в текущем состоянии программы вычисляемы. Если при вызове функции input указать второй параметр ‘s’, данные, задаваемые с клавиатуры, воспринимаются как последовательность символов – вектор-строка.
Вывод на экран осуществляет функция disp(x), в качестве аргумента могут быть указаны любые однотипные данные – числа, матрицы, строки символов, а также структуры. Если необходимо вывести на экран комбинированные данные, например сочетание текста и числовых значений, нужно использовать функцию форматного вывода в строку sprintf(). Данная функция формирует строку, которую затем можно вывести стандартной функцией disp().
Обратная функция sscanf() позволяет считать произвольные данные из строки символов.
Для обмена информацией с файлами (чтение и запись) существует много различных функций, их список можно получить, введя в командном окне команду help iofun. Рекомендуется использовать функции форматного чтения и записи fscanf() и fprintf(), аналогичные рассмотренным выше sscanf() и sprintf(). Для работы с функциями форматного чтения и записи требуется создать идентификатор файла в MATLAB с помощью функции fopen(). После окончания операций чтения и записи его необходимо освободить с помощью функции fclose():
fileid1 = fopen(‘my_file1.txt’, ‘r’); % открытие файла для чтения fileid2 = fopen(‘my_file2.txt’, ‘w’); % открытие файла для записи
A = fscanf(fileid1, ‘%d’, inf); % считывание целых чисел из файла fprintf(fileid2, ‘%d’, A); % запись целых чисел из матрицы А в файл fclose(fileid1); % закрытие файла my_file1.txt
fclose(fileid2); % закрытие файла my_file2.txt
Примечание. Функция fprintf без указания идентификатора файла осуществляет вывод форматированной строки в командное окно.
Средства графического вывода в MATLAB объединены в целую графическую подсистему. Простейшей функцией для вывода двумерного графика является функция plot(). Оформление графического окна (вывод сетки, подписи осей и т. д.) осуществляется функциями grid, title, xlabel, ylabel, subplot, hold, legend и др. Пример программы вывода на экран нескольких графиков представлен далее, соответствующий график показан на рис. 3.1.
20