Матлаб. К. Ю. Петрова введение в matlab учебное пособие
Скачать 2.57 Mb.
|
struct, все сказанное относится и к ним. Для того чтобы успешно использовать существующие классы в пакете MATLAB, такие как ss, tf, zpk, lti нужно учитывать, что функции над объектами не изменяют исходного объекта, но возвращают его копию. В языке MATLAB методы класса, с точки зрения пользователя, являются обыкновенными функциями, которые «знают», как себя вести, когда в качестве аргумента задан объект этого класса. 113 Сервисные функции В системе MATLAB существует ряд служебных функций. Здесь будет описаны функции, относящиеся к трем категориям – управление рабочим пространством, управление m-функциями и системные взаимодействия. К первой категории можно отнести команды who, whos, clear, save, load. По команде who выводится список переменных в рабочем пространстве или mat-файле. Команда whos является расширенным вариантом who. Покажем разницу между информацией, выдаваемой этими двумя командами: >> a=17; >>b={'ratata','gagaga'}; >> who Your variables are: a b >> whos Name Size Bytes Class a 1x1 8 double array b 1x2 144 cell array Grand total is 15 elements using 152 bytes >> v=who v = 'a' 'b' >> w=whos w = 3x1 struct array with fields: name size bytes class >> w(1) ans = name: 'a' size: [1 1] bytes: 8 class: 'double' >> w(1).bytes ans = 8 Как следует из листинга, обе перечисленные команды могут не только выводить информацию о переменных рабочего пространства на экран, но и помещать результаты в выходную переменную. Для того чтобы очистить переменную в рабочем пространстве, используется команда clear. В зависимости от формата вызова, она может очистить все переменные рабочего пространства, указанную переменную, глобальные переменные, классы, загруженные модули Java или скомпилированные функции. В рамках настоящего пособия интерес представляют первые три способа использования: >> a=1; b=2; c=3; global d; d=8; >> who Your variables are: a ans b c d v w >> clear c; >> who Your variables are: a ans b d v w >> clear globals; >> who Your variables are: a ans b d v w >> clear >> who Графический интерфейс браузера рабочего пространства можно запустить программно при помощи команды workspace. Для программного вызова GUI, предназначенного для редактирования массивов, пользуйтесь командой openvar. Чтобы понять, о чем идет речь, выполните следующий код: >> m=eye(5); openvar('m'). Для того чтобы сохранить в файле и считывать из файла переменные рабочего пространства, используются команды save и load. Формат вызова этих команд следующий: save имя_файла переменная1 переменная2 …. load имя_файла переменная1 переменная2 …. load имя_файла Приведем пример работы: >> a=1; b=2; c=3; global d; d=8; >> save file1 a b d >> clear >> who >> load file1 >> who Your variables are: a b d 114 Стандартный формат хранения MATLAB-переменных – *.mat. Если Вы хотите читать и писать mat-файлы из собственных программ, воспользуйтесь имеющимся C или FORTRAN API. Для переноса результатов работы между различными версиями MATLAB воспользуйтесь дополнительными ключами –v4 или –v6. Тогда данные будут сохранены в mat-формате, поддерживаемом в 4-й и 6-й версиях, соответственно. Свои данные можно сохранять и в ASCII-файлах, пользуясь ключом –ascii: >> m=[23 67; 90 890]; >> save file2 m -ascii >> clear m >> load file2 m -ascii >> m ??? Undefined function or variable 'm'. >> who Your variables are: file2 >> file2 file2 = 23 67 90 890 >> n=eye(5) n = 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 >> m=[23 67; 90 890]; >> save file2 m n -ascii >> clear >> load file2 -ascii ??? Error using ==> load Number of columns on line 3 of ASCII file C:\MATLAB\work\file2 must be the same as previous lines. Обратите внимание на то, что в ASCII-формате поддерживаются далеко не все возможные типы данных MATLAB. Помимо этого, теряется вся информация об именах. Более того, теряется значительная часть информации о типах данных, что видно из последнего примера. Тем не менее, возможность импорта и экспорта в ASCII может быть весьма полезна, если необходимо работать с несколькими различными приложениями одновременно. MATLAB обладает функциями для чтения/записи бинарных файлов, а также поддерживает импорт/экспорт большого количества различных форматов данных и графических форматов. В MATLAB имеется несколько команд, которые делают более удобной работу с файлами функций и сценариев. Это команды dir, type, pwd, cd, what, matlabroot, path, addpath, rmpath, genpath, rehash, which. Команда type выводит в командном окне содержимое m-файла, например, type misha печатает листинг текстового файла c именем misha.m, хранящегося в текущем каталоге. Если расширение (.m, .mat, .bat, ...) не указано, то по умолчанию вызывается m-файл. Функции pwd и cd делают то же самое, что и соответствующие команды ОС – выводят название текущего каталога и меняют текущий каталог: >> pwd ans = C:\MATLAB\work >> cd .. >> pwd ans = C:\MATLAB Команда dir (directory) отображает в командном окне совокупность всех файлов, хранящихся в текущем каталоге. При вызове с выходным параметром в него помещается массив структур с полями name, date, bytes и isdir. Команда what делает примерно то же самое, но несколько в другом формате, отображая при этом только файлы с расширениями, используемыми в MATLAB. При вызове с выходным параметром она возвращает структуры с полями path, m, mat, mex, mdl, p, classes. Поле path содержит имя каталога , m – список m-файлов в виде массива ячеек, mat – список mat-файлов и т.д. Расширения .mex и .p соответствуют скомпилированным исполняемым MATLAB-файлам и файлам, скомпилированным в псевдокоде. Поле classes содержит список классов в текущем каталоге. Сравним работу команд what и dir: >> d=dir(pwd) d = 194x1 struct array with fields: name date >> d(1) ans = name: '.' date: '05-Jan-2003 16:19:16' bytes: 0 >> d(2) ans = name: '..' date: '05-Jan-2003 16:19:16' bytes: 0 115 bytes isdir isdir: 1 isdir: 1 >> d(3) ans = name: '1.TXT' date: '16-Feb-2005 00:19:52' bytes: 2104 isdir: 0 >> w=what(pwd) w = path: 'C:\MATLAB\work' m: {105x1 cell} mat: {2x1 cell} mex: {0x1 cell} mdl: {18x1 cell} p: {0x1 cell} classes: {3x1 cell} >> w.mat ans = 'hanke14.mat' 'hanke15.mat' Команда cd (change directory) выдает сообщение о том, в каком каталоге работает в настоящее время пользователь и позволяет также переходить из текущего каталога в другой. Например, для перехода из каталога D:\MATLAB\BIN в каталог D:\MATLAB \CONTROL нужно ввести команду cd \MATLAB \соntrol Команда matlabroot возвращает имя каталога, в котором установлен MATLAB. Команда path выводит список путей, включая все установленные тулбоксы. Команды addpath и rmpath добавляют и удаляют каталоги в путь. При этом команда addpath поддерживает добавление в начало или конец пути при помощи дополнительных параметров –BEGIN и –END. Команда genpath составляет список всех подкаталогов указанного каталога, что упрощает процедуру установки новых тулбоксов. Командой rehash имеет смысл пользоваться тогда, когда Вы уже внесли изменения в пути MATLAB, но не уверены, что система уже «видит» эти изменения. В связи с тем, что разные каталоги могут содержать m-файлы с одинаковыми названиями, может возникнуть сомнение, что выполняется нужный файл. В таких случаях полезна команда which, выдающая полный путь m-файла. Например, >> which tmp08 C:\MATLAB\work\tmp08.m Взаимодействие с системой Самые простые «системные» команды MATLAB – это команды завершения сессии quit или exit. Прекращение сеанса MATLAB приводит к потере переменных в рабочей области. В MATLAB предусмотрено 4 возможности организации интерфейса с другими программами: непосредственный вызов исполняемых файлов и команд операционной системы; вызов PERL-скриптов; использование классов Java; взаимодействие через COM-интерфейс. Для взаимодействия с ОС используется символ восклицательного знака !. Он указывает, что остаток строки должен быть передан как команда в операционную систему. Если строка завершается символом &, то для работы внешней программы открывается отдельное окно. Так, сравните результаты выполнения следующих трех команд: >>path >> ! path >> ! path & Если просто набрать &, то будет открыто окно сеанса MS DOS. Если результат выполнения внешней программы следует поместить в переменную, то используются команды system (для всех платформ), dos или unix. Формат вызова всех этих команд одинаков: [status, result] = DOS('command', '-echo') , где status – это код завершения программы, а result – вывод программы. Аргумент '-echo' не является обязательным. В операционных системах Windows 98 и Windows ME встроенные команды DOS и bat-файлы в качестве кода завершения всегда возвращают 0. В комплект поставки MATLAB входит интерпретатор языка PERL (см. каталог, например, C:\MATLAB\sys\perlsys\perl), позволяющий решать широкий круг программистских задач. Для 116 выполнения PERL-скриптов в MATLAB имеется команда perl. Синтаксис вызова этой команды result=perl(perlfile,arg1,arg2,...), где perlfile – имя скрипта с указанием пути, а arg1, arg2 и т.д. – аргументы. Управляющие структуры языка MATLAB MATLAB изначально сконструирован как векторный процессор, что резко сокращает необходимость использования большинства управляющих конструкций. В MATLAB есть два условных оператора – if и switch. Синтаксис использования if в развернутой форме имеет вид: if условие операторы elseif еще одно условие операторы else операторы end Ниже дан пример, выводящий на экран надпись ‘a is even’ для четных чисел a. >> if rem(a,2) == 0 disp('a is even') end Если число а было четно, то получим ответ: a is even Для организации циклов служат операторы for и while. Цикл for позволяет повторять группы команд заданное число раз. Например, цикл >> for i=1:5 x(i)=0 end присваивает значение 0 первым пяти элементам вектора x. Разумеется, вместо этого естественней было бы сказать x(1:5)=0. Цикл while дает возможность повторять группу операторов нефиксированное число раз до выполнения логического условия. Вот простая задача, иллюстрирующая цикл while: найти наименьшее число n, факториал которого n! является 100-значным числом. >> n = 1; f=1; while log10(f) < 100 f=f*n; n = n+1; end disp(n-1) 70 Для досрочного завершения цикла используется команда break, а для досрочного перехода к следующей итерации – команда continue. Команда input, фигурирующая в тексте, предназначена для ввода пользователем данных из командного окна. Для ввода строки эта команда вызывается с дополнительным параметром 's'. Описание m-функций 117 Процедура создания файлов-сценариев кратко рассмотрена в п. 1.2. Большая часть системы MATLAB написана на языке сценариев MATLAB. Покажем, как можно расширить систему, добавляя собственные функции. Создадим простейшую функцию, которая не принимает никаких входных параметров и не возвращает выходных. function hello_world; disp('Get lost!!!'); В отличие от файла сценария, который может называться как угодно, имя файла, содержащего функцию, должно совпадать с названием, стоящим при ключевом слове function, т.е. приведенная выше функция должна храниться в файле hello_world.m Создадим функцию с несколькими входными параметрами и одним выходным. function d=sum3(a,b,c) d=a+b+c; Если выходной параметр был определен, но функцию вызвали без него, ответ помещается в служебную переменную ans: >> a=sum3(1,2,3) a = 6 >> sum3(1,2,3) ans = 6 Для того чтобы описать функцию с несколькими выходными параметрами, достаточно перечислить их в квадратных скобках, например: function [s,d]=sum_and_difference(a,b); % function [s,d]=sum_and_difference(a,b); % This function returns sum and difference of two values. s=a+b; d=a-b; Эта функция возвращает сумму и разность своих аргументов: >> [x1,x2]=sum_and_difference(3,5) x1 = 8 x2 = -2 Строчки с комментариями, расположенные сразу же после объявления функции, выводятся при запросе help на вновь созданное имя функции: >> help sum_and_difference function [s,d]=sum_and_difference(a,b); This function returns sum and difference of two values. Обработка входных и выходных аргументов функций MATLAB Большинство функций MATLAB могут поддерживать различный синтаксис вызова. Для этого имеются четыре специальные переменные: varargin – массив входных аргументов, varargout – массив выходных аргументов, 118 nargin – количество входных аргументов, nargout – количество выходных аргументов. Поскольку входные и выходные аргументы могут быть разного типа, для их хранения используются массивы ячеек. Таким образом, первый входной аргумент будет адресоваться как varargin{1}, второй – varargin{2} и т.д. Напишем функцию sum_and_difference так, чтобы предусмотреть разное количество аргументов. function varargout=sum_and_difference2(varargin); if nargin>=1 a=varargin{1}; else a=0; end if nargin>=2 b=varargin{2}; else b=0; end s=a+b; d=a-b; if nargout==2 varargout{1}=s; varargout{2}=d; else varargout{1}=[s, d]; end Теперь можно будет вызывать функцию с разными вариантами синтаксиса: >> [a,b]=sum_and_difference2(3,7) a = 10 b = -4 >> a=sum_and_difference2(3,7) a = 10 -4 >> a=sum_and_difference2(3) a = 3 3 >> [a,b]=sum_and_difference2(3) a = 3 b = 3 >> sum_and_difference2 ans = 0 0 Рассматривая исходные тексты большинства стандартных функций MATLAB, можно убедиться, что их большую часть занимает именно анализ входных и выходных аргументов. Глобальные переменные. Доступ к переменным из различных рабочих пространств Все переменные в функции являются локальными. Есть возможность объявления глобальных переменных при помощи команды global: function a2=test_global global a; a2=a^2; Прежде чем использовать глобальную переменную, ее необходимо объявить таковой в корневом рабочем пространстве: >> a=5 a = 5 >> a a = [ ] 119 >> % переменная а еще не объявлена глобальной >> test_global ans = [ ] >> global a; Warning: The value of local variables may have been changed to match the globals. Future versions of MATLAB will require that you declare a variable to be global before you use that variable. >> a=5 a = 5 >> test_global ans = 25 Осуществить проверку того, является переменная глобальной или нет, можно при помощи команды isglobal: >> a=9; >> isglobal(a) ans = 0 >> global a; Warning: The value of local variables may have been changed to match the globals. Future versions of MATLAB will require that you declare a variable to be global before you use that variable. >> isglobal(a) ans = 1 Существует еще один способ доступа к переменным родительского рабочего пространства – при помощи функций assignin и evalin. Синтаксис вызова первой из этих команд assignin(ws,'name',v), где ws – имя рабочего пространства, 'name' – имя присваиваемой переменной, а v – ее значения. Параметр ws может принимать два значения – 'base' для обозначения корневого рабочего пространства или 'caller' для обозначения рабочего пространства вызывающей функции. Команда assignin, как следует из названия, заносит значение v в переменную по имени 'name' рабочего пространства ws. Для того чтобы получить значение переменной (или вычислить выражение) в другом пространстве, используется команда evalin(ws,'expression'). Обращаясь к рабочему пространству 'caller' можно получить доступ лишь к тем локальным переменным, которые упомянуты в списке входных или выходных аргументов. Приведем небольшой пример доступа к пространству 'caller'. Опишем две вложенные функции assignin_demo1 и assignin_demo2: function m=assignin_demo1 disp('m in assignin_demo1 workspace:') m=[1 2 ; 3 4] assignin_demo2; disp('After calling assignin_demo2 m had changed:') disp(m) function assignin_demo2 m=evalin('caller','m'); disp('m in caller(assignin_demo1) workspace:') disp('Let''s change m and pass it back to assignin_demo1 workspace:') m=[5 6; 7 8] assignin('caller','m',m); При вызове assignin_demo1 в командном окне появится следующая реакция: >> k=assignin_demo1 m in assignin_demo1 workspace: m = 1 2 3 4 m in caller(assignin_demo1) workspace: 120 Let's change m and pass it back to assignin_demo1 workspace: m = 5 6 7 8 After calling assignin_demo2 m had changed: 5 6 7 8 k = 5 6 7 8 Проиллюстрируем возможность использования пространства имен 'base' из функции k=assignin_demo3: function k=assignin_demo3 k=evalin('base','a+8'); Вызовем ее из командного окна: >> a=19; >> k=assignin_demo3 k = 27 В MATLAB-функциях существует также возможность использования статических переменных при помощи ключевого слова persistent. Задачи и упражнения 1. Напишите m-функцию, возвращающую список файлов в текущем каталоге, отсортированных по размеру. Указание. Вызвать каталог командой dir; сформировать массив, содержащий размеры файлов; выполнить его сортировку с помощью команды sort, например [a,b]=sort({'asasa','aaaaa','akkkk'}), после этого упорядочить файлы в соответствии с результатами сортировки. 2. Пусть функция описана как function myfunc(p1,p1,varargin). а) При ее вызове с параметрами myfunc(17,64,[24 -5 0],{78,90,[8 9]}) чему будет равняться переменная nargin? б) Какой тип будет иметь параметр varargin{2}? varargin{3}? Ответ: а) nargin=4, б) varargin{2}={78,90,[8 9]}, varargin{3} выдаст ошибку |