Занятие_2.ppt
- Количество слайдов: 50
Занятие 2 Введение в MATLAB
Язык программирования MATLAB (продолжение)
Содержание занятия Язык программирования MATLAB 1. Постоянные и переменные 2. Арифметические и матричные операторы 3. Логические операторы и операции 4. Побитовые операции 5. Управляющие конструкции 6. Матрично-векторные функции 7. M-файлы и M-функции
5. Управляющие конструкции языка MATLAB
5. Управляющие конструкции В MATLAB определены следующие управляющие конструкции и команды: for % цикл с заданным числом шагов while % цикл по условию if else % условие % дополнительное условие % в противном случае switch case otherwise % дерево ветвлений % ветка дерева ветвлений % в противном случае break % преждевременный выход из цикла continue % перейти к началу цикла
5. Управляющие конструкции (for) for - цикл с заданным конечным числом шагов Синтаксис: for count = start : step : final команды MATLAB end; Пример: for a = 0 : 0. 1 : 10 disp( a ); end; % count - переменная цикла % start - начальное значение % step - шаг % final - конечное значение
5. Управляющие конструкции (while) while - цикл, выполняющийся пока выполняется условие Синтаксис: while условие повторения цикла команды MATLAB end; Пример: a = 0; while a < 5 a = a + 1; disp( a ); end; % здесь может быть и % переменная типа logical
5. Управляющие конструкции (if else) if, else - условные операторы, выполняют те или иные действия, если выполняются те или иные условия Синтаксис: Примеры: if условие 1 команды MATLAB elseif условие 2 команды MATLAB elseif условие 3 команды MATLAB else команды MATLAB end; if a < 5 s = 1; end; if a < 5 s = 1; else s = 0; end;
5. Управляющие конструкции (if else) Примеры: if a < 0 y = sin(x); z = 2*y; elseif (a>=0) && (a<10) y = cos(x); z = 3*y; elseif (a>=10) && (a<20) y = x; z = y; else у = sqrt(x); z = y*y; end; % блок else % может отсутствовать
5. Управляющие конструкции (switch case otherwise) switch, case, otherwise - позволяют удобно организовать дерево ветвлений Синтаксис: Пример: switch x case value 1 команды MATLAB case value 2 команды MATLAB case { value 3 , value 4, value 5 } команды MATLAB otherwise команды MATLAB end; switch class(x) case 'uint 8' y = x / 255; case 'uint 16' y = x / 65535; case 'uint 32' y = x / (2^32 -1); otherwise error('bad type of x'); end; Примечания: x - может быть переменной или выражением! блок otherwise может отсутствовать! не нужен break после группы команд (в отличие от СИ)!
5. Управляющие конструкции (break) break - оператор преждевременного выхода из цикла for или while Пример: for i = 1 : 10 for j = 1 : 10 if i > 5 break; end; x ( i , j ) = 5; end; y ( i ) = 7; end; % for 1 % for 2 % прыжок на end 2 % end 1
5. Управляющие конструкции (break) continue - оператор перехода к следующему шагу цикла for или while Пример: for i = 1 : 10 for j = 1 : 10 if i > 5 continue; end; x ( i , j ) = 5; end; y ( i ) = 7; end; % for 1 % for 2 % прыжок на for 2 (следующий шаг) % end 2 % end 1
ЗАДАНИЕ (task_2) 1. Напишите программу, которая строит график кусочной функции на отрезке от -10 до 10 с шагом 0. 01 x = [-10. . . -5) >>> y(x) = x x = [-5. . . 0) >>> y(x) = 2*x*x x = [0. . . 5) >>> y(x) = sin(2*x) x = [5. . . 10] >>> y(x) = -x 2. Напишите программу, в которой константа TYPE задаётся пользователем (в начале текста скрипта) и является кодом функции, график которой нужно построить на интервале от -1 до 1 с шагом 0. 01: TYPE=1 TYPE=2 TYPE=3 в других случаях >>> >>> y(x) = sin(x); y(x) = cos(x); y(x) = x; y(x) = 10; Примечание: для вывода графика функции накопите значения в переменных x и y и воспользуйтесь командой plot(x, y);
6. Матрично-векторные функции (некоторые)
6. Матрично-векторные функции Для обращения к элементам двумерной (многомерной) матрицы можно использовать не два (несколько) индекса, а один: A=[1234; … 5678; … 2222; … 3 4 5 3 ]; A(3, 2) = A(7) = 2 1 A= 5 2 3 2 6 2 4 3 7 2 5 4 8 2 3 1 5 2 3 2 6 2 4 3 7 2 5 4 8 2 3 Сплошная нумерация сначала по строкам, затем по столбцам
6. Матрично-векторные функции Создание набора из N отсчётов от start до end (похоже, но не совсем, на действие оператора start: step: end ) x=linspace(start, end, N) Создание матрицы b путём репликации матрицы a b=repmat(a, vert, horiz)
6. Матрично-векторные функции Вращение матрицы слева-направо B=fliplr(A) Вращение матрицы сверху-вниз B=flipud(A)
6. Матрично-векторные функции Поиск максимального значения B=max(A) %B-строка B=max(A, x) %B-размер как у А B=max(A, C) %B-размер как у А и C B=max(A, [ ], dim) %B-строка или столбец Поиск минимального значения dim=1 B=min(A) %B-строка B=min(A, x) %B-размер как у А B=min(A, C) %B-размер как у А и C B=min(A, [ ], dim) %B-строка или столбец dim - номер размерности dim=2
6. Матрично-векторные функции Арифметическое среднее B=mean(A) B=mean(A, 1) B=mean(A, dim) Медиана (среднее по положению в упорядоченном списке) dim=1 B=median(A) B=median(A, 1) B=median(A, dim) A=[ 2 3 1 4 4 5 ]; 1 2 3 4 4 5 >>> (3+4) / 2 A=[ 2 3 1 4 4 5 6 ]; 1 2 3 4 4 5 6 >>> 4 dim=2
6. Матрично-векторные функции A=std(B) A=std(B, 0) A=std(B, 1) dim=1 A=std(B, 0, dim) A=std(B, 1, dim) Среднеквадратичное отклонение dim=2
6. Матрично-векторные функции Сортировка элементов матрицы B=sort(A) % по строкам (A-матрица), по элементам (A-вектор) B=sort(A, 1) % равносильно B=sort(A) B=sort(A, dim) % вдоль указанной размерности dim Сумма элементов B=sum(A) % по строкам (A-матрица), по элементам (A-вектор) B=sum(A, 1) % равносильно B=sum(A) B=sum(A, dim) % вдоль указанной размерности dim Произведение элементов B=prod(A) % по строкам (A-матрица), по элементам (A-вектор) B=prod(A, 1) % равносильно B=prod(A) B=prod(A, dim) % вдоль указанной размерности dim
6. Матрично-векторные функции Поиск обратной матрицы (для квадратной матрицы) B=inv(A) Поиск псевдобратной матрицы (для прямоугольной матрицы) B=pinv(A) Вычисление определителя матрицы (для квадратной матрицы) x=det(A)
6. Матрично-векторные функции Векторное произведение векторов v=cross(a, b) Скалярное произведение векторов s=dot(a, b) s=sum(a. *b) %равносильно dot(a, b) Смешанное произведение векторов w=dot(a, cross(b, c)) 1 -норма вектора (матрицы) l=norm(a, 1) 2 -норма вектора (матрицы) l=norm(a, 2) %если a-вектор, то norm(a, 2) равно декартовой длине %вектора
6. Матрично-векторные функции Поиск собственных значений и векторов A=[2 3; 3 5]; lam=eig(A); [U, lam]=eig(A); lam(2, 2); u 2=U(: , 2); % второе собственное значение % (lam-диагональная матрица) % второй собственный вектор % (U-матрица, столбцы которой являются % собственными векторами)
7. M-файлы и M-функции
7. M-файлы и M-функции Скрипты MATLAB: Файл-программы (Script M-files) – не имеют ни входных ни выходных аргументов Файл-функции (Function M-files) – имеют входные и/или выходные аргументы, содержат определения функций
7. M-файлы и M-функции Как MATLAB производит выполнение программы: Пусть mydemo. m – M-скрипт. Запускаем его из командной строки (в окне Command Window): > mydemo MATLAB: 1. Проверяет, не переменная ли это? Если да, то выводит её значение 2. Если не переменная, то не встроенная ли это функция? Если да, то выполняет её. 3. Ищет файл mydemo. m сначала в Рабочей директории (Current Directory), а затем по списку Path Если находит – выполняет. 4. Выводит сообщение о том, что данная переменная или программа не найдена.
7. M-файлы и M-функции Для того, чтобы задать значение Рабочей директории (Current Directory) можно воспользоваться средствами графического интерфейса MATLAB или командой/функцией cd: cd C: usersvasya % вызов команды cd(‘C: usersvasya’); % вызов функции (иногда бывает более % удобен, так как можно использовать % строковую переменную)
7. M-файлы и M-функции Для того, чтобы вывести список директорий для поиска функций необходимо использовать команду/функцию path: path; t=path; Для того, чтобы добавить указанный путь в начало списка поиска, необходимо использовать команду/функцию addpath: addpath C: usersvasya addpath(‘C: usersvasya’); addpath(‘C: ’, ‘C: users’, ’C: usersvasya’); % добавили сразу несколько % директорий Для того, чтобы добавить указанный путь в конец или в начало списка поиска, необходимо использовать функцию path: path(path, ‘C: usersvasya’); % в конец списка path(‘C: usersvasya’, path); % в начало списка Для того, чтобы удалить директорию из списка поиска, используют функцию rmpath: rmpath(‘C: vasya’); % НЕ УДАЛЯТЬ ЛИШНЕГО (РАБОТАТЬ НЕ БУДЕТ!)
ЗАДАНИЕ (task_3) 1. Создайте на доступном дисковом ресурсе директорию ‘project. X’ (Например ‘D: Tempproject. X’). 2. В этой директории создайте вложенные папки ‘math’, ‘graph’ 3. Создайте в директории ‘math’ скрипт ‘math 1. m’, выводящий на экран надпись ‘math func’ 4. Создайте в директории ‘graph’ скрипт ‘graph 1. m’, выводящий на экран надпись ‘graph func’ 5. В директории ‘project. X’ создайте и запустите скрипт ‘main. m’: При старте добавляет в список поиска path указанные поддиректории. Затем вызывает скрипты ‘math 1. m’ и ‘graph 1. m’. По завершению работы скрипт ‘main. m’ должен удалить из списка path все пути, добавленные им.
7. M-файлы и M-функции Создание M-функции: Имя файла должно совпадать с именем определяемой в нём функции! Файл f 22. m function [z, s, w] = f 22 (x, y) % Функция [z, s, w]=f 22(x, y) % моделирует устройство самолёта % Вход: x – длина левого крыла (метров) % y – длина правого крыла (метров) % Выход: z – дальность полёта (метров) % s – высота полёта (метров) % w – кпд самолёта (0. . 100%) Определение функции z = x+y; s = x*y; w = 0; Тело функции return; Строки, вызываемые по команде help f 22 (Первые строки комментария в файле) return указывать необязательно!
7. M-файлы и M-функции Функция без входных аргументов: function [a, b, c] = hello() a = 1; b = 2; c = 3; return; Функция без выходных аргументов: function [ ] = goodbye(a, b, c) disp(a); disp(b); disp(c); return; Функция без аргументов: function [ ] = nothing ( ) disp(‘Nothing to do!’); return;
7. M-файлы и M-функции Можно создать функции с переменным числом входных и/или выходных аргументов. Для этого следует использовать специальные переменные: varargin – массив ячеек, содержащий входные аргументы length(varargin) – так определяют число входных аргументов varargout nargout – массив ячеек, соответствующий выходным аргументам – число выходных аргументов
7. M-файлы и M-функции Пример функции с переменным числом входных и выходных аргументов: function [s, y, varargout] = hello(x, varargin); n_in = length(varargin); n_out = nargout; if n_out~=n_in error(‘Invalid number of outputs’); end; y = 2*x; s = 0; for i=1: n_out varargout {i} = varargin {i}; s = s + varargin {i}; end; return; % здесь s, y, x – обяза% тельные аргументы % Ошибка! Прекращаем работу! % Копируем все аргументы % Суммируем все аргументы
7. M-файлы и M-функции Для того, чтобы внутри функции объединить одинаковые участки кода и более удобно их использовать применяют подфункции: function [z] = simple( ); x=1; y=2; z 1=2*x*x+y*(y-1); x=1; y=2; z 1=fz(x, y); x=3; y=4; z 2=2*x*x+y*(y-1); x=3; y=4; z 2=fz(x, y); z=z 1+z 2; файл simple. m z=z 1+z 2; function [s] = fz(x, y) s=2*x*x+y*(y-1); вызовы подфункции (видна только внутри файла simple. m) определение подфункции (своя область видимости переменных)
7. M-файлы и M-функции В одном файле M-функции можно определить несколько подфункций в конце файла (после основной функции) - друг за другом. MATLAB определяет место, где заканчивается одна функция и начинается следующая - по ключевому слову function
7. M-файлы и M-функции Помимо подфункций иногда применяют вложенные функции: function [z] = simple( ); x=1; y=2; z 1=2*x*x+y*(y-1); function [z] = simple( ); x=1; y=2; z 1=fz(x, y); x=3; y=4; z 2=2*x*x+y*(y-1); x=3; y=4; z 2=fz(x, y); z=z 1+z 2; файл simple. m z=z 1+z 2; function [s] = fz(x, y) s=2*x*x+y*(y-1); end; вложенная функция -конец вл. функции -конец осн. функции
7. M-файлы и M-функции В одном файле M-функции можно определить несколько вложенных функций, в том числе вложенных друг в друга. MATLAB определяет границы вложенных функций по ключевым словам function и end
7. M-файлы и M-функции Для выхода из функции (возврата в вызывающую функцию или процедуру) используется ключевое слово return
7. M-файлы и M-функции Подфункция является внешней по отношению к основной функции. Переменные, определённые во внешней функции, доступны и во вложенной, и наоборот. Исключение - коллизия переменных функций одного уровня. Вложенная функция является внутренней по отношению к основной функции. Переменные из рабочей среды основной функции доступны и во вложенной функции. Функция может обратиться к своей вложенной функции, но не может использовать вложенную функцию нижнего уровня. Вложенная функция может обратиться к функции того же уровня. Функция нижнего уровня может вызвать функцию верхнего уровня, в которую она вложена, и все функции, доступные из неё. (На практике так сложно никто не делает. )
7. M-файлы и M-функции Вспомним: В MATLAB присутствуют глобальные переменные. Особенность этих переменных в том, что они могут быть видны вне функций. % главный скрипт global G; G = 10; %%% % функция myfunc [y] = myfunc(x); global G; % внутри функции MATLAB теперь “знает”, что y=G*x; % G - глобальная переменная, и нужно искать её % “снаружи”
7. M-файлы и M-функции Кроме того В MATLAB присутствуют перманентные переменные. Особенность этих переменных в том, что они сохраняют своё значение между вызовами функции, внутри которых они определены. Для определения перманентной переменной используется ключевое слово persistent При первом вызове эти переменные равны пустой матрице [ ]. Для того, чтобы проверить, первый ли это вызов (и задать этой переменной начальное значение), можно использовать функцию isempty(x)
7. M-файлы и M-функции Пример определения и использования перманентной переменной function [ y ] = integrator ( x , steps ); persistent step; persistent sum; if isempty(step) sum=0; step=0; end; sum=sum+x; step=step+1; if step<steps y=0; else y=sum; sum=0; step=0; end; % Функция integrator производит % суммирование x на участке в steps % шагов. Во время суммирования % выдаёт 0. По окончанию - выдаёт % значение суммы и сбрасывается.
7. M-файлы и M-функции Помимо рассмотренных функций в MATLAB имеются: приватные функции (размещаются в подкаталоге private в данном каталоге. видны только в M-файлах данного каталога, содержащего данный подкаталог private) функции от функций (в качестве аргументов у таких функций выступают другие функции)
7. M-файлы и M-функции Если доступны одноимённые функции, то приоритет связывания имени и объекта следующий: 1. Ищется имя в текущей рабочей среде (переменная, вложенная функция, анонимная функция или inline-функция. 2. Ищется подфункция в текущем M-файле. 3. Ищется приватная функция. 4. Ищется встроенная функция (built-in function). 5. Производится поиск требуемой файл-функции в текущем каталоге и путях поиска MATLAB (path).
7. M-файлы и M-функции Функции от функций: x=pi/2; y=0; [a, b]=myfun(x, y); x=pi/2; y=0; [a, b]=feval('myfun', x, y); x=pi/2; y=0; [a, b]=feval(@myfun, x, y); %прямой вызов функции %вызов функции по имени %вызов функции по ссылке
7. M-файлы и M-функции Функция eval str 1 = 'y=sin('; str 2 = '2*pi'; str 3 = ')'; str = strcat(str 1, str 2, str 3); eval(str);
7. M-файлы и M-функции Ввод данных пользователем из командной строки: x = input('введите значение x='); s = input('введите имя', 's'); % 's' указывает на то, что % вводимое значение - строковое
ЗАДАНИЕ (task_4) Изучите программу с интерфейсом командной строки Калькулятор (файл calc. m) Добавьте в программу вычисление функций sin(x), cos(x), sqrt(x) При вводе этих команд, не следует запрашивать от пользователя ввода второго аргумента! Постарайтесь сделать вывод результата в том же стиле, что и в исходной программе.
ЗАДАНИЕ (task_4) calc. m function calc %Калькулятор с интерфейсом командной строки clc; a = input('Input the 1 st argument: '); oper = input('Input arithmetic operation (+, add, -, sub, *, /): ' , 's'); b = input('Input the 2 nd argument: '); switch oper case {'+', 'add'} res = a + b; case {'-', 'sub'}' res = a - b; case '*' res = a * b; case '/' res = a / b; otherwise error('Unknown arithmetic operation'); end; stra = num 2 str(a); strb = num 2 str(b); strres = num 2 str(res); str = [stra ' ' oper ' ' strb ' = ' strres]; disp(str);
Занятие_2.ppt