Скачать 235.9 Kb.
|
Лабораторная работа №1: Интерфейс среды MATLAB и основы программирования. На этом занятии мы остановимся на следующих пунктах:
MATLAB является языком программирования высокого уровня для выполнения технических и научных вычислений [Гонсалес, Вудс]. В нем интегрированы вычисления, визуализация и программирование в удобной для пользователя среде. Типичный набор действий включает:
После установки среды выполним ее запуск несколькими способами:
Приведем описание интерфейса среды MATLAB 7.7 (R2008b). Рис.1. Интерфейс среды MATLAB 7.7 (R2008b)
Рис.2. Редактор массивов (изменение значение переменной x) Элементы окна рабочего пространства позволяют создать новую переменную, открыть редактор, импортировать данные(среда позволяет сохранять результаты вычисления в файлах специального формата), строить графики переменных, удалять переменные.
История команд остается в памяти среды до тех пор, Пока мы не выполним очистку (Clear Command History).
Рис.3. Элемент интерфейса Current Directory.
Рис.4. Развернутое меню Start. В меню Desktop (Рабочий стол) можно добавлять или удалять окна среды, наиболее важные окна показаны на иллюстрации. Рис.5. Меню настройки рабочего стола (Desktop) Нажимая каждый пункт в меню, проследите, как изменится вид интерфейса среды. В пункте Desktop Layout можно выбрать, какое вид будет у рабочего стола – по умолчанию, оставить только окно команд, окно истории команд и т.п. Все файлы среды MATLAB, создаются в редакторе, одновременно являющимся отладчиком программ. Для вызова редактора нужно выбрать либо одну из команд меню FileNew либо, например, набрать в окне команду: >>edit new_ex. Рис.6. Окно редактора m-файлов После того, как мы описали интерфейс среды MATLAB, перейдем к изучению принципов программирования в среде MATLAB. Элементарным объектом, с которым мы работаем, является переменная. Определение. Переменная – имеющий имя объект, который способен хранить различные данные (числа, строки, одномерные и двумерные массивы). Имя переменной может начинаться с большой или маленькой буквы, запоминается максимум 31 символ в имени переменной, остальные символы игнорируются. Имя должно начинаться с буквы, может содержать буквы, цифры и символ подчеркивания _. Недопустимо включать в имена переменных пробелы и специальные знаки, например +,.-, *, /. Из-за этого могут возникнуть проблемы при вычислении выражений. В среде MATLAB основной структурой данных является массив. Любая переменная представляется в виде двумерного массива (минимальный размер такого массива – 1), в ячейку записывается значение переменной. Выделяется два типа основных массивов: одномерный (вектор) и двумерный (матрица). Также выделяют массивы ячеек (cell array), строковые массивы (char array) и логические массивы (logical array). На этом этапе мы будем работать с обычными одномерными и двумерными массивами (numeric array). В окне команд после приглашения >> введем вектор: >>A = [2 34 5 2 3 4 6 7 8 -1 2]; (если убрать точку с запятой, то введенный массив отобразится в окне команд). Рис.7. Ввод одномерного массива в среде MATLAB 7.7 В окне рабочего пространства появилась переменная A, в которую записаны элементы массива A. Мы можем увидеть информацию о введенной переменной (имя – Name, значение – Value, минимум – Min, максимум – Max). Если мы щелкнем дважды по переменной A, то появится редактор массивов (Array Editor): Рис.8. Окно «Array Editor» - редактор массивов Здесь можно редактировать значения элементов введенного массива: изменять содержимое ячеек массива, менять размер (поля Size), изменять формат представления данных ячеек массива. Задайте самостоятельно еще три одномерных массива различной размерности. Далее перейдем к способам задания двумерных массивов. Ввод для обработки двумерных массивов осуществляется аналогичным образом. Например, введем матрицу Дюрера (пример магического квадрата): >>A1 = [16 3 2 13; 5 10 11 8; 9 6 7 12;4 15 14 1]; Обратите внимание, что строки массива отделяются точкой с запятой. В результате получим квадратную матрицу размера 4x4, являющуюся магическим квадратом. Рис.9. Матрица Дюрера В среде MATLAB матрицы, не являющиеся квадратными, можно вводить следующим образом: >>A2 = [0]; - массив будет состоять из одной ячейки, в которой запишется 0. Вызовем редактор массивов для переменной A2, зададим размер массива и введем значения ячеек массива вручную (матрицы): Рис.10. Заполнение значений массива с помощью Array Editor В окне команд напишем >>S=5. Вызовем редактор массивов для переменной и убедимся, что она представляет собой двумерный массив размерности 1. Эту переменную мы будем использовать для вспомогательных вычислений. Если при записи команды мы забыли указать переменную, в которую сохраним результат вычислений, то значение выражения запишется в переменную ans (введем, например, 2+sin(4)): Рис.10. Переменная ans Введите еще несколько своих массивов и проверьте их на последующих примерах. Все примеры с основными алгоритмическими структурами проверяйте на введенных вами массивах. Фактически мы написали ans = 2+sin(4). Переменная хранит результат вычисления значения самого последнего введенного нами выражения, если мы не определили нужную переменную. Выполните очистку окна команд, введя >>clc. Очистка рабочего пространства происходит с помощью команды >>clear. Иногда рабочее пространство нужно сохранить на диск для последующей работы. Для этого нужно выполнить команду File Save WorkSpace As и выбрать папку для сохранения. Рабочие пространства хранятся в формате mat-файлов. Чтобы импортировать рабочее пространство в систему, нужно нажать на кнопку Import Data в окне рабочего пространства и выбрать файл. Появится окно, в котором необходимо задать параметры импорта: Рис.11. Задание параметров импорта Нажав кнопку Finish, в окне рабочего пространства среды MATLAB мы увидим выбранные переменные (можно оставить все, а можно снять галочку с тех переменных, которые не нужны в данный момент). Таким Кроме задания массивов, необходимо уметь выполнять их обработку. Важной операцией является определение длины одномерного массива и размерности матрицы. Длину вектора можно определить с помощью следующей команды: >>B = length (A); В переменную B запишется значение количества элементов введенного одномерного массива. Определите длину заданных вами массивов. Для определения размерности двумерного массива используется команда size: >>S = size(A2); под A2 подразумевается двумерный массив, который вы задали. Рис.12. Размерность массива Переменная S будет состоять из двух ячеек. В первой – количество строк, во второй – количество столбцов. Для доступа к ячейкам массива используются индексы. Для одномерного массива это выглядит следующим образом: A (i), для двумерного – A (i, j). В среде MATLAB индексация массивов начинается с единицы. Если в окне команд наберем >> b = A(2); то в переменную b (ячейку) запишется значение второго элемента одномерного массива b (34), а если для двумерного массива наберем >>b1 = A1(2,3); Получим значение 11 – располагается на пересечении 2 строки и третьего столбца. В переменные можно записывать также и значения строк и столбцов целиком. Для этого служит знак «двоеточие» >>b2 = A1(1,:) – запишем в переменную b2 всю первую строку массива A1. Рис.13. Результат выполнения команды >>b3 = A1(:,1) – в переменную b3 запишем весь первый столбец. >>b4 = A1(:,1); >>b5 = A1(:,2); >>b6 = A1(:,3); >>b7 = A1(:,4); Рис.14. Первый столбец Аналогичным образом получите строки двумерного массива. Существует возможность задавать следующие матрицы:
Приведем примеры. >>S = eye(4,5) Рис.15. Пример единичной матрицы >>S1 = zeros(4,5); Рис.16. Матрица, содержащая нули >>S2 = ones(4,6); Рис.17. Матрица, элементы которой являются единицы >> A = randn(5); задает матрицу случайных чисел размерности 5. Если в командах zeros, ones или eye мы укажем одно число, то мы зададим квадратную матрицу соответствующего типа. Важной операцией является нахождение суммы элементов массива. Если в окне команд введем >>b = sum(A), где A – заданный ранее одномерный массив, то в переменную b запишем значение суммы элементов вектора A. >>b1 = length(A) – длина массива (количество элементов). Для двумерных массивов (матриц) применение операции sum(A) даст значения суммы столбцов. В окне команд введем >>b2 = sum(A1), где A1 – матрица Дюрера. Наберем команду без точки с запятой. Выведется следующее: Если нам нужно найти сумму строк массива, то нужно ввести: >>b3 = sum(A1’)’;. Значок «’» означает операцию транспонирования. Двойное транспонирование применяется для получения нужного представления результата. Еще две важные операции – нахождение главной и побочной диагоналей. Главная диагональ двумерного массива определяется с помощью команды: >>b4 = diag(A1); Определите сумму элементов главной диагонали массива. Если необходимо определить побочную диагональ, то нужно сначала зеркально отобразить матрицу, а затем найти ее главную диагональ. Это делается следующим образом: >>S = fliplr(B); >>S1 = diag(S); Результат зеркального отображения матрицы: Рис.18. Матрица и ее зеркальное отображение Найдите сумму диагоналей с помощью команд среды, сравните их со значениями сумм строк и столбцов. Также выполните зеркальное отображение введенного ранее одномерного массива A. Выполните очистку окна команд: clc. Применительно к изображениям можно применять команду зеркального отображения fliplr. Ниже показан код, который выполняет это преобразование: Рис.19. Зеркальное отображение изображения В результате получим следующее (это – пример полутонового изображения): Рис.20. Исходное изображение и его зеркальное отображение Если применим команду fliplr к обычному изображению, то не сможем преобразовать его, поскольку матрица изображения должна быть представлена в формате double и матрица его должна быть двумерной. У обычного изображения «матрица» трехмерная – там хранится помимо значений координат еще количество бит, необходимых для представления пикселей изображения. Если переменных стало слишком много, то можно убрать либо все (clear all), либо ненужные (нажав кнопку «Del» на выделенной переменной). Очистим окно команд и считаем изображение, преобразуем его. Затем найдем главную диагональ матрицы изображения (с помощью команды). Получим матрицу значений главной диагонали изображения. Определите также побочную диагональ. Вычислите также сумму значений элементов диагоналей. К полученному изображению можно применить и операцию транспонирования: >>S2 = S1’; >>imshow(S2); Рис.21. Транспонированное изображение Язык среды MATLAB позволяет осуществлять работу с алгоритмическими структурами. Приведем синтаксис структуры if: Рис.22. Структура if...elseif Приведем пример записи структуры if: Рис.23. Пример if Знак двойного равенства означает, что необходимо сравнить массивы S и B1 (знак используется и для сравнения любых других данных), в переменную (logical array – логический массив) flag записать true в случае равенства, либо false в случае невыполнения этого условия. Знак «~=» используется для проверки на неравенство значений. Поменяйте код (проверьте на неравенство) и посмотрите, как изменится значение переменной flag. Также можно написать: >> if S ==B1 flag = true; %логический массив b = 1; end; >> Это – неполная форма записи структуры ветвления. Между if и end можно записать столько команд, сколько необходимо для решения задачи. Также приведем еще один пример записи структуры: >> b = 2; >> b1 = 4; >> if b==b1 k=0; elseif b>b1 %альтернатива k=1; else k=2; end; С использованием структуры if напишем код, меняющий местами две переменные, если одна больше другой. Также структуру ветвления можно использовать для сравнения векторов и матриц. >> A = [2 34 5 2 3 4 6 7 8 -1 2]; >> A0 = [2 45 2 3 4 5 67 8 9 4 3]; >> if A>A0 'greater'; elseif A 'less'; elseif A==A0 'equal'; else 'error'; end; Поскольку мы не задали переменной, в которую запишем значение, то в рабочем пространстве появится переменная ans (строкового типа): Рис.24. Переменная ans – имеет тип char array Запись в поле «Class» «char array» указывает на то, что результатом является строка, записанная в переменную ans. Модифицируйте код таким образом, чтобы вместо ans использовалась переменная b. Структура if в основном используется с циклами (for и while). Приведем синтаксис цикла for: Рис.25. Синтаксис цикла for Цикл for выполняет группу заданное количество раз, причем может быть задан шаг увеличения значения переменной index. Простейшим примером применения цикла for является нахождение суммы элементов массива. Для введенного одномерного массива запишем программу следующим образом: >> p = length(A); >> sum=0; >> for i=1:p sum=sum+A(i); Здесь вывод ответа end; >> sum sum = 72 >> В результате в переменной sum записали значение суммы всех элементов массива. Переменная inc может применяться в том случае, когда нам нужно, например, вычислить сумму не всех элементов, а только ячеек, расположенных друг от друга на определенном расстоянии (скажем, через две ячейки). Это позволяет сделать следующая запись: >> step=2; sum=0; for i=1:step:length(A) sum=sum+A(i); end; >> В результате в переменной sum запишется значение 26. Поменяйте значение шага суммирование на 4. Посмотрите, какое значение окажется в переменной sum. Суммирование двумерных массивов происходит аналогичным образом, для этого используются вложенные циклы: for i = 1:m for j = 1:n S(i,j)= выражение end; end; Самостоятельно напишите программу, вычисляющую сумму двумерного массива (на примере матрицы Дюрера и заданных вами ранее других двумерных матриц). Приведем пример использования вложенных циклов. При сжатии изображений важной является задача преобразования матрицы изображения на определенном этапе кодирования в одномерный массив для передачи его в блок энтропийного кодирования. >> k=1; p=size(A1,1); while k<=p for i=1:p for j=1:p S(k)=A1(i,j); k=k+1; end; end;end; Вызовите редактор массивов для переменной S и посмотрите результат – двумерный массив A1 преобразовался в одномерный S. В качестве задания для самостоятельного решения и демонстрации использования структуры if и цикла for напишите последовательность команд, выполняющую сортировку обменом (пузырьком) получившегося массива S. Результат поместить в другой массив. Еще одним основным циклом является цикл while. Приведем синтаксис: Рис.26. Цикл while В цикле выполняются команды (statements), пока верно заданное условие (expression). Приведем примеры. Самый простой случай – вычисление суммы массива с использованием данного цикла. Для получившегося массива S найдем сумму его элементов. >> sum=0; num=1; %начальные условия >> while num<=length(A1) sum=sum+A1(num); num=num+1; end; %конец цикла А это – пример преобразования двумерного массива в одномерный с использованием цикла while: >> k=1; >> p = size(A1,1); >> while k<=p for i=1:p for j=1:p S(k)=A1(i,j); k=k+1; end; end; end; Примером совместного использования цикла while и структуры if…else является решение задачи о сжатии вектора путем удаления из него нулей В программе создается массив, в который записывается индекс ячейки, содержащей ноль. Модифицируйте код таким образом, чтобы формировался массив, не содержащей нулей (а не массив индексов). >> p=length(A); k=1; while k for i=1:p if A(i)==0 ind(i)=k; end; k=k+1; end; end; Хотелось бы, чтобы массив содержал только значения индексов, а не элементы с нулевыми значениями. Напишите фрагмент программы, осуществляющей операцию удаления нулевых значений из массива индексов. Должны остаться только ячейки 3, 11, 12. Проверьте правильность исходного кода. В качестве задания для самостоятельного решения напишите программу сортировки вектора с использованием цикла while. Рассмотрим еще одну структуру – switch (аналог case). Рис.27. Структура switch Здесь в зависимости от выбранного значения выполняется тот или иной блок команд. В отличие от других языков программирования если первое утверждение является истинным, то остальные блоки не выполняются. Данная структура является полезной при решении системы уравнений или неравенств. Приведем пример использования структуры switch. >> switch n case n==1 M = ones(n) case n==2 M = eye(n) case n==3 M=zeros(n) otherwise M = eye(n)' end; В зависимости от значения n (вместо n может быть подставлено любое выражение) в переменную M запишем одну из перечисленных здесь матриц (смысл упоминался раньше). По аналогии напишите программу, если в переменной t записаны номера от 1 до 7, то происходит вывод названия дня недели (на английском). Если необходимо обработать ситуации, когда возможны ошибки, то используется структура обработки исключений: Рис.28. Структура try…catch В нормальных ситуациях выполняются команды между try и catch, однако если встречается ошибка (например, синтаксическая), то выполняются команды после catch. Если же ошибка встретится после catch, то выполнение команд прекращается. Приведем пример. >> try for i=1:n s=s+1; end catch s1=sin(s); end; Мы в блоке между try и catch написали обращение к переменным, которые мы не объявили (это n). Поскольку среда не знает «смысла» переменной n, то выполняется блок между catch и end. Всегда можно записывать свои команды между try…catch, если есть сомнения в правильности записи кода. Еще одна структура (оператор), которую мы рассмотри – это break. Она позволяет в нужный момент выходить из циклов for и while. Приведем пример использования структуры. >> for i=1:length(A) if i==5 break; else S(i)=A(i); end; end; Результат показан на рисунке справа. То есть, из всего массива скопировали не все значения, а только те, которые расположены до 5 элемента. По аналогии выполните копирование элементов, расположенных после 5-ого элемента массива A. Продемонстрируем использование оператора break с использованием цикла while: >> k=1; while k<=10 if k==5 break; else k=k+1; end; end; >> Мы выходим из цикла, если значение переменной k равно 5. В противном случае мы продолжаем выполнять операцию k=k+1. Приведем еще один прострой пример - найдем максимальный элемент одномерного массива и удалим его. >> A = [2 34 5 2 3 4 6 7 8 -1 2]; >> max = A(1); >> k = 1; >> for i=2:length(A) if A(i)>max max = A(i); k=i; end; end; >>S = A(max) – удалим максимальный элемент из массива A, автоматически при этом сдвинув все оставшиеся элементы на одну позицию влево. Также удаление элемента одномерного массива можно произвести с помощью следующей записи: >> A(k)=[]; Аналогично найдите минимальный элемент массива (одномерного и двумерного) и удалите его из массива. А также используйте цикл while для организации поиска элемента. На этом занятии мы получили представление об использовании переменных, одномерных и двумерных массивов, операциях над массивами, работе с основными алгоритмическими структурами. На следующем занятии мы научимся создавать в среде MATLAB свои функции, осуществлять их вызов. А также применять функции для обработки изображений. Задания 1. Дан двумерный массив A. Рис.29. Исходный двумерный массив Изучите дополнительные операции над матрицами. >>U=triu(A) – находит верхнюю треугольную часть матрицы A (все элементы, расположенные выше главной диагонали). >>U = triu(A,k) – нахождение верхнетреугольной матрицы, начиная с номера заданной диагонали >>U3 = tril(A) – определение нижнего треугольника матрицы A. В результате получится: >>U5 = flipud(A) - переставляет строки массива A симметрично относительно горизонтальной оси. Посмотрите результаты. Если применить операцию нахождения верхнего треугольника матрицы после определенной диагонали к изображению, то в результате определенная часть изображения обрежется: >> S = imread('F:\test.jpg'); >> S1 = double(S)./255; >> S1 = rgb2gray(S1); >> S2 = triu(S1); >> imshow(S2); Рис.30. Применение операции triu к изображению Посмотрите результаты применения других операций над матрицами к изображению. 2. В среде MATLAB, по аналогии с другими системами программирования, можно использовать окна ввода. Например, если нам необходимо задать размер исходного массива для обработки. Приведем пример. Для ввода данных служит диалоговое окно (если не вызывать графический интерфейс). Объясним, как это работает. Приведем код и пояснения. >> dlgTitle='Input data'; >> prompt={'Enter the matrix size:'}; >> answer=inputdlg(prompt,dlgTitle); >> c = str2double(answer(1)); В результате получим следующее: Рис.31. Окно ввода с заголовком Обратите внимание, что в окне рабочего пространства должны образоваться следующие переменные: Рис.32. Переменные Видно, что получившиеся переменные относятся к разным типам: cell array - массивы ячеек, позволяющие создавать многомерные массивы. В каждую ячейку такого массива можно записать как числа, строки, так и стандартные одномерные и двумерные массивы. Тип char array – хранение массива строк. После ввода значения и передачи значения размера массива можно организовать массив нужной размерности. Следующий цикл показывает, как организовать массив, у которого все ячейки содержат числа, убывающие с введенного значения. >>for i=1:c A(i)=c; c=c-1; end; >> Например, если введем в переменную c значение 3, то получим следующий массив: Перед вводом нового массива выполните очистку рабочего пространства и окна команд: >>clc >>clear all. По аналогии введите другое значение и задайте одномерный массив, элементы которого возрастают. Можно либо использовать команду зеркального отображения массива, либо обратный цикл: for c:1. 3.Придумайте задачу, где необходимо использовать ввод значения (например, поиск введенного значения в массиве). Также можно использовать двумерные массивы. Используйте для обработки данных рассмотренные алгоритмические структуры. |
Лабораторная работа Выполнение расчетов с использованием программирования в среде Visual Basic for Applications (vba). 8 | Определение класса тяжести и напряженности труда производится по методу, используемому в «Руководстве по гигиенической оценке факторов... | ||
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования | Основы программирования на языке C++ (Структурное программирование). Учебно-методическая разработка по дисциплине «Программирование».... | ||
Предлагаемое пособие содержит краткое описание основных возможностей системы matlab. Приведены примеры использования системы и задания... | Основы стоимостной оценки экологического ущерба и платежей за загрязнение окружающей среды | ||
Анализ системы управления состоянием окружающей среды в Юго-Западном районе г. Москва | Порядок проведения тестирования корректности данных, получаемых с использованием продуктивной среды смэв | ||
Дизайн архитектурной среды по профилю: проектирование городской среды (далее Отбор) | Лабораторная работа №8. Структурирование таблицы с автоматическим подведением итогов |
Главная страница   Заполнение бланков   Бланки   Договоры   Документы    |