Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1-2 Моделирование / Matlab. Практический подход. Самоучитель

.pdf
Скачиваний:
765
Добавлен:
31.01.2021
Размер:
12.72 Mб
Скачать

Глава 2. Графика в Matlab

Рис. 2.56. Считанное из файла изображение

Рис. 2.57. Изображение масштабировано под размер графического окна

101

Самоучитель Matlab

Рис. 2.58. Изображение отображено в правильном масштабе

В соответствии с командой axis image масштабирование для рисунка устанавливается в соответствии с его размерами (в пикселях).

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

>>[M N k]=size(B)

M =

1140

N =

2964

k =

3

>>for i=1:M

for j=1:N B(i,j,2)=0; B(i,j,3)=0; end

end

>>image(B)

>>axis image

102

Глава 2. Графика в Matlab

После выполнения этих команд в графическом окне отображается картинка, как на рис. 2.59.

Рис. 2.59. Для изображения установлен "красный фильтр"

С помощью функции size() определяются размеры массива, указанного аргументом функции. Результат функции – вектор из трех элементов. Первый элемент определяет количество пикселей в столбце, второй – в строке рисунка. Третий всегда равен трем (три составляющие цвета в формате RGB). Поэтому после выполнения команды [M N k]=size(B) в переменную M записывается значение размера (в пикселях) по вертикали, а в переменную N записывается размер (в пикселях) по горизонтали. Затем в двойном вложенном операторе цикла элементы массива B, отвечающие содержанию зеленого и синего цвета, обнуляются.

103

Глава 3 Элементы программирования

Мы здесь по такому делу, в котором ошибиться нельзя.

К/ф "Клуб самоубийц, или Приключения титулованной особы"

В режиме командного окна (то есть путем ввода и выполнения отдельных команд в командном окне) можно решать многие задачи. Но на практике такой подход не очень эффективный, особенно если необходимо выполнять существенные объемы вычислений. Другими словами, важно иметь возможность выполнять быстро и просто определенные фрагменты кода, причем весьма желательно вводить этот код один раз, а выполнять столько, сколько нужно. Разумеется, такая возможность в Matlab есть. Базируется она на использовании так называемых m-файлов. Это файлы с программным кодом, или командами для выполнения, если хотите. В нужном месте и в нужное время на соответствующий файл в командном окне выполняется ссылка, и в результате весь код (то есть команды), записанный в соответствующий файл, будет выполнен так, как если бы он вводился в командную строку при пошаговых вычислениях. В подобных случаях говорят об использовании сценариев. О них дальше и будет идти речь.

На заметку

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

Создание сценариев

Пусть это будет естественный отбор, но ускоренно и заботливо направляемый.

В. Черномырдин

В самом простом варианте сценарий в Matlab – это набор команд, занесенных в файл с расширением .m. В принципе, для создания сценария можно воспользоваться обычным текстовым редактором, набрать в нем код команд по правилам синтаксиса Matlab и сохранить файл с расширением .m (только нужно правильно выбрать каталог или прописать к нему путь, чтобы при вызове сценария приложение могло найти соответствующий m-файл). Однако удобнее воспользоваться встроенным редактором m-файлов, который есть в Matlab.

104

Глава 3. Элементы программирования

В известном смысле сценарий – этот обычный набор команд, которые выполняются одна за другой последовательно, как они указаны в файле. При вызове сценария его имя (точнее, имя соответствующего файла без расширения) указывается в командной строке рабочей области. Эта аналогия становится особенно уместной, если учесть, что в Matlab в сценариях не используются локальные переменные. Другими словами, все переменные в сценариях глобальные, поэтому доступны в пределах всего рабочего пространства: от непосредственно командной строки до любых других сценариев и функций.

На заметку

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

Для создания m-файла достаточно выбрать команду File New M-File в главном меню окна приложения Matlab. В результате открывается редактор m-файлов, в рабочей области которого вводятся команды. На рис. 3.1 представлено окно редактора m-файлов с набором введенных туда команд.

Рис. 3.1. Окно редактора m-файлов с командами

Файл сохранен с названием SinX.m. Непосредственно в файле записаны следующие команды:

x=-4*pi:0.01:4*pi; y=sin(x)./x; plot(x,y,'b-','LineWidth',2)

title('Plot for function y(x)=sin(x)/x') xlabel('x')

ylabel('sin(x)/x') grid on

Их последовательное выполнение в командном окне привело бы к созданию графика функции y(x) = sin(x x) на интервале значений аргумента

105

Самоучитель Matlab

−4π x ≤ 4π . При этом на графике отображается заголовок, подписи у координатных осей и координатная сетка. Кривая отображается сплошной линией синего цвета толщины 2. То же происходит, если в командной строке рабочей области ввести и выполнить всего одну команду:

>> SinX

В результате создается график функции, представленный на рис. 3.2.

Рис. 3.2. График функции создан в результате выполнения сценария

В том, что все использованные в сценарии переменные являются глобальными, достаточно легко убедиться. Для этого после команды вызова сценария в рабочей области проверяем значения первых элементов векторов x и y, как показано на рис. 3.3.

Хотя ни вектор x, ни вектор y непосредственно в рабочей области не определялись, они здесь доступны и им присвоены значения – во время выполнения сценария в соответствии с выполнявшимися при этом командами.

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

106

b=abs(ans); a=-b; step=b/50; x=a:step:b; y=sin(x)./x; plot(x,y,'r--o') grid on

Окно редактора m-файлов с этим кодом представлено на рис. 3.4.

В сценарии переменной b в качестве значения присваивается модуль системной переменой ans (команда b=abs(ans)). Переменной а командой a=-b присваивается такое же по модулю, но отрицательное значение, а переменная step по-

Глава 3. Элементы программирования

Рис. 3.3. Все переменные в сценарии являются глобальными

Рис. 3.4. Окно редактора m-файлов с кодом сценария

лучает значение step=b/50. Вектор x формируется командой x=a:step:b и представляет собой набор узловых точек на симметричном интервале, а шаг дискретности равен 1/100 от длины интервала. Вектор y формируется командой y=sin(x)./x и представляет собой набор значений рассматривавшейся выше функции в узловых точках. Наконец, командой plot(x,y,'r--o') строится график функции (красная штрихованная линия с маркерами в виде кругов). Командой grid on на графике отображается координатная сетка.

После того, как m-файл с кодом сценария создан, в рабочей области выполняем следующие команды (ввод пользователя выделен жирным шрифтом):

>>8*pi ans =

25.1327

>>SinX2

107

Самоучитель Matlab

На рис. 3.5 представлено рабочее окно с введенными в него командами.

Рис. 3.5. Окно рабочей области с командами пользователя

После выполнения команды 8*pi значение получает системная переменная ans. Поэтому когда следующей командой SinX2 вызывается соответствующий сценарий, в результате его выполнения получаем график, как на рис. 3.6.

Рис. 3.6. Результат выполнения команд и вызова сценария

sin(x)

В данном случае график строится для функции y(x) = x на интерва-

ле значений аргумента −8π x ≤ 8π (в соответствии со значением системной переменной ans).

108

Глава 3. Элементы программирования

Образно выражаясь, в последнем примере в сценарий был передан своеобразный аргумент – системная переменная ans. Это не очень удачный способ передачи аргументов. Обычно в случае, если для выполнения кода необходимо передать аргумент (или аргументы), определяют функцию пользователя.

На заметку

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

Функции пользователя

Есть еще время сохранить лицо.

В. Черномырдин

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

function [результат1,результат2,...]=имя_функции(аргумент1,аргумент2,...)

После ключевого слова function в квадратных скобках перечисляются переменные, в которые записываются результаты функции. Затем следует оператор присваивания и имя функции. После имени функции в круглых скобках через запятую перечисляются переменные - аргументы функции. Если результат у функции один, квадратные скобки можно не использовать. Если функция результат не возвращает (может быть и такое), переменные результата вообще не указываются: после ключевого слова function следует имя функции и список аргументов. Для начала рассмотрим самый простой случай, когда у функции один аргумент и результат она не возвращает. Редактор m-файлов с кодом такой функции представлен на рис. 3.7.

Код у функции следующий:

function nums(n) step=n/5; 0:step:n

109

Самоучитель Matlab

Рис. 3.7. Окно редактора m-файлов с кодом функции nums()

У функции nums() один аргумент, и она не возвращает результат. В результате выполнения функции на экране появляется шесть числовых значений: от 0 до значения аргумента функции n с равным интервалом изменения, который определяется локальной переменной step=n/5. Здесь еще раз подчеркнем, что все переменные, использованные в функции, являются локальными. Поэтому в данном случае переопределения встроенной функции step() не происходит.

При сохранении m-файла с кодом функции его название должно совпадать с именем функции. В данном случае функция записана в файл nums.m. Результат использования созданной функции показан на рис. 3.8.

Рис. 3.8. Результат использования функции пользователя nums()

Рабочая область содержит такие команды и результат их выполнения (жирным шрифтом выделены команды пользователя):

>> nums(10)

ans =

2

4

6

8

10

0

>> nums(-6.2) ans =

0

-1.2400 -2.4800 -3.7200 -4.9600

-6.2000

110