Brian_-_Matlab_R2007_s_nulya_33 (771739), страница 26
Текст из файла (страница 26)
(Чтобы узнать больше о команде еггог и связанных с ней командах, смотрите следующий раздел.) Программа МАТ(АВ автоматически проверяет, не использовано ли большее количество аргументов, число которых определено в первой строке М- файла, таким образом,нет необходимости делать это внутри самого М-файла. Если выполнение М-файла доходит до второго выражения аг в представленном выше М-файле, мы знаем, что существует либо два, либо три аргумента ввода; выражение ая выбирает требуемый способ действия в каждом случае. Например, если вы введете а<Ы(4, 5) в командной строке, тогда в М-файле переменной х будет присвоено значение 4, переменной у — значение Б, а переменная а останется незаданной; таким образом, очень важно использовать команду пагдап, чтобы избежать ссылки на переменную а в случаях, когда эта переменная не задана.
МАТСОВ Еппседоп в = аИ(чагагдйп) в впш([чагагдЕп(:)])) В этом примере все аргументы ввода присваиваются массиву ячеек чагагдзп. Выражение чагагдйп(: ) формирует список аргументов ввода, разделенных запятыми. В представленном выше примере мы преобразовываем этот список в вектор, заключая его в квадратные скобки, формируя тем самым корректный ввод для команды вшв. Представленные выше примеры Мфайлов подразумевают условие, что их аргументы ввода являются числовыми и будуг пьггаться их добавлять, даже если аргументы таковыми не являются.
В некоторых случаях это желательно; например, оба рассмотренных выше М-файла корректно добавят смесь числовых и символьных значений ввода. Однако, если некоторые из аргументов ввода являются строками, то результатом будет либо в высшей степени бессмысленный ответ в числовой форме, либо сообщение об ошибке, которое будет проблематично расшифровать. Программа МАТ[АВ имеет проверочные функции, которые вы можете использовать, чтобы заставить М-файл по-разному обрабатывать различные типы аргументов ввода — либо выполняя вычисления, либо делая вывод вспомогательного сообщения об ошибке, если аргумент ввода имеет непредвиденный тип.
Чтобы посмотреть список этих функций, поищите команды, начинающиеся с буквосочетания хв, в разделе «Программирование в среде МАТ[АВ» Глоссария. Здесь в качестве примера мы используем команду ХвппзвегЕс в М-файле асслш, чтобы вывести на экран сообщение об ошибке, если какой-либо из аргументов ввода не является числовым.
Ецпсейоп в = а~И(чагагдйп) ЕЕ -Евпцшегйс([чагагдйп(:)]) еггог('1прпгв шпвс Ье Е1оагйпд роЕпг ппшЬегв.') в = виа([згагагддп(в)]) Когда в М-файле — функции определено несколько аргументов вывода, тогда, если количество этих аргументов, заданных при вызове функции, отличается от необходимого, то оставшиеся просто не выводятся. Вспомните, что, если в командной строке не задано аргументов вывода, тогда возвращается один элемент вывода, который присваивается переменной апв.
В качестве примера рассмотрим представленный ниже М-файл гвс(апдц[аглш, который изменяет полярные координаты на прямоугольные. Еипсадоп [х, у] = гескапдп1аг(г, ФЬеса) х = г.*сов(гЬега)) у = г.*вЕп(ФЬега)) Глава 6. Программирование Ввод [х, у] = гесвапди1ег(2, 1) в командную строку сохраняет прямоугольпыс координаты точки с полярными координатами (2, 1) в переменных х и у.
Но если вы введете только гессапди1аг(2, 1), тогда ответом будет просто х-координата. В представленной ниже модификации файла гас(аппп(агля настраивается вывод результата так, чтобы он представлял комплексное число х + ау, содержащее обе координаты. Еипсеаоп [х, у] гескапди1аг(г, сЬева) х = г.*сов(КЬева)а у = г.*вап(ВЬеса)) ЕЕ пагдоик < 2 х = х + а*у) апб Чтобы ознакомиться с дополнительной информацией н примерами, обратитесь к онлайновой справке для команды чагатроик и описанных выше функций. Вычисление и дескрипторы функций Команда еча1 позволяет запускать команду, оформленную в виде строки, так же, как если бы вы ввели эту команду в командной строке программы.
Например, ввод команды еча1('сов(1) ') выдаст тот же результат, что и ввод команды соа(1). Если вся команда, которую вы хотите запустить, содержится в строке авг, тогда вы можете выполнить ее, введя еча1(акт). Обычно команда еча1 используется в М.файле для определения переменной или запуска команды, имена которых зависят от параметра ввода или переменной цикла; для знакомства с примерами использования введите Ье1р еча1. Другая полезная функция команды езга1 заключается в том, что при наличии двух строк ввода она выполняет команду из первой строки, а если та будет ошибочной, выполняет команду из второй строки. Эта форма команды еча1 дает некоторую гиб.
кость в управлении параметрами ввода анонимной функции. Например, команда » аост = С(х, у, г) еча1( х + у + я', 'х + у) создает анонимную функцию, которая суммирует либо два, либо три аргумента ввода, подобно рассмотренному выше файлу а<И.пз. ч Вы можете также создать анонимную функцию с несколькими параметрами вывода, используя команду стее1. Например, набрав » гессепдп1аг = Ф(г, ВЬева) стеа1(т.*сов(сЬесе), г.~а1п(ФЬева)) вы создадите функцию, которая преобразует пару полярных координат в пару прямоугольных координат, как в рассмотренном выше файле гас(аппп(аг.пз.
Единственная разница в том, что эта функция выдаст сообщение об ошибке, если вы (32 МАТСОВ зададите только один аргумент вывода. Чтобы использовать либо один, либо два параметра вывода, вы можете использовать двойную форму ввода команды еча1, как в примере выше; с подробностями вы разберетесь сами, в качестве упражнения. В главе 4 мы упоминали о дескрипторах функций, которые появились в программе МАТ(.АВ 6.
Сейчас дескрипторы функций являются предпочтительным способом для назначения функции в качестве параметра ввода в другой функции (например, как команды Еяего и спза61), хотя для обратной совместимости многие из этих функций позволяют также вводить имя функции в виде строки. Начиная с МАТ(АВ 7, дескрипторы функций также упрощают запись М-файлов- функций, которые имеют в качестве параметра ввода другую функцию. Например, рассмотренный ниже М-файл Вега(езп имеет параметры ввода в виде дескриптора функции (или функции, созданной командой Еп11пе), начального значения и числа, задающего количество повторов.
Епжск1оп Е1да1 = Екегаке(Ешзс, 1п10» пцж) ЕЕпа1 = 1п1сз Еог )с = 1:ппж ЕЕпа1 = Ецпс(Е1па1)) ежа Вспомните, что вставка символа Ф перед именем встроенной функции или М-файла-функции создает дескриптор для этой функции. Таким образом, введя 1йегасе(Фсоя, 1,2), получаем числовое значение сов(соя(1) ), а введя 1сегасе(Фсоа, 1, 100), получаем приближение к вещественному числу к, для которого соя(х) х. (Подумайте об этом)) Не забывайте также, что анонимная функция является дескриптором функции. Таким образом, ввод 1кегасе(Ф(х) 3.9*х*(1 — х), 0.5, 100) производит итерацию «логистической карты» Е(х) н 3.9х(1 - х) сто раз, начиная с х = О.5. кл' Чтобы бальтв узнать о логистичвской каРтв, обРатитвсь к Разделу «Математическая генетика» в главе «)урн кладнь»в задачи».
яГ В программе МАТ(АВ 6 и более ранних версиях необходимо использовать команду Ееча1 в М.файлах — функциях, подобных файлу Пега(езп. В частности, команда ЕЕпа1 н Ешьс(ЕЕпа1) в М-файле заменяется на команду ЕЕпа1 Еез»а1(Ецпс, Езпа1). При использовании команды Еез»а1 вводимая функция может быть задана как строка, как дескриптор функции или как функция, задаваемая командой Еп1апе. Например, ввод команды Еез»а1( 'агап2', 1, 0) или команды Еежа1(Фагап2, 1, О) эквивалентен вводу команды айап2 (1, 0) . Другой полезной в программировании возможностью анонимных функций является то, что их определение может включать в себя параметр, сохраняемый в переменной.
(Кроме функций, задаваемых командой 1п11пе.) Рассмотрим следующие команды: 133 Глава 6. Программирование » о = 3) Е = 6(х) с*хз й(2) Значение с в момент задания функции й уже было задано и стало встроенным в й, любые последующие изменения с не повлияют на й: » с = 5) й(2) апз Эту возможность можно использовать в М-файле для определения анонимной функции, которая зависит от параметра ввода. Другое ее назначение — изменять параметр в цикле. Например, данный цикл » Ьо14 йога=1:3 еар1ок(6(х) вйл(с*х), [О 2*рй] ) ело Ьо1о ойй воспроизведет кривые, как на Рис.
3.1. Пользовательский ввод и вывод результата на экран В предыдущем разделе мы использовали команду еггог, чтобы вывести сообщение на экран, а затем прервать выполнение М-файла. Выводить сообщения на экран можно также и без остановки выполнения М-файла, с помощью команд айвр или иагл1ли. Вполне понятно, что команда иагл1лд предназначена для вывода предупреждающих сообщений, когда М-файл обнаруживает проблему, которая может повлиять на корректность результата, но не обязательно является серьезной. Вы можете запретить предупреждающие сообщения в командной строке или внутри М-файла, используя команду иагл1лр ойй.
Существует еще несколько параметров управления предупреждающими сообщениями; для более подробного знакомства введите команду ле1р иагл1ло. В главе 4 мы использовали команду 61вр для отображения вывода команды без отображения строки «апв =». Также вы можете использовать команду айвр для отображения на экране информационных сообщений во время выполнения М-файла или для объединения числового вывода и сообщения в одной строке. Например, следующие команды х = 2 + 2) о1вр( [' гье алвиег ав ' лзввзвкг(х) '.
') ) присвоят переменной х значение 4, а затем будет выведено сообщение Т)зе апвиег йв 4. 134 Программа МАТЕАВ также имеет несколько команд, которые запрашивают ввод у пользователя, запускающего М-файл. В конце главы 3 мы рассмотрели три таких команды: раиве, )сеуЬоагб и харис. Вкратце, команда раиве просто приостанавливает выполнение М-файла до тех пор, пока пользователь не нажмет любую клавишу, тогда как команда )сеуЬоагс приостанавливает выполнение М.файла и выдает пользователю приглашение, которое может использоваться, как обычный интерфейс командной строки перед тем, как пользователь введет команду геворга для продолжения выполнения М-файла.
Команда апрцс отображает сообщение и позволяет пользователю вводить данные для программы в одной отдельной строке. Например, в программе, которая воспроизводит последовательные приближения к ответу до тех пор, пока не будет достигнута определенная точность (см. раздел «Неограниченные циклы»), вы могли бы добавить представленные ниже строки после выполнения большого количества повторений цикла. апвиег = харис( ( 'а1догйгЬзв ав соачегдаад в1ом1у) 'сопИаце (уев/по)? '), 'в')з И -аведпа1(аавиег, 'уев') гегигп Здесь второй аргумент 'в ' команды 1прис дает программе МАТ(.АВ указание не вычислять ответ, введенный пользователем, а просто присвоить его как строку символов переменной аавиег.
Мы используем команду хведца1 для сравнения ответа со строкой 'уев', так как знак = можно использовать только при сравнении массивов (в данном случае — строк) одинаковой длины. В этом случае мы решили, что М-файл должен прерываться, если пользователь введет что-либо, кроме полного слова уев. Другие способы могли бы представлять собой сравнение только первой буквы аивиег(1) с 'у', остановку только в том случае, если ответ есть ' по ', и т. п. Если открыто окно изображения, вы можете использовать команду д1приг, чтобы получить координаты точки, которую пользователь выбирает с помощью мыши. В качестве примера приведенный ниже М-файл выводит «Х» там, где пользователь Шелкает мышью. йипссаоп завах)свсЬеврос хЕ 1вежргу(дев(0, 'Сиггепсуйдпге')) еггог('Ио сиггепв адике.') ецс над -1вьоы И б1ад Ьои оа еао Глава 6. Программирование Жвр( 'С11о)с оп сЬе ройпв мЬехе уоп маак во р1ок ап Х.
') [х, у) = дйарак(1) г р1ок(х, у, 'х)с') йк к1ад Ьо16 окк епй Сначала М-файл проверяет, отображено ли текущее окно изображения. Если это так, то переменной к1ад присваивается значение 1 при условии активной команды Ьо1й окк, и О, если активна команда Ьо1й оп. Причина этого в том, что нам нужна активная команда Ьо1й оп, чтобы начертить «ХГч не стирая существующее изображение; но потом нам необходимо восстановить окно изображения в том состоянии, в котором оно было до выполнения М.файла. Затем Мфайл отображает сообщение, указывающее пользователю, что делать, выделяет координаты точки с помощью команды дйарив(1) и чертит «Х» черного цвета в этих координатах. Аргумент 1 команды дйарик означает, что это координаты отдельной точки; при использовании этой команды без аргумента будут собираться координаты нескольких точек, и этот процесс прекратится, только когда пользователь нажмет на клавишу ~".".~.