Сделай Сам Свою Работу на 5

Создание и выполнение скриптов в MATLAB

В предыдущих разделах все примеры выполнялись в режиме командной строки, когда команда выполняется сразу же после ее ввода. Такой режим удобен, если нужно быстро проверить как работает та или иная функция или рассчитать небольшую задачу. Недостатком такого режима является то, что при перезапуске среды MATLAB последовательность команд не сохраняется нигде кроме окна истории, которое не предназначено для постоянного хранения последовательности команд. Для больших задач, а также для задач, которые нужно запускать на выполнение несколько раз, удобнее сохранить последовательность действий в так называемый скрипт (script). Скрипты сохраняются в файлы с расширением .m, которые в документации иногда называются m-файлы (m-files).

Скрипты представляют собой обычные текстовые файлы, которые можно создавать и редактировать в любом текстовом редакторе, который позволяет сохранять текст без служебной информации, но в среде MATLAB уже есть встроенный текстовый редактор, специально предназначенный для программирования на языке MATLAB.

Для того чтобы создать скрипт и открыть его в редакторе MATLAB, нужно в главном меню выбрать пункт File - New - Script или нажать кнопку "New Script" на панели инструментов ( ). При этом откроется окно, показанное на рисунке 3.1.

 

Рис. 3.1.

 

Другой способ создания нового скрипта состоит в использовании команды edit в окне "Command Window. В этом случае можно создать файл с заданным именем, передавая имя скрипта как параметр:

 

>> edit myscript.m

 

Если файл myscript.m уже существует в текущей директории (текущая директория - это директория, в которой MATLAB ищет файлы, указанные только по имени без указания полного пути, текущая директория показана в окне "Current Folder"), то он будет открыт во встроенном редакторе, в противном случае MATLAB предложит создать файл с таким именем.

Встроенный редактор MATLAB – довольно удобный инструмент, который заметно облегчает написание и исправление больших программ. Среди особенностей редактора можно отметить:

· раскраска синтаксиса языка MATLAB;

· подсветка парных скобок;

· подсказки параметров функций во всплывающем окне (Рис. 40);

· встроенный отладчик;

· подсветка ошибок по мере набора текста программы без запуска скрипта на выполнение.

Скрипты представляют собой последовательности тех же самых команд, которые использовались выше (с той лишь разницей, что в скриптах не нужно набирать строку приглашения командного режима >>). Например, скрипт, созданный на основе одной из последовательностей команд предыдущего раздела, будет выглядеть следующим образом:

 

clear

 

% Верхний левый график

[x1, y1] = meshgrid (-2: 0.1: 2, -2: 0.1: 2);

f1 = x1 .^ 2 + y1 .^ 2;

subplot (2, 2, 1)

surf (x1, y1, f1)

 

% Верхний правый график

x2 = -10: 0.05: 10;

f2 = sinc (x2 / pi);

subplot (2, 2, 2)

plot (x2, f2)

grid on

 

% Нижний график

x3 = -10: 0.01: 10;

f3 = exp (-(x3 .* x3));

subplot (2, 1, 2)

plot (x3, f3)

 

Внешний вид редактора, в котором был набран этот текст, показан на рисунке 40.

 

Рис. 3.2.

 

Для того, чтобы запустить этот скрипт на выполнение, нужно выбрать пункт меню Debug - Run... (вместо многоточия будет указано имя файла скрипта), нажать одноименную кнопку на панели инструментов ( ), или нажить горячую клавишу F5. Дальнейшие примеры будут предполагать, что они запускаются в виде скрипта, поэтому символы приглашения командного режима (>>) будут отсутствовать, хотя те же самые команды можно последовательно набирать и в командном режиме.

Так как длинные команды плохо читаются, то рекомендуется их всегда разбивать на несколько строк. Обычно считается, что строка программы не должна превышать 80 символов (это число появилось еще во времена текстовых терминалов, когда на экране по горизонтали умещалось только такое количество символов). Поэтому в редакторе MATLAB даже проведена вертикальная линия на ширине 76 символов, за которую не желательно выходить.

Так как транслятор считает, что каждая команда заканчивается символом переноса строк (или конца файла), это накладывает ограничение на разбиение длинной команды на две строки. Для того чтобы сообщить транслятору, что команда будет продолжена на следующей строке, используется оператор "..." (три точки). Например, если нужно команду

 

[x1, y1] = meshgrid (-2: 0.1: 2, -2: 0.1: 2);

 

разбить на две строки, чтобы повысить ее удобочитаемость, это можно сделать следующим образом:

 

[x1, y1] = meshgrid (-2: 0.1: 2, ...

-2: 0.1: 2);

 

В MATLAB, как и в других языках программирования, есть несколько управляющих конструкций для организации проверки условий, чтобы иметь возможность выполнять различные действия в зависимости от заданных условий, а также операторы для организации циклов.

Оператор for

Оператор for предназначен для организации цикла, в котором некоторая переменная поочередно принимает значения из заданной последовательности чисел. Синтаксис оператора for выглядит следующим образом:

 

for index = values

Последовательность команд

end

 

Здесь values задает последовательность, элементы которой поочередно присваиваются переменной index. Наиболее очевидное применение оператора for состоит в переборе последовательности чисел с равным шагом, когда values задается в виде firstvalue: step: lastvalue.

Пусть, например, требуется построить серию графиков для ряда значений a. В этом случае скрипт может выглядеть следующим образом:

 

% Создание новой фигуры

figure;

 

% "Заморозим" фигуру, чтобы графики добавлялись в окно,

% и не затирали друг друга

hold on

 

% Интервал по оси X, на котором строится график

x = -5: 0.01: 5;

 

% Переменная alpha изменяется в интервале [0.5; 3] с шагом 0.5

for alpha = 0.5: 0.5: 3

% Расчет очередного графика

y = exp (-(x .^ 2) / alpha);

 

% Рисование очередного графика

plot (x, y)

end

 

% "Разморозим" график

hold off

 

Результат выполнения этого скрипта показан на рисунке 3.3.

 

Рис. 3.3.

 

Если значение a должно изменяться с шагом 1 (например, в интервале от 1 до 3), то цикл можно было бы записать следующим образом:

 

% Переменная alpha изменяется в интервале [1; 3] с шагом 1

for alpha = 1:3

% Расчет очередного графика

y = exp (-(x .^ 2) / alpha);

 

% Рисование очередного графика

plot (x, y)

end

 

Так как в операторе for справа от знака присваивания находится обычная матрица (в данных примерах одномерная), то переменная a может принимать последовательно любые значения, не обязательно отстоящие друг от друга на равный шаг. Например, цикл можно было бы написать следующим образом:

 

% Переменная alpha принимает следующие значения: 1, 3, 10, 3.5, 12

for alpha = [1, 3, 10, 3.5, 12]

% Расчет очередного графика

y = exp (-(x .^ 2) / alpha);

 

% Рисование очередного графика

plot (x, y)

end

 

Не обязательно матрицу значений создавать в самом операторе for. Следующий пример показывает, что значения для цикла можно брать из заранее подготовленной матрицы.

 

% Создание новой фигуры

figure;

 

% "Заморозим" фигуру, чтобы графики добавлялись в окно,

% и не затирали друг друга

hold on

 

% Интервал по оси X, на котором строится график

x = -5: 0.01: 5;

 

% Значения, которые будет принимать переменная alpha

values = [1, 3, 10, 3.5, 12];

 

for alpha = values

% Расчет очередного графика

y = exp (-(x .^ 2) / alpha);

 

% Рисование очередного графика

plot (x, y)

end

 

% "Разморозим" график

hold off

 

Циклы могут быть вложенные один в другой. Для демонстрации этой возможности ниже приведен скрипт, который строит рисунок 38.

 

figure

 

% Количество строк

rowcount = 3;

 

% Количество столбцов

colcount = 5;

 

% Цикл по столбцам

for col = 1:colcount

% Цикл по строкам

for row = 1: rowcount

% Расчет номера графика

index = (row - 1) * colcount + col;

 

% Создание графика

subplot (rowcount, colcount, index)

 

% Преобразование номера в строку

label = num2str (index);

 

% Вывод текста с размером шрифта 20 и

% горизонтальным выравниванием по центру

text (0, 0, label, 'FontSize', 20, ...

'HorizontalAlignment','center')

 

xlim ([-1 1])

ylim ([-1 1])

end

end

 

Можно заметить, что поведение оператора for в MATLAB отличается от поведения одноименного оператора в таких языках как Pascal, Delphi, C, C++ (до стандарта C++ 11), C# и соответствует скорее оператору foreach в языке C# или оператору for в языке Python.

 

Логические операции

В MATLAB нет специального булевого типа переменных, в качестве булевого значения «Истина» могут выступать все числа, не равные 0 (как правило, используется 1), в качестве значения «Ложь» используется 0.

В таблице 3.1 перечислены некоторые логические операторы и функции.

Таблица 3.1

Логический оператор (функция) Описание
> Больше (поэлементное сравнение)
>= Больше или равно (поэлементное сравнение)
< Меньше (поэлементное сравнение)
<= Меньше или равно (поэлементное сравнение)
== Равно (поэлементное сравнение)
~= Не равно (поэлементное сравнение)
&& Логическое И (применяется для двух матриц, размером 1x1)
& Логическое поэлементное И (применяет логическое И для каждого элемента матриц, стоящих слева и справа от оператора &)
|| Логическое ИЛИ (применяется для двух матриц, размером 1x1)
| Логическое поэлементное ИЛИ (применяет логическое ИЛИ для каждого элемента матриц, стоящих слева и справа от оператора |)
~ Логическая поэлементная инверсия (НЕ)
xor Поэлементное исключающее ИЛИ
any Возвращает 1, если в матрице, переданной в качестве параметра, есть хотя бы один не нулевой элемент. В противном случае, функция возвращает 1.
all Возвращает 1, если в матрице, переданной в качестве параметров, все элементы не нулевые. В противном случае функция возвращает 0.
isequal Возвращает 1, если матрицы, переданные в качестве параметров этой функции равны (две матрицы A и B называются равными, если они имеют одинаковое число строк и столбцов и их соответствующие элементы равны).

В следующем примере демонстрируется работа некоторых логических операторов.

 

>> 3 == 3

 

ans =

 

>> 3 == 4

 

ans =

 

>> 2 >= 3

 

ans =

 

>> 5 < 10

 

ans =

 

>> 1 ~= 2

 

ans =

 

>> 1 && 0

 

ans =

 

>> 1 && 1

 

ans =

 

>> 1 || 0

 

ans =

 

>> xor (1, 1)

 

ans =

 

>> ~1

 

ans =

 

Особенностью перечисленных операторов в языке MATLAB является то, что почти все они (за исключением && и ||) являются поэлементными. При применении этих операторов к двум матрицам одинаковой размерности в качестве результата будет получена матрица той же размерности, каждый элемент которой будет получен применением логического оператора к двум соответствующим элементам исходных матриц. Например:

 

>> [1 2 3] > [0 5 -6]

 

ans =

1 0 1

 

>> [1 2 3; 4 5 6; 7 8 9] == [1 0 2; 9 8 6; 1 1 1]

 

ans =

1 0 0

0 0 1

0 0 0

 

>> [1 1 0 0] & [0 1 0 1]

 

ans =

0 1 0 0

 

>> xor ([1 1; 0 0], [0 1; 0 1])

 

ans =

1 0

0 1

 

Работа функций any, all и isequal продемонстрирована в следующем примере.

>> all ([1 1 1 1])

 

ans =

 

>> all ([1 1 0 1])

 

ans =

 

>> any ([1 1 0 1])

 

ans =

 

>> any ([0 0 0 0])

 

ans =

 

>> any ([0 1 0 0])

 

ans =

 

>> A = [1 2 3 4];

>> B = [1 3 4 4];

>> C = [1 2 3 4];

>> isequal (A, B)

 

ans =

 

>> isequal (A, C)

 

ans =



©2015- 2017 stydopedia.ru Все материалы защищены законодательством РФ.