Главная страница
Навигация по странице:

  • Управляющие структуры языка MATLAB

  • Обработка входных и выходных аргументов функций MATLAB

  • Глобальные переменные. Доступ к переменным из различных

  • Задачи и упражнения

  • Матлаб. К. Ю. Петрова введение в matlab учебное пособие


    Скачать 2.57 Mb.
    НазваниеК. Ю. Петрова введение в matlab учебное пособие
    АнкорМатлаб
    Дата15.09.2022
    Размер2.57 Mb.
    Формат файлаpdf
    Имя файлаmironovsky_petrova_matlab.pdf
    ТипУчебное пособие
    #678847
    страница17 из 18
    1   ...   10   11   12   13   14   15   16   17   18
    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}
    выдаст ошибку
    1   ...   10   11   12   13   14   15   16   17   18


    написать администратору сайта