ПГУ ТиИ – Лабораторный практикум – Управление вычислительными потоками

1 Цель работы
Изучение способов организации ветвлений и циклов в програм-мах MATLAB/Octave.
Изучение способов векторизации программ.
2 Теоретический материал
Также, как и в других языках программирования в программах, написанных в MATLAB/Octave существует возможность управления вычислительными потоками. Для этого используются операторы управления, к которым относят операторы ветвлений и операторы циклов.
Организация ветвлений
Ветвления программы можно организовать с помощью услов-ных операторов и оператора переключений.
К условным операторам относятся операторы if (если), else (иначе), elseif (иначе если) и end (конец), которые могут использо-ваться в виде нескольких конструкций:
1) if условие
операции end
В этой конструкции допускается вложение операторов if, при этом необходимо следить, чтобы каждый из них имел соответствую-щий оператор end.
2) if условие
операции else
операции end.
3) if условие1
операции elseif условие 2
операции else
операции end.
Может быть интересно
О. Л. Куляс, К. А. Никитин
_____________________________________________________________
Наибольшими возможностями обладает третья конструкция в которой можно организовать большое количество ветвей вычислений.
При использовании ветвлений нужно помнить следующее:
– область действия условного оператора заключена между ключевыми словами if и end;
– вычисляется условие, которое может быть задано в виде вы-ражения (expression) оператора if;
– если условие истинно, то выполняются операции (statesments), которые записаны после строки if ;
– если условие ложно, то операции после if пропускаются и управление передается следующему оператору. В конструкции 1) это будет оператор end, в конструкции 2) это будет оператор else, а в кон-струкции 3) – оператор elseif, который инициирует проверку дополни-тельных условий.
Пример: создать и проанализировать трехмерный массив А. Ес-ли число матриц (страниц) в массиве отлично от 3, вывести в команд-ное окно число матриц. Если число матриц равно 3, объединить их по вертикали и вывести в командное окно.
%===example_1========================================
V = randi([2 5],1); %задать число матриц трехмерного массива
% в виде случайного целого диапазона 2…5
A = rand([5,5,V]); %создать трехмерный массив из случайных
% чисел размером 5х5 с числом страниц V
[m n v] = size(A); %вычислить размеры массива А
%====организация ветвлений=============================
if v~=3 %если число матриц А не равно 3 disp([‘Number of matrices V= ‘,num2str(V)])%вывести сообщение % в командное окно
end %и завершить
if v == 3 %если число матриц А равно 3
B=cat(1,A(:,:,1),A(:,:,2),A(:,:,3))%объединить матрицы по вертикали
end %и завершить
В рассмотренном примере задача решена при помощи 1-й кон-струкции, рассмотренной выше. Отметим также, что для вывода ре-зультата в командное окно используется команда disp, которая не должна завершаться точкой с запятой (;).
Решение этой же задачи с помощью 2-й конструкции иллюстри-рует программа example_2:
45
Обработка изображений средствами MATLAB/Octave
_____________________________________________________________
%===example_2========================================
V=randi([2 5],1); %задать число страниц массива в виде
%случайного целого
A=rand([5,5,V]); %создать случайный массив размером 5х5
%с числом страниц V
[m n v]=size(A); %вычислить размеры массива А
%====организация ветвлений============================
if v~=3 % если число матриц А не равно 3 disp([‘Number of matrices V= ‘,num2str(V)])%вывести сообщение %в командное окно
else %иначе
B=cat(1,A(:,:,1),A(:,:,2),A(:,:,3))%объединить матрицы по %вертикали
end %и завершить
Можно заметить, что выполнение операций, указанных после ключе-вого слова else производится без проверки условий.
Использование третьей конструкции рассмотрим на примере решения следующей задачи: создать и проанализировать трехмерный массив А. Если число матриц (страниц) в массиве равно 3, объединить их по горизонтали и вывести в командное окно. Если число матриц равно 2, объединить их по вертикали и вывести в командное окно. В противном случае вывести сообщение с указанием числа матриц в массиве (см. example_3).
%===example_3========================================
V=randi([2 5],1); %задать число страниц массива в
%виде случайного целого
A=rand([5,5,V]); %создать случайный массив размером 5х5
% с числом страниц V
[m n v]=size(A); %вычислить характеристики массива А
%====организация ветвлений============================
if v==3 %если число матриц равно 3
B=cat(2,A(:,:,1),A(:,:,2),A(:,:,3))%объединить матрицы
%по горизонтали
elseif v==2 %если число матриц равно 2
B=cat(1,A(:,:,1),A(:,:,2)) %объединить матрицы по вертикали
else %иначе
disp([‘Message V= ‘,num2str(V)]) %вывести сообщение
end %и завершить
46
О. Л. Куляс, К. А. Никитин
_____________________________________________________________
Еще одним оператором ветвления является оператор переклю-чения. Конструкции этого оператора используют ключевые слова switch (переключить), case (случай) и otherwise (иначе): switch выражение case значение 1
операции case {значение 2, значение 3, …}
операции
… otherwise
операции end
С помощью переключения можно сделать выбор среди не-скольких возможных вариантов продолжения вычислений. Эта конст-рукция создает группу выполняемых операций, основываясь на вели-чинах переменных и выражений:
– вначале вычисляется скалярное числовое значение выраже-ния;
– результат вычислений последовательно сравнивается с набо-ром значений, являющихся операндами case – значение 1, значение 2 и т.д. Фигурные скобки используются если несколько значений объеди-няются в одну группу;
– в случае совпадения с одним из значений выполняются опера-ции, указанные ниже;
– если совпадений нет, то выполняются операции указанные по-сле otherwise.
Необходимо отметить, что строк с ключевым словом case мо-жет быть несколько, а с ключевым словом otherwise только одна.
Пример example_4 поясняет применение оператора переключе-ния для решения простой задачи распознавания вводимого с клавиату-ры числа и вывода сообщения о результатах.
%===example_4=======================================
n = input(‘Enter a number: ‘); %запросить ввод числа n %в командной строке
switch n
case -1 %в случае, если число n= -1
disp(‘negative one’) %вывести сообщение
case 0 %в случае, если число n= 0
47
Обработка изображений средствами MATLAB/Octave
_____________________________________________________________
disp(‘zero’) %вывести сообщение
case 1 %в случае, если число n= 1 disp(‘positive one’) %вывести сообщение
otherwise %иначе disp(‘other value’) %вывести сообщение
end %завершить
Организация циклов
Циклические вычисления в MATLAB организуются с помощью операторов цикла. В зависимости от способа определения выхода из цикла различают две конструкции – for (для) и while (пока).
Цикл for повторяет цикл предписанное число раз, изменяя па-раметр цикла (index) от начального (start) до конечного (end) с задан-ным шагом (step): for index = start:step:end операции
end.
Цикл while выполняет операции, указанные в теле цикла до тех пор, пока выражение истинно (не равно 0):
while выражение
операции
end.
Рассмотрим несколько примеров циклических вычислений, ко-торые часто используются при обработке изображений. В примере example_5 создается вектор-строка из случайных целых чисел, вычис-ляется сумма элементов этого вектора и результат выводится в ко-мандное окно:
%====example_5==организация циклов ======================
%вычислить сумму S элементов вектора A
A=randi(10,1,8); %создать вектор-строку из 8-и случайных % целых чисел диапазона 0 – 10
S=0; %начальное значение суммы
for i=1:8; %организуем цикл с числом повторений 8 S=S+A(i); %накапливаем сумму
end
disp([‘Summ S= ‘,num2str(S)]) %вывести результат в окно
Здесь в качестве переменной цикла выступают индексы элементов i вектора А, которые начинаются с 1 и изменяются до 8 с шагом 1. При каждом выполнении тела цикла совершается единственная операция –
48
О. Л. Куляс, К. А. Никитин
_____________________________________________________________
добавление очередного элемента вектора к значению суммы S, причем начальное значение суммы должно быть нулевым (это нужно сделать до начала цикла).
Следующий пример (example_6) показывает решение задачи вычисления суммы элементов матрицы из случайных чисел диапазона 0 …1,0 размером RxC. Здесь требуется организация двух циклов – цикла по строкам и вложенного в него цикла по столбцам исходной матрицы В:
%====example_6==организация циклов ======================
B = rand(5,5); %создать матрицу 5х5 из случайных чисел
%диапазона 0…1
[R C] = size(B); % вычислить размеры матрицы В
SS=0; %начальное значение суммы
for r=1 : R %организовать цикл по всем строкам
for c=1 : C %и столбцам матрицы
SS=SS+B(r,c); %подсчитать сумму
end
end
disp([‘Summ SS= ‘,num2str(SS)]) %вывести результат в окно
Обратите внимание, что конечные значения переменных цикла вычис-ляются с помощью функции
[R C] = size(B),
которая возвращает в переменные R и C размеры матрицы B.
Еще один пример (example_7) демонстрирует решение задачи вычисления суммы S1 только тех элементов матрицы D, значения ко-торых отвечают условию 5 < D(r,c) < -5 и суммы остальных элементов S2:
%====example_7==организация циклов ======================
D = randi([-10 10],5,4) %создать матрицу из случайных целых
%диапазона -10…10
[R C] = size(D); % вычислить размеры матрицы D
S1= 0; %начальное значение суммы 1
S2= 0; %начальное значение суммы 2
for r = 1: R %организовать цикл по всем строкам
for c = 1: C %и столбцам матрицы
if D(r,c) > 5 %если элемент >5,
S1=S1+D(r,c); %просуммировать и перейти на end, %иначе продолжить
49
Обработка изображений средствами MATLAB/Octave
_____________________________________________________________
elseif D(r,c)<-5 %если элемент <-5,
S1=S1+D(r,c); %просуммировать и перейти на end,
%иначе продолжить else %еще
S2=S2+D(r,c); %просуммировать и перейти на end end end
end
Необходимо отметить, что задание условий можно выполнить более компактно с помощью логических операторов MATLAB. Так в рассматриваемом примере проверку двух условий 5 < D(r,c) < -5, можно реализовать в одной строке используя логическое сложение ‘|’.
if D(r,c)>5 | D(r,c)<-5 %если элемент >5 или <-5.
Векторизация циклов
Под векторизацией следует понимать преобразование циклов for и while в эквивалентные векторные и матричные операции, кото-рые выполняются значительно быстрее. Это особенно актуально при обработке изображений, матрицы которых могут иметь число элемен-тов исчисляющиеся миллионами.
Принцип векторизации поясним следующими примерами:
В example_8 решается задача вычисления значений одномерной функции f(x) = Acos(x) для значений аргумента x = 0,…,2pi, изменяю-щегося с шагом 0,1. Для организации циклов используем for:
1 %===example_8=======================================
2 %вычислить функцию f(x) = Acos(x) для x=0,0.1,0.2,…,2pi
3 %используем цикл for==================================
4 A = 5; %задать значение А
5 i=0; %задать начальное значение индекса i
6 for x = 0: 0.1: 2*pi %переменная цикла
7 i=i+1; %индекс элементов вектора результата
8 f(i) = A*cos(x); %вычислить очередное значение
%и записать его в вектор результата
9 end %завершить
Результатом выполнения этой программы будет вектор f из 63 вычис-ленных значений функции. Строки 5 и 7 обусловлены тем, что индек-
50
О. Л. Куляс, К. А. Никитин
_____________________________________________________________
сы этого вектора начинаются с 1, являются целочисленными и изме-няются с шагом 1.
Для решения этой же задачи с помощью векторизации, нужно единожды создать вектор аргументов х, который и использовать при вычислении функции. Это реализовано ниже в программе example_9:
%===example_9========================================
%вычислить функцию f(x) = Acos(x)для x=0,0.1,0.2,…,2pi
%используя векторизацию================================
A=5; %задать значение А
x = 0: 0.1: 2*pi; %создать вектор аргументов
f = A*cos(x); %вычислить вектор значений функции
Сравнивая два рассмотренных решения, можно заметить, что число команд в example_9 сократилось до трех.
Для векторизации вычислений с двумерными матрицами, тре-буется каждый из аргументов представлять в виде векторов. Рассмот-рим задачу, которая часто решается в обработке изображений – орга-низовать сканирование матрицы f размерами MxN прямоуголь-ным окном размерами mxn. На каждом шаге сканирования нужно выполнить операцию копирования элементов матрицы f, покрывае-мых окном и сохранения их в новую матрицу результата s. Подсчи-тать количество шагов перемещения окна при сканировании. Решим эту задачу двумя способами. В example_10 приведено решение с по-мощью традиционной организации циклов for :
1 %===example_10======================================
2 %выполнить сканирование тестовой матрицы f окном размерами %mxn и скопировать содержимое каждого окна в новую матрицу s
3 %rx, cy – координаты левого верхнего угла окна по строкам и
%столбцам
4 %count – счетчик числа операций перемещения окна
5 clc, clear;
6 M = 100; %задать размер
7 N = 100; %тестовой матрицы
8 f = randi(10,M, N); %и сформировать ее
9 m =3; %задать размер окна
10 n = 3;
11 s = zeros(M,N); %сформировать матрицу результата
12 rx = 1; %задать начальное положение
13 cy = 1; %окна
51
Обработка изображений средствами MATLAB/Octave
_____________________________________________________________
14 xcount = 0; %сбросить счетчик проходов по строкам
15 %используем циклы for ==============================
16 for r = rx: M-m+1; %менять координату окна по строкам шаг 1
17 xcount = xcount + 1; %увеличить счетчик по строкам на 1
18 ycount = 0; %сбросить счетчик проходов по столбцам
19 for c = cy: N-n+1; %менять координату окна по столбцам шаг 1
20 ycount = ycount +1; %увеличить счетчик по столбцам на 1
21 s(xcount, ycount) = f(r,c); %записать содержимое окна в матрицу
%результатов
22 end
23 end
24 count=xcount*ycount; %общее количество операций
%перемещения окна
В программе example_11 используется векторизация циклов. Для этого создается два вектора аргументов r = rx: M-m+1 (строка 14) и c = cy: N-n+1 (строка 15), которые используются для выполнения матричных операций (строка 16).
1 %===example_11======================================
2 %выполнить сканирование тестовой матрицы f окном размерами mxn и скопировать содержимое каждого окна в новую матрицу s
3 %rx, cy – координаты левого верхнего угла окна по строкам и %столбцам
4 %используем векторизацию кода==========================
5 clc, clear;
6 M = 100; %задать размер
7 N = 100; %тестовой матрицы
8 f = randi(10,M, N); %и сформировать ее из случайных чисел
9 m =3; %задать размер окна
10 n = 3;
11 s = zeros(M,N); %сформировать пустую матрицу результата
12 rx = 1; %задать начальное положение
13 cy = 1; %окна
14 r = rx:M-m+1; %создать вектор изменения координат по строкам
15 c = cy:N-n+1; %создать вектор изменения координат по столбцам
16 s = f(r,c); %записать содержимое окна в матрицу результатов S
17 count = size(s, 1)*size(s, 2); %количество операций перемещения
Сравнение приведенных программ показывает, что векторизо-ванный исходный код значительно меньше по объему. Однако главное 52
О. Л. Куляс, К. А. Никитин
_____________________________________________________________
достоинство векторизации – значительное повышение скорости вы-числений.
Еще одним приемом для повышения скорости вычислений яв-ляется предварительное заполнение массивов, которые будут исполь-зоваться в программе. В рассмотренных выше программах это созда-ние массива результатов s:
s = zeros(M,N); %сформировать матрицу результата.
Такой прием позволяет заранее, с помощью одной команды создать массив, с которым в дальнейшем можно выполнять необходимые мат-ричные операции.
Использование встроенного отладчика
Для проверки работы созданных программ в MATLAB исполь-зуется встроенный в редактор EDITOR отладчик. Запустить загру-женную программу на выполнение можно в нескольких режимах:
1) Выбрав на панели управления опцию пуск (“Run”). При этом происходит пуск программы с первой до последней команды, обнару-женные ошибки выводятся в окно команд.
2) Режим с остановами в контрольных точках (“Breakpoints”), предполагает приостановку выполнения программы в точках останова, которые должны быть расставлены заранее. Для расстановки кон-трольных точек нужно, перемещаясь по строкам загруженной про-граммы, использовать выпадающее меню опции “Breakpoints” или клавишу F12. Удалить контрольную точку также можно через меню “Breakpoints” или клавишей F12.
После того как контрольные точки расставлены можно запус-тить программу опцией “Run”. Программа будет выполняться до пер-вой контрольной точки. Продолжение выполнения программы можно организовать несколькими способами:
– пуск до следующей контрольной точки – опция продолжить “Continue”;
– выполнить следующий шаг – опция “Step”;
– выполнить до курсора – опция “Run to cursor”.
Отметим, что использование отладчика в режиме с остановками в контрольных точках является эффективным средством отладки про-грамм.
53
Обработка изображений средствами MATLAB/Octave
_____________________________________________________________
3 Подготовка к работе
3.1 Ознакомиться с теоретическим материалом и рекомендованной литературой.
3.2 Подготовить ответы на контрольные вопросы.
4 Задание на выполнение работы
Создать и отладить программы, решающие задачи согласно за-даниям ниже.
Задание 1
Создать и отладить две программы для решения нижеперечис-ленных задач. Первая использует традиционную организацию циклов (for, while). Вторая использует векторизацию. Исходные данные нахо-дятся в таблице 3.1.
1) Создать матрицу FMxN из случайных чисел заданного диапа-зона.
2) Выполнить с элементами созданной матрицы операции, со-гласно вариантам задания.
3) Результаты расчетов вывести в командное окно.
4) Проанализировать работу программ в пошаговом режиме и объяснить результаты.
Задание 2
Создать и отладить программу для решения задач, перечислен-ных ниже. Исходные данные находятся в таблице 3.2.
1) Создать матрицу IMxN из случайных чисел заданного диапа-зона.
2) Выполнить сканирование созданной матрицы прямоуголь-ным окном размера mxn. На каждом шаге сканирования нужно выпол-нить операцию с элементами матрицы I, покрываемых окном, и запи-сать результаты в новую матрицу результата G на указанное место.
3) Подсчитать общее количество шагов сканирования.
4) Проанализировать работу программ в пошаговом режиме и объяснить результаты.
5 Требования к отчёту
Отчёт должен содержать:
– титульный лист с указанием названия ВУЗа, кафедры, номе-ра и темы лабораторной работы, а также номера зачетной книжки, ва-рианта и ФИО студента, подготовившего отчёт;
– цель выполняемой работы;
– задания;
– ответы на все контрольные вопросы лабораторной работы;
– результаты выполнения задания, листинги всех составлен-ных программ с обязательными комментариями.
6 Контрольные вопросы
6.1. Для чего необходимо применять ветвления программы? С по-мощью каких операторов организуются ветвления?
6.2. Какие конструкции применяются для организации ветвлений по условиям?
6.3. Каким образом можно организовать проверку нескольких усло-вий?
6.4. Каким образом можно организовать число ветвей вычислений больше двух?
6.5. С помощью каких операторов языка MATLAB могут быть зада-ны условия?
6.6. Каким образом производится обращение к нужному элементу двумерной матрицы?
6.7. Каким образом производится обращение к нужному элементу трехмерного массива?
6.8. Как можно определить размер массива?
6.9. Что означают первое, второе и третье измерения массива?
6.10. Каким образом можно выполнить объединение матриц по гори-зонтали или вертикали?
6.11. Что подразумевается под термином страница (page) массива?
6.12. Каким образом можно выполнить объединение страниц масси-ва?
6.13. Как можно организовать вывод сообщения в командное окно?
6.14. Как можно организовать вывод вычисляемых значений в ко-мандное окно?
6.15. Какие команды используются для создания векторов и матриц из случайных чисел?
6.16. Поясните принцип построения конструкций ветвления с помо-щью оператора переключения.
56
О. Л. Куляс, К. А. Никитин
_____________________________________________________________
6.17. Каким образом можно организовать приглашение и ввод значе-ний с клавиатуры?
6.18. Какие конструкции используются в MATLAB для организации циклов?
6.19. Для чего используются переменные цикла и как она задается?
6.20. Как организовать циклические вычисления с одномерным и двумерным массивами?
6.21. Какие способы используются для ускорения вычислений в MATLAB?
6.22. Что понимается под векторизацией вычислений и как она орга-низуется?
6.23. Каким образом можно организовать отладку программ в остано-вом в контрольных точках?
6.24. Каким образом можно организовать отладку программ в поша-говом режиме?
6.25. Необходимость использования и основные компоненты М-функций. Основные правила создания, сохранения и вызова М-функций?
7 Рекомендуемая литература
Matlab и Simulink – сообщество пользователей, материалы, кни-ги, форум [Электронный ресурс] – Режим доступа: http://matlab.exponenta.ru, свободный. – Загл. с экрана.
Дьяконов, В. П. MATLAB 6.5 SP1/7/7 SP1 + Simulink 5/6. Рабо-та с изображениями и видеопотоками [Текст] / В. П. Дьяконов. – М.: СОЛОН-Пресс, 2005. – с.116…137, 154…155.
Гонсалес, Р. Цифровая обработка изображений в среде MATLAB [Текст] / Р. Гонсалес, Р. Вудс, С. Эддинс. – М.:Техносфера, 2006. – с.28…78.
Солонина, А. И. Цифровая обработка сигналов. Моделирование в MATLAB [Текст] / А. И. Солонина, С. М. Арбузов. – СПб.: БХВ-Петербург, 2008. – 816 с.
Здравствуйте. Скажите пожалуйста, планирую поступать в магистратуру на факультет Психологии « Психология личности»в РГГУ скажите пожалуйста, есть ли у вас, ответы на вступительные экзамены? так как, планирую, сделать акцент на бюджет. Спасибо.
Арсений, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Дистанционная помощь в защите ВКР
Анастасия, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Здравствуйте. Нужна срочно практическая часть вкр, третья глава. Скину похожие работы, на которые можно ориентироваться
Александр, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
вкр по теме: экологический туризм России : анализ состояния, проблемы и перспективы
Людмила, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Здравствуйте вы защищаете ВКР?
Ольга, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Написать магистерскую ВКР на тему «Совершенствование логистических бизнес-процессов на примере торговой компании». Не менее 100 страниц.
Миша, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Здравствуйте нужна работа Вкр
Лена, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Написать ВКР 3 раздела Тема строительство строительство жилого дома с применением каркасно-монолитных технологий Антиплагиат от 75% ПЗ и чертежи
Владимир, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.