Текст
                    КУРС ЛЕКЦИИ
ЧИСЛОВОЙ ПАКЕТ
MATLAB

Л. Л. Голубева А. Э. Малевич Н. Л. Щеглова КОМПЬЮТЕРНАЯ МАТЕМАТИКА. ЧИСЛОВОЙ ПАКЕТ MATLAB КУРС ЛЕКЦИЙ МИНСК БГУ 2007
УДК 519.67-37 ББК 22.19 Г62 Печатается по решению Редакционно-издательского совета Белорусского государственного университета Рецензенты: доктор физико-математических наук, профессор А. П. Садовский', доктор технических наук, профессор В. А. Липницкий Голубева, Л. Л. Г62 Компьютерная математика. Числовой пакет MatLab : курс лек- ций / Л. Л. Голубева, А. Э. Малевич, Н. Л. Щеглова. - Минск : БГУ, 2007. - 164 с. ISBN 978-985-485-565-3. В курсе лекций представлен один из разделов дисциплины «Компьютер- ная математика», посвященный применению пакета MatLab для выполнения математических, инженерных и научных расчетов. Дано описание системы, изложены основы работы и программирования в MatLab, рассмотрены реали- зация высококачественной визуализации получаемых результатов, создание приложений с графическим интерфейсом пользователя. Предназначено для студентов механико-математического факультета БГУ очной и заочной форм обучения, а также для всех, кто связан с научными ис- следованиями и инженерной работой. УДК 519.67-37 ББК 22.19 © Голубева Л. Л., Малевич А. Э., Щеглова Н. Л., 2007 ISBN 978-985-485-565-3 © БГУ, 2007
ВВЕДЕНИЕ MATLAB® (MATrix LAB oratory) - это высокоэффективная система инженерных и научных расчетов фирмы The MathWorks, Inc (USA). Вы- числения, визуализация и программирование в нем представлены в удобной для работы среде, где задачи и решения выражены в знакомой математической форме. Представление данных в виде массивов (матриц и векторов) обеспечивает пользователю широкие возможности решения задач, связанных с матрицами и матричными вычислениями, по сравне- нию с большинством языков программирования. Первоначально MATLAB разрабатывался как диалоговая среда для матричных вычисле- ний и обеспечивал легкий доступ к библиотекам программ LINPACK и EISPACK. Сегодня инструменты MATLAB включают в себя библиотеки LAP АСК и BLAS, интегрирующие последние достижения в области про- граммного обеспечении для проведения матричных расчетов. Непрерыв- ная модернизация и расширение возможностей MATLAB, совершенст- вование заложенных алгоритмов и добавление новых команд привели к тому, что в настоящее время MATLAB является мощным, надежным и универсальным средством решения задач в самых разных областях чело- веческой деятельности. Наиболее известные области применения систе- мы MATLAB: • математические вычисления; • разработка алгоритмов; • сбор информации; • вычислительный эксперимент, имитационное моделирование, макети- рование; • анализ данных, исследование и визуализация результатов; • научная и инженерная графика; • разработка приложений, включая создание графического интерфейса пользователя GUI. MATLAB - это интерактивная система, основным объектом которой является массив, не требующий явного указания размерности. Это по- зволяет решать многие технические вычислительные задачи, сформули- рованные в матричных и векторных формах, за меньшее количество вре- мени, чем потребовалось бы при написании программы на скалярном языке типа С или FORTRAN.
4 Введение В университетской среде MATLAB является стандартным учебным инструментом для начальных и старших курсов при изучении математи- ки, инженерии и науки в целом. В промышленности MATLAB является инструментом для проведения высокоэффективных исследований, ана- лиза данных и разработок. В настоящее время широко используется MATLAB версии 6.5, недавно вышла версия 7.0.1 Service Pack 1. Курс лекций состоит из девяти тем. Тема 1 посвящена назначению и структуре пакета MATLAB. В ней подробно описывается графический интерфейс пользователя среды MATLAB. В темах 2 и 3 рассматриваются вопросы, касающиеся работы с дан- ными, принципы представления данных в виде массивов, матриц и век- торов, вычисления арифметических выражений, а также использование основных конструкций языка программирования MATLAB. Тема 4 информирует о правилах написания функций, работы с ло- кальными и глобальными переменными. Основы объектно-ориентированного программирования, заложен- ные в MATLAB, изучаются в теме 5. На конкретном примере рассматри- ваются этапы создания классов. Тема 6 знакомит с высокоуровневой графикой среды MATLAB, описываются возможности визуального представления и исследования данных в виде графиков линий и поверхностей, диаграмм, гистограмм. Создание и управление графическими объектами как элементами дескрипторной графики рассматривается в теме 7. Вопросы импорта и экспорта данных, организации работы с файла- ми разных форматов представлены в теме 8. Тема 9 посвящена процессу создания приложений с графическим интерфейсом пользователя. В курсе лекций излагаются основы работы в среде MATLAB. Пред- лагаемое издание в первую очередь адресовано студентам механико- математического и физического факультетов университета, но может ис- пользоваться студентами инженерно-технических специальностей, аспи- рантами, преподавателями, научными работниками и всеми, кто в той или иной степени связан с научными исследованиями и инженерной ра- ботой, где требуется математика.
ТЕМА 1 НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB MATLAB - это интерактивная система, основным объектом которой является массив, не требующий явного указания размерности. Это по- зволяет решать многие вычислительные задачи, связанные с векторно- матричными формулировками. По-прежнему поддерживая диалоговый интерактивный режим для простых вычислений и операций, современный MATLAB - это одновре- менно и операционная среда, и язык программирования, на котором мо- гут быть написаны программы для многократного использования, в том числе и сложные программы с развитым графическим интерфейсом. Пользователь сам может написать специализированные функции и про- граммы, которые оформляются в виде М-файлов. Концепция пакетов прикладных программ MATLAB Application Toolboxes решает проблему классификации большого количества на- писанных программ. Пакеты Toolboxes представляют собой коллек- ции М-файлов, предназначенные для решения определенной задачи, а также позволяющие изучать и применять различные специальные техно- логии. Открытость кода встроенных функций MATLAB дает возможность пользователям исследовать запрограммированные алгоритмы и, при не- обходимости, использовать их. Полная справочная система MATLAB содержит подробное описа- ние компонентов MATLAB, его структуры, встроенных функций и большое число примеров их использования. Доступ из командной строки к кратким сведениям о встроенных функциях обеспечивает возможность быстрого выбора нужного формата обращения к функциям. Обзор возможностей MATLAB представляет демонстрационная программа Demo. Для ее запуска следует ввести в командной строке, обозначенной символом приглашения », команду demo и нажать кла- вишу <Enter> или выбрать соответствующий пункт меню.
6 Т е м a 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB 1.1. Структура системы MATLAB 1.1.1. Основные части MATLAB Система MATLAB состоит из пяти основных частей: Среда разработки - это набор инструментов и средств, которые помогают использовать функции и файлы MATLAB. Многие из этих ин- струментов являются графическими интерфейсами пользователя. Среда разработки включает в себя рабочий стол MATLAB (MATLAB Desktop), командное окно (Command Window), историю команд (Command History), редактор-отладчик М-файлов (Editor and Debugger), браузеры для просмотра рабочего пространства (Work- space), справочной системы (Help), файлов (files) и поискового пу- ти (Search Path). Библиотека математических Функций MATLAB - это об- ширное собрание вычислительных алгоритмов, начиная с элементарных функций, таких как сумма, синус, косинус, до более сложных функций подобно нахождению обратной матрицы или собственных значений мат- рицы, функций Бесселя, преобразований Фурье. Язык программирования MATLAB - это высокоуровневый язык матриц и массивов с операторами управления, функциями, структурами данных, вводом-выводом и возможностями объектно-ориентированного программирования. Это позволяет программировать как локально, созда- вая небольшие тестовые программы, так и глобально, то есть разрабаты- вать сложные прикладные программы. Графика. MATLAB обладает обширными средствами для пред- ставления векторов и матриц в виде графиков. Эти средства включают в себя функции высокого уровня, предназначенные для двухмерной и трехмерной визуализации данных, обработки изображения, анимации и презентационной графики. А также содержат функции низкого уровня, которые позволяют полностью настраивать вид графика. В среде MATLAB можно разрабатывать собственные сложные приложения с полноценными графическими интерфейсами пользователя. Интерфейс прикладного программирования MATLAB - это библиотека, которая позволяет писать программы, взаимодействующие с MATLAB, на языках С и FORTRAN. Она включает в себя средства для вызова функций из MATLAB (динамическое связывание), вызова самого MATLAB как вычислительного инструмента, а также средства для чте- ния/записи МАТ-файлов.
1.1. Структура системы MATLAB 7 1.1.2. Сервисные программы MATLAB Сервисные программы (Toolbox) представляют собой наборы функций MATLAB (М-файлы), позволяющих расширить среду MATLAB для решения особых классов задач. Toolboxes могут быть выборочно установлены вместе с MATLAB по желанию пользователя. В состав многих Toolboxes входят приложения с графическим интер- фейсом пользователя, что обеспечивает быстрый и наглядный доступ к основным функциям. Данные пакеты позволяют решать широкий класс специфических задач и вместе с тем изучать и применять специализиро- ванные технологии. Области применения включают в себя обработку сигналов (signal processing), системы управления (control systems), нейронные сети (neural networks), вейвлеты (wave- lets), моделирование (simulation) и многое другое. MATLAB Web Server позволяет создавать приложения, которые используют возможности мировой сети для пересылки данных в MATLAB для выполнения вычислений и отображения результатов в Web-браузере. MATLAB Web Server использует протокол TCP/IP для обмена данными между системой клиента и MATLAB. Notebook. Интеграция MATLAB и Microsoft Word обеспечивает возможность написания в редакторе Word интерактивных документов - М-книг, содержащих текст, команды MATLAB и результаты выполнения этих команд. Пользователь, работающий с М-книгой, может запускать блоки команд MATLAB непосредственно из документа Word, при этом результат выполнения команд отображается в М-книге. Такая возмож- ность применяется при создании отчетов и учебных пособий, позволяя дополнить документ примерами и результатами расчетов. Excel Link является расширением программного обеспечения, выполняющим интеграцию Excel и MATLAB в среду Microsoft Windows. Надстройка Excel Link, поставляемая вместе с MATLAB, существенно расширяет возможности Excel, обеспечивая доступ пользователя к функ- циям MATLAB из ячеек рабочего листа. BioInformatics Toolbox предоставляет интегрируемую среду для проведения научных исследований в области биологии, при разра- ботке медицинских препаратов, решении задач генной инженерии. Database Toolbox. Информация, хранящаяся в базах данных многих популярных форматов (Microsoft Access, Microsoft Excel, Micro- soft SQL Server, MySQL, Oracle и т. д.), может быть импортирована в MATLAB, обработана и исследована при помощи функций MATLAB, а
8 Т е м a 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB затем экспортирована в какую-либо другую базу данных. Для обмена данными используются команды языка запросов SQL. Financial Toolbox предоставляет вычислительную среду в области финансового анализа и инженерии. Содержит все необходимое для проведения математического и статистического анализа финансовой информации и отображения результатов в виде графиков и диаграмм. Image Processing Toolbox представляет собой набор функ- ций, расширяющих возможности MATLAB как числовой вычислитель- ной среды. Содержит функции цифровой обработки и анализа изображе- ний, импорта и экспорта графической информации, разработки линей- ных фильтров, а также различные методы представления цветов, преоб- разования типов изображений. Optimization Toolbox предназначен для решения линейных и нелинейных задач оптимизации. В его состав входят функции, реали- зующие основные и специальные алгоритмы оптимизации. Класс задач включает, например, минимаксные задачи, задачи о достижении цели, линейное и квадратичное программирование, минимизацию нелинейных функций при наличии нелинейных ограничений. Partial Differential Equation Toolbox позволяет ре- шать задачи математической физики, описываемые уравнениями в част- ных производных, методом конечных элементов. В его состав входит приложение pdetool с графическим интерфейсом пользователя, вклю- чающее в себя набор функций, полезных при написании собственных приложений для решения граничных задач методом конечных элемен- тов. Среда pdetool позволяет задавать геометрию области, тип и коэф- фициенты дифференциального уравнения, граничные и начальные усло- вия, производить разбиение области на конечные элементы (триангуля- цию), решать получающуюся систему линейных уравнений и визуализи- ровать результат. Spline Toolbox упрощает создание и работу с кусочно- полиномиальными функциями. Одним из основных назначений данного Toolbox является создание с последующим использованием и визуализа- цией кусочно-полиномиальной аппроксимации. Symbolic Math Toolbox. Символьные вычисления в MATLAB основаны на библиотеке, являющейся ядром пакета Maple. Решение уравнений и систем, интегрирование и дифференцирование, вычисление пределов, разложение в ряд и суммирование рядов, решение дифферен- циальных уравнений и систем - вот далеко не полный перечень возмож- ностей MATLAB для проведения аналитических выкладок и расчетов.
1.1. Структура системы MATLAB 9 Statistics Toolbox содержит функции, охватывающие широ- кий спектр статистических задач и реализующие основные методы их решения. Virtual Reality Toolbox позволяет соединить виртуальный мир, написанный при помощи языка VRML, с Simulink и MATLAB, взаимодействовать в реальном времени с моделями динамических сис- тем виртуальной реальности, расширяет возможности MATLAB и Simu- link в области графики виртуальной реальности. На языке программиро- вания MATLAB описываются необходимые функции, при помощи Simu- link и Stateflow создаются модели в виде блок-схем и имитируется их ра- бота, язык VRML обеспечивает построение виртуальных миров и трех- мерных сцен. Wavelet Toolbox содержит набор функций, которые предостав- ляют возможности анализа и синтеза сигналов и изображений, а также средства для использования вейвлетов и вейвлет-пакетов. Предоставляет две категории методов работы: функции командной строки и графиче- ские интерактивные функции. Simulink предназначен для интерактивного моделирования и анализа функционирования линейных и нелинейных динамических сис- тем, работающих непрерывно или дискретно в определяемые промежут- ки времени. Оснащенный графическим интерфейсом пользователя и ис- черпывающей библиотекой компонентов Simulink предлагает построе- ние моделей в виде блок-схем на основе использования Click&Drag опе- раций с мышью. Модель можно построить с нуля или взять уже сущест- вующую модель и доработать ее. Целью Simulink является предоставле- ние пользователю возможности понять смысл и назначение моделирова- ния и имитации процессов. В среде Simulink пользователь имеет воз- можность поставить вопрос, смоделировать его и посмотреть, что проис- ходит при изменении значений параметров процесса. Использование векторно-матричного представления данных, мат- ричных вычислений, а также оснащение мощной графической системой, средствами компьютерной алгебры от Maple, сервисными программами для решения специальных классов задач привели к тому, что сегодня MATLAB фактически является стандартным расчетным средством и ин- струментом для инженерных и технических разработок. Система MATLAB ориентирована на работу с реальными данными, поэтому вы- полняет все вычисления в арифметике с плавающей точкой. Сравнительная характеристика двух ведущих пакетов компьютер- ной математики представлена в табл. 1.1.
10 Т е м a 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB Таблица 1.1. Сравнительная характеристика математических пакетов Характеристика MATHEMATICA MATLAB Тип пакета Символьный Числовой Точность вычис- лений Не ограничена Ограничена разрядностью процессора Основной объект данных Выражение Матрица Вычисления Целочисленная ариф- метика Арифметика с плавающей точкой 1.2. Интерфейс пользователя Среда разработки - это набор инструментов и средств, которые помогают использовать функции и файлы MATLAB, а также поддержи- вают связь MATLAB с пользователем и другими приложениями. Многие из этих инструментов являются графическими интерфейсами пользова- теля. Среда разработки включает в себя рабочий стол MATLAB Desktop, браузеры для просмотра справочной системы Help, файлов и поискового пути Search Path. Интерфейс рабочего стола MATLAB Desktop представляет собой графический интерфейс пользователя, состоящий из следующих основ- ных элементов: • меню, пункты которого автоматически перенастраиваются в зависимо- сти от того, какое окно рабочей среды является в данный момент ак- тивным; • панели инструментов с кнопками и раскрывающимся списком; • нескольких окон; • кнопки Start, с помощью которой можно получить доступ к содер- жимому рабочей среды, различным модулям Toolbox, справочной системе и демонстрационным программам; • строки состояния. К окнам MATLAB Desktop относятся: • командное окно Command Window; • окно просмотра рабочего пространства Workspace Browser; • окно текущего каталога Current Directory;
1.2. Интерфейс пользователя 11 • окно истории команд Command History; • окно редактора-отладчика М-файлов M-file Editor/Debugger; • окна для работы с графикой Figures. Меню изменяется, Используйте tab Просмотр и в зависимости от для перехода к изменение Перемещение Command Window за того, с чем вы Workspace Вызов текущей пределы рабочего стола. работаете. браузеру. помощи. диРектоРин' nmn Просматривайте или Нажмите Start для г ; Тяните за разделительную к, выполняйте ранее \_ быстрого доступа к г полосу для изменения Вводите команды в пл^+i^K использовавшиеся команды .. , возможностям Matlab. размеров окон. командной строке Matlab. с помощью Command History. Рис. 1.1. Пример внешнего вида рабочего стола MATLAB Desktop Помимо основных окон (рис. 1.1) в MATLAB существует ряд вспо- могательных окон, обеспечивающих пользователям более эффективную работу в MATLAB. Такими окнами являются: окно редактора массивов Array Editor, диалоговое окно установки путей Set Path, окно Launch Pad доступа к различным модулям Toolbox, окно просмотра справочной системы Help Browser.
12 Т е м a 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB Окна рабочей среды самостоятельны, «склеены» между собой, мо- гут располагаться в виде вкладок или в виде отдельных окон. Технология Drag&Dock позволяет полностью перенастраивать внешний вид MATLAB Desktop по желанию пользователя. Если в MATLAB Desk- top отсутствуют некоторые окна, то в меню Desktop следует выбрать соответствующие пункты Command Window, Workspace, Current Directory, Command History, Launch Pad или выбрать пункт меню Desktop | Desktop Layout ► Default для восстановления настроек интерфейса MATLAB Desktop по умолчанию. 1.2.1. Командное окно Командное окно Command Window системы MATLAB использует- ся для работы в интерактивном режиме: ввода данных, создания пере- менных, вызова функций, запуска команд и М-файлов и вывода резуль- татов их выполнения по типу вопрос-ответ (рис. 1.2). Вся видимая информация в окне Command Window располагается в двух принципиально разных зонах: зоне просмотра и зоне редактиро- вания. > MATLAB File Edit View Web Window Help В зоне просмотра ничего нельзя изменить. Любая попытка ввода с клавиатуры в этой зоне приведет к автоматическому перемещению кур- сора, т. е. точки ввода в командную строку Input Line, расположен- ную в зоне редактирования. В зоне просмотра можно выделять с помо-
1.2. Интерфейс пользователя 13 щью мыши любую информацию и копировать ее в буфер обмена Clip- board операционной системы Windows. Зона редактирования обычно занимает одну (последнюю) строку командного окна системы MATLAB, в которой обычно указан знак при- глашения ». Эта строка называется строкой ввода Input Line, или командной строкой. Ввод любой команды или выражения осуществляет- ся только в строке, помеченной символом ». Чтобы MATLAB выпол- нил введенную команду или вычислил выражение, необходимо нажать клавишу <Enter>. » а = 1:6 а = 123456 » а(2) ans = 2 » magic(4) ans =816 3 5 7 4 9 2 » run Untitledl.m » [X, Y] = myfunc(x, y, z); » x = -2*pi : 0.01 : 2*pi; » plot(x, sin(x),x, cos(x)) Если вводимая информация не помещается в одну строку, то логи- ческую строку можно разбить на несколько физических строк (рис. 1.3). 'A Command Window - I nliR3 File Edit View Web Window Help » b = 1 + 2 + 3 + 4 + . . . A + 5 + 6 + 74-8 + 9+ ... + 10 b = 55 Рис. 1.3. Ввод информации в командную строку
14 Т е м a 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB Для переноса ввода на следующую физическую строку следует нажать клавишу <Enter> только после ввода трех идущих подряд точек. В противном случае MATLAB воспримет нажатие на клавишу <Enter> как окончание ввода команды и приступит к выполнению введенной час- ти команды. Однако и в случае размещения команды в нескольких стро- ках зона редактирования относится только к самой последней строке (в данной ситуации она не содержит знак приглашения »), а в предыду- щих физических строках изменить уже ничего нельзя. Логическая строка ввода может содержать не более 256 символов. MATLAB вычислит все выражение или выполнит команду после нажатия на клавишу <Enter> в последней строке, не содержащей трех идущих подряд точек. В процессе работы в интерактивном режиме действия повторяются многократно: вводится с клавиатуры новая информация, запускаются команды, выводятся полученные данные. В результате в окне Command Window производится скроллинг (прокрутка) — все строки сдвигаются на одну позицию вверх, так что самая верхняя строка покидает область видимости, а в самом низу окна появляется свободная строка для ввода новой информации. При помощи полосы прокрутки (Scrollbar) мож- но осуществить просмотр невидимой в данный момент в окне информа- ции. Можно также осуществлять прокрутку содержимого окна Command Window с помощью клавиш клавиатуры <PageUp>, <PageDown>, <Ctrl + Home> и <Ctrl+End>. Клавиши <?>и<;>в системе MATLAB работают иначе, чем в лю- бом текстовом редакторе, где они осуществляют перемещение курсора вверх-вниз и прокрутку содержимого окна. В MATLAB вся информация, введенная с клавиатуры в течение сеанса работы, запоминается в специ- альной области памяти, называемой стеком команд. Клавиши < $ > и <; > позволяют вернуть в строку ввода ранее введенные с клавиатуры команды. При этом самая последняя входная информация при ее про- крутке клавишей < $ > появится первой. Затем появится предпоследняя команда и так далее. Клавиша <; > осуществляет прокрутку команд в об- ратном направлении. Обратите внимание • Ввод любой команды или выражения осуществляется только в строке, помеченной символом » приглашения командной строки.
1.2. Интерфейс пользователя 15 • Завершение ввода команды и передача управления MATLAB для ее выполнения происходят по клавише < Е n t е г >. • Для повторного занесения в командную строку ранее введенной ко- манды или выражения служат клавиши < $ > и <; >. • Для перемещения по командной строке с выражением служат клавиши <^>, <^>, <Home>, <End>. • Если после перемещения по рабочей области окна Command Window пропала командная строка с мигающим курсором, то следует нажать <Enter>. Командное окно Command Window можно очистить командой » clc однако это не повлияет на содержимое рабочего пространства Work- space. Действительно, если после очистки командного окна набрать в командной строке имя ранее вычисленной переменной х, то после на- жатия клавиши <Enter> в окне Command Window появится ее значе- ние: » х X = 12 1.2.2. Окно просмотра рабочего пространства Все значения переменных, вычисленные в течение текущего сеанса работы системы MATLAB, сохраняются в специальной области памяти компьютера, называемой рабочим пространством Workspace. Workspace ?" X | ^1 Й ® "Н О | ’fc | ЕЕ ’ Stack: Name i- Value Class Base T ЕВ А [15 16 17 18] double О]М <3x1 cell> cell 1S <1x2struct> struct ab^V The Langua... char 21 I ► Рис. 1.4. Окно Workspace browser Содержимое этой области можно просмотреть в окне Workspace Browser (рис. 1.4), вызвав его из меню Desktop | Workspace или
16 Т е м a 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB кнопкой Workspace Browser инструментальной панели. Окно Workspace Browser обеспечивает просмотр и редактирование имен и значений находящихся в рабочем пространстве Workspace перемен- ных, вывод массивов информации в виде графиков и диаграмм, а также предоставляет доступ к графическому интерфейсу Import Wizard для считывания данных из бинарных и текстовых файлов. Инструментальная панель окна Workspace Browser позволяет создавать и удалять пе- ременные, сохранять и загружать данные рабочего пространства Work- space. Рабочее пространство Workspace - это множество реально суще- ствующих переменных. При работе с переменными необходимо следо- вать следующим правилам: • Все есть массив. Двумерный массив - это матрица, одномерный мас- сив - это вектор-строка или вектор-столбец, скаляр - это матрица раз- мером 1x1. Все массивы имеют размерность и валентность, которые изменяются (увеличиваются или уменьшаются по мере необходимо- сти). • Переменные в MATLAB не нужно предварительно описывать, указы- вая их тип и размерность. Все данные хранятся в виде массивов: чи- словые переменные (внутренний тип numeric), текстовые строки (char), ячейки (cell) и структуры (struct), при помощи которых создаются пользовательские объекты (user ob j еct). • Числовые массивы состоят из комплексных чисел с двойной точно- стью (тип double) и могут храниться в обычном (тип full) или в упакованном виде в случае разреженной матрицы (тип sparse). • Существует несколько дополнительных форматов записи данных в файлы (int8, uint8,...), отличающихся количеством используемых байтов на единицу информации. • Для представления чисел на экране используются различные форматы вывода. • Имя переменной должно начинаться с буквы, за ней могут идти буквы, цифры и символ подчеркивания. Допустимы имена любой длины, но MATLAB идентифицирует их по первым 31 символам и различает верхний и нижний регистры. • В MATLAB имеется ряд зарезервированных имен констант, перечис- ленных в табл. 2.2. • Специальная переменная ans содержит результат последней выпол- ненной операции, если во введенной команде отсутствует операция
1.2. Интерфейс пользователя 17 присваивания результата «=». Переменную ans можно использовать в выражениях и командах » 1+18 ans = 19 » х = ans +7 х = 26 » х(2) = -4 х = 26 -4 » х(1) = [] х = -4 » х = 'This is MATLAB' х = This is MATLAB Для просмотра значения любой переменной из рабочего пространства Workspace достаточно набрать ее имя и нажать клавишу <Enter>. » х х = This is MATLAB Команда » who выведет список всех переменных, входящих на данный момент в рабочее пространство Workspace, а команда » whos вернет более подробную информацию о размере и типе переменных. Таким образом, MATLAB автоматически сохраняет все полученные результаты, а также все команды, выполненные в течение сеанса работы (даже если они введены с ошибкой). Однако если объем запомненной информации станет слишком большим или уже не требуется хранить не- которые переменные в данном сеансе работы, их можно стереть из памя- ти компьютера командой clear. Чтобы очистить рабочее пространство, следует вызвать команду » clear Следующая команда удаляет из рабочего пространства Work- space переменные с именами namel и name2. » clear namel1 name2
18 Т е м a 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB По окончании сеанса работы MATLAB все переменные, вычислен- ные в течение сеанса, уничтожаются. Однако их можно сохранить в фай- ле на диске при помощи пунктов главного или всплывающего меню File | Save Workspace As... посредством стандартного диалого- вого окна операционной системы Windows для выбора каталога на диске и имени файла. Расширение имени сохраняемого файла должно быть mat. Такие файлы, предназначенные для хранения данных рабочего про- странства Workspace, называются МАТ-файлами. Вместо команды меню можно в окне Command Window набрать одну из команд: » save - сохранение в стандартный файл (по умолчанию matlab.mat); » save path\File_name - сохранение в указанный файл; » save path\File_name namel name2 - сохранение отдельных переменных в указанный файл. Восстанавливается ранее сохраненное на диске рабочее пространст- во Workspace командой меню File | Load Workspace... или File | Import Data..., после которой в стандартном диалоговом окне необходимо выбрать требуемый МАТ-файл. Выполнив эту команду несколько раз с разными файлами, можно разместить в рабочем пространстве Workspace результаты ряда пре- дыдущих сеансов работы. При этом необходимо учитывать, что если имена переменных из разных МАТ-файлов совпадают, то в Workspace будет находиться лишь переменная из МАТ-файла, загруженного по- следним. Вместо команды меню можно набрать команду непосредственно в окне Command Window » load - загрузка данных из файла по умолчанию mat lab. mat. » load file_name - загрузка из указанного файла. » load file_name namel name2 - чтение отдельных перемен- ных из указанного файла. При этом если имя файла указывается без полного пути доступа к нему, то он должен находиться в текущем каталоге Current Direc- tory системы MATLAB. Полное имя текущего каталога можно узнать с помощью команды » cd
1.2. Интерфейс пользователя 19 1.2.3. Редактор массивов Графическое окно редактора массивов Array Editor предназна- чено для просмотра и редактирования визуально представленных данных рабочего пространства Workspace (рис. 1.5). Рис. 1.5. Редактор массивов Array Editor Двойной щелчок по переменной, находящейся в Workspace Browser, открывает графическое окно Array Editor и создает за- кладку в виде страницы блокнота с именем переменной внизу окна ре- дактора, содержащую всю информацию о данной переменной. Встроенная панель инструментов позволяет сохранять, копировать, распечатывать данные, отображать их в виде графиков и диаграмм. Всплывающее меню позволяет копировать данные из Array Editor и вставлять их в Command Window и наоборот. Также имеется возмож- ность копировать/вставлять ячейки в документы Microsoft Excel. При этом не допускается рассогласования копируемых данных по типу. 1.2.4. Текущий каталог Файловые операции MATLAB используют текущий каталог Cur- rent Directory и список путей доступа Search Path. Любой файл, который пользователь хочет запустить, должен размещаться или в каталоге, указанном в окне Current Directory, или в каталоге, ука- занном в списке путей доступа Search Path.
20 Т е м a 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB Для поиска, просмотра и изменения каталогов и файлов следует ис- пользовать окно просмотра текущего каталога Current Directory browser (рис. 1.6) либо функции, выполняющие следующие действия: » dir - вывод содержимого текущего каталога; » delete f ile_name - удаление указанного файла с диска; » cd - вывод текущего каталога; » cd <new path> - выбор другого текущего каталога. Рис. 1.6. Окно Current Directory Быстрый способ просмотра или изменения текущего каталога Cur- rent Directory состоит в использовании раскрывающегося списка Current Directory инструментальной панели рабочего стола Desktop. MATLAB использует список путей доступа Search Path для на- хождения М-файлов и других файлов, которые организованы в каталоги файловой системы компьютера. Чтобы сделать доступной программу или функцию из какого-нибудь каталога, необходимо добавить путь к этому каталогу в список Search Path. Подкаталоги также должны быть явно добавлены в Search Path, даже если родительский каталог уже включен в список.
1.2. Интерфейс пользователя 21 По умолчанию каталоги MATLAB, в которых находятся функции пакета и данные, и файлы, поставляемые с MATLAB и другими Math- Works продуктами, включены в список Search Path. Все они нахо- дятся в каталогах вида $matlabroot/toolbox. Для того чтобы просмотреть, какие каталоги включены в список Search Path или изменить его, следует выбрать пункт меню File | Set Path, либо выбрать кнопку Start | Desktop Tools ► Path либо ввести команду pathtool в окне Command Window и использо- вать открывшееся диалоговое окно Set Path (рис. 1.7). Рис. 1.7. Диалоговое окно Set Path В этом окне показывается список всех зарегистрированных путей доступа. Либо следует задать команды в окне Command Window для выполнения следующих действий: » path - вывод списка путей доступа; » path (s) - замена списка путей доступа списком s; » addpath /temp/dir - добавление нового каталога в список; » path (path, '/temp/dir') - добавление нового каталога в список;
22 Т е м a 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB » rmpath / temp/dir - удаление указанного пути из списка. После того, как новый каталог добавлен в список Search Path, в нем можно сохранять файлы и в любой момент выполнять их. 1.2.5. История команд Окно истории команд Command History (рис. 1.8) предназначено для просмотра и повторного вызова ранее введенных команд. Все коман- ды, которые пользователь вводит в окне Command Window, автомати- чески дублируются в окне Command History. Окно Command His- tory содержит время и дату каждого сеанса работы с MATLAB. В этом окне можно просмотреть все ранее выполненные команды, удалить, ско- пировать и выполнить выделенные команды в окне Command Window либо оформить их в виде функции в М-файле в окне редактора- отладчика М-файлов M-file Editor/Debugger. MATLAB File Edit Debug Desktop Window Help Current Directory Command History [ Start | Рис. 1.8. Окно Command History Для активизации окна Command History необходимо выбрать вкладку с одноименным названием. Текущая команда в окне изобража- ется на синем фоне. Если щелкнуть на какой-либо команде в окне левой кнопкой мыши, то данная команда становится текущей. Для ее выполне-
1.2. Интерфейс пользователя 23 ния надо применить двойной щелчок мыши или выбрать строку с коман- дой при помощи клавиш <?>,<;> и нажать клавишу <Enter>. Ненуж- ную команду можно убрать из окна. Для этого надо сделать ее текущей и удалить при помощи клавиши <Delete>. Комбинация клавиш <Shift>+<?>, <Shift>+<;> позволяет выделить несколько подряд идущих команд. Если команды не идут одна за другой, то для их выделе- ния следует использовать левую кнопку мыши с одновременным удер- живанием клавиши <Ctrl>. Выполнение или удаление группы команд происходит аналогично при помощи клавиш <Enter> и <Delete> со- ответственно. При щелчке правой кнопки мыши по области окна Command His- tory появляется всплывающее меню со следующими пунктами: • Сору - копирование отмеченной команды или группы команд в буфер обмена Clipboard; • Create M-file - копирование отмеченной команды или группы команд в M-file; • Evaluate Selection - выполнение отмеченной команды или группы команд; • Delete Selection - удаление отмеченной команды или группы команд; • Delete to Selection - удаление всех команд до текущей; • Delete Entire History - удаление всех команд. 1.2.6. Редактор-отладчик М-файлов Работа из командной строки удобна только для выполнения про- стых, недлинных команд. В остальных случаях предпочтительно созда- ние М-файлов, т. е. программ и функций, содержащих нужную последо- вательность команд MATLAB. Для работы с М-файлами предназначен редактор-отладчик М-файлов М-File Editor/Debugger, который выполняет все операции по созданию, редактированию, отладке и сохра- нению М-файлов (рис. 1.9). С его помощью можно создавать собствен- ные функции и вызывать их, в том числе и из командной строки. Вызывается М-File Editor/Debugger либо через главное ме- ню File | New ► M-file, File | Open..., либо с помощью функций окна Command Window » edit » edit M-file name
24 Т е м a 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB Встроенное меню и панель инструментов позволяют оперативно вводить, редактировать и запускать и отлаживать код программы. Рис. 1.9. Редактор M-file Editor/Debugger Наберите в редакторе команды, строящие графики двух функций в одной системе координат графического окна. » Х= -pi:0.01:2 *pi; Y=sin(X); % Y(2,:)=cos(X); % plot(X,Y) % значение аргумента функций значение функции sin значение функции cos вывод графика Сохраните файл с именем demofile.m в текущем каталоге MATLAB, выбрав пункт меню File | Save As... редактора. Для за- пуска на выполнение всех команд, содержащихся в файле, следует вы- брать пункт меню Debug | Run или нажать клавишу <F5> на клавиа- туре. В окне Workspace появятся две переменные X и Y, а на экране откроется окно Figure, содержащее графики указанных функций. Команды М-файла осуществляют вывод результатов в окно Com- mand Window. Для подавления вывода следует завершать команды точ- кой с запятой. Если в набранном коде есть ошибка, то происходит выполнение ко- манд до первой неправильно введенной команды, после чего в окне Command Window выводится сообщение об ошибке.
1.2. Интерфейс пользователя 25 При последующем редактировании кода программы необходимо перед запуском программы сохранить внесенные изменения в файле, вы- брав команду File | Save. В MATLAB имеется возможность выполнения только части команд кода. Для этого необходимо выделить группу команд и выполнить их из пункта меню Text | Evaluate Selection окна редактора, из пункта Evaluate Selection всплывающего меню или клавишей <F9> на клавиатуре. Комментарий в MATLAB начинается с символа %, автоматически выделяется зеленым цветом и распространяется до конца текущей строки. В редакторе М-файлов может быть одновременно открыто несколь- ко файлов. Переход между файлами осуществляется при помощи закла- док с именами файлов, расположенных внизу окна редактора. 1.2.7. Окна для работы с графикой В MATLAB встроена мощная графическая поддержка, обеспечи- вающая возможности визуализации 2D- и ЗВ-данных при помощи окон для работы с графикой Figure (рис. 1.10). Высокоуровневые графиче- ские функции обеспечивают быстрое получение качественных результа- тов. Полный доступ к изменению свойств отображаемых графиков дают низкоуровневые функции, или так называемая дескрипторная графика. Окно Figure, обладающее собственным меню и панелью инструмен- тов, помогает оформить результаты: добавить заголовки, поясняющие надписи, легенды, задать цвета, стиль линий и поверхностей. MATLAB предоставляет следующие возможности работы с не- сколькими графиками: • вывод каждого графика в отдельное окно Figure; • вывод нескольких графиков в одно окно в одни координатные оси; • вывод в пределах одного окна нескольких графиков, каждого в своих осях. Для создания нового пустого окна Figure и отображения его на экране служит команда Окно Figure № 1 становится текущим, т. е. все последующие графи- ческие функции будут осуществлять построение графиков в этом окне. Повторное использование команды figure приведет к появлению ново-
26 Т е м a 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB го графического окна Figure № 2, которое теперь становится теку- щим. Все последующие команды будут осуществлять вывод графиков в окне Figure № 2. Для того чтобы снова сделать текущим окно Fig- ure № 1, необходимо щелкнуть на нем мышкой. В системе MATLAB нет ограничений на количество создаваемых окон. Рис. 1.10. Окно для работы с графикой Figure
1.2. Интерфейс пользователя 27 1.2.8. Окно просмотра справочной системы Окно просмотра справочной системы Help Browser помогает найти документацию, демонстрационные примеры (рис. 1.11). Чтобы от- крыть окно Help Browser, необходимо нажать на кнопку «?» на па- нели инструментов или ввести в окне Command Window одну из ко- манд » helpbrowser или doc Справочная система на английском языке содержит описание струк- туры и возможностей MATLAB, встроенных функций и многочисленные примеры их использования. Ссылочная структура позволяет переходить к разделам, относящимся к рассматриваемому вопросу. Рис. 1.11. Окно просмотра справочной системы Help Browser Информацию о командах, операторах и функциях MATLAB можно получить из окна Command Window. Для этого в командной строке сле- дует набрать команду help, передав в качестве аргумента имя изучае- мой функции, например:
28 Т е м a 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB » help for - получить справку об операторе цикла for; » help format - получить справку о форматах вывода данных. 1.2.9. Кнопка Start и окно Launch Pad Кнопка Start и окно Launch Pad обеспечивают легкий доступ к структуре системы, различным модулям Toolboxes, демонстраци- онным примерам, справочной системе и документации. 1.3. Взаимодействие с другими приложениями Программный интерфейс приложения (API) реализует связь среды MATLAB с приложениями, написанными на других языках. Существует несколько способов взаимодействия системы MATLAB с другими при- ложениями. Все способы описаны в документации к системе. • Библиотека программного интерфейса позволяет вызывать модули, написанные на С или Fortran, из среды или программ MATLAB. • Ядро MATLAB может выступать в роли вычислительного сервера для внешнего приложения. • Со средой MATLAB можно обмениваться данными через МАТ-файлы. • Средой MATLAB можно управлять при помощи DDE (Dynamic Data Exchange) или COM-технологии. Предоставляемый набор способов взаимодействия с внешними при- ложениями является весьма полным и гибким. В MATLAB предусмотрена возможность запуска внешних прило- жений из окна Command Window. » ! notepad info.txt - запуск текстового редактора «Блокнот». » !mspaint picture.bmp - запуск графического редактора «MS Paint». » ! calc - запуск приложения «Калькулятор». » ! excel. ехе & - запуск приложения Excel. Знак «!» указывает, что остаток строки ввода Input Line является командой для операционной системы. Знак «&» на платформе Windows запускает приложение в отдельном окне или в фоновом режиме.
ТЕМА 2 ДАННЫЕ И ВЫЧИСЛЕНИЯ Язык MATLAB - это высокоуровневый язык матриц и массивов с операторами управления, функциями, структурами данных, вводом- выводом и возможностями объектно-ориентированного программирова- ния. Это позволяет создавать широкий диапазон программ: от неболь- ших тестовых программ до сложных прикладных программ, оснащенных графическим интерфейсом пользователя. Изначально MATLAB был реализован на языке Fortran. Современ- ные версии пишутся на языке С. Язык MATLAB конструкциями и син- таксисом напоминает эти языки. 2.1. Арифметические вычисления Встроенные функции MATLAB позволяют находить значения раз- личных выражений. Команды для вычисления выражений имеют вид, свойственный всем языкам программирования высокого уровня. Обратите внимание • Операторы имеют две формы записи. При записи оператора с неявным присваиванием вида х+у результат присваивается автоматически создаваемой системой переменной с именем ans (ANSwer) . В пе- ременной ans сохраняется только результат выполнения последнего оператора с неявным присваиванием. • При записи оператора с явным присваиванием вида а = х+у резуль- тат присваивается переменной, стоящей слева от знака равенства. • Если после выражения не стоит точка с запятой, то результат операции выводится на экран в командное окно. Точка с запятой в конце любой команды подавляет вывод результатов на экран. • Переменные с результатом выполнения любого арифметического дей- ствия размещаются в рабочем пространстве.
30 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ 2.1.1. Простейшие вычисления Для выполнения элементарных вычислений в MATLAB необходимо набрать выражение в командной строке окна Command Window и на- жать клавишу <Enter>: » (32+5) * 4 - (23 + 3А4) ans = 44 MATLAB вычислит выражение, запишет результат в специальную переменную ans, выведет ее значение в окно Command Window и перейдет в режим ожидания ввода следующей команды. Если требуется продолжить работу с только что полученным результатом, то следует воспользоваться значением переменной ans. Для этого в командной строке следует набрать » ans/1.1 + pi ans = 43.1416 Арифметические операции в MATLAB выполняются в обычном по- рядке, свойственном большинству языков программирования: • возведение в степень А; • умножение и деление *, /; • сложение и вычитание +, -. Для изменения порядка выполнения арифметических операций исполь- зуются круглые скобки. При вычислениях возможны некоторые исключительные ситуации, например деление на нуль. При делении положительного числа на нуль получается Inf (бесконечность), при делении отрицательного числа на нуль получается -Inf (минус бесконечность), при делении нуля на нуль получается NaN (Not-a-Number - не число). Во всех случаях выдается предупреждение об ошибке “Warning: Divide by zero”. 2.1.2. Форматы представления данных Вид, в котором выводится результат вычислений, зависит от форма- та вывода, установленного в MATLAB. Для установки требуемого фор- мата следует выбрать пункт меню File | Preferences... На экране появится диалоговое окно Preferences (рис. 2.1), в котором следует выбрать пункт Command Window. Задание формата производится из раскрывающегося списка Numeric Format панели Text display.
2.1. Арифметические вычисления 31 Возможен вывод результатов в коротком (short -с четырьмя знаками после десятичной точки) или длинном (long - с четырнадцатью знака- ми после десятичной точки) формате с плавающей точкой, в экспоненци- альной форме (short е, long е), шестнадцатеричном виде (hex). Рис. 2.1. Диалоговое окно Preferences Обратите внимание • Выбранный формат вывода сохраняется для всех последующих вы- числений до переустановки другого формата. • Формат вывода действует только при отображении данных. Все про- межуточные вычисления MATLAB производит с двойной точностью независимо от того, какой формат вывода установлен. • Если при отображении слишком большого или малого числа результат не укладывается в установленный формат short, то результат будет выведен в экспоненциальной форме. При этом первоначальная уста- новка формата short сохраняется, и при дальнейших вычислениях вывод результатов будет происходить в формате short. • При вводе десятичных дробей используется точка.
32 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ Задавать формат вывода можно непосредственно из командной строки командой format: » format long е Информацию о форматах можно получить, набрав в командной строке команду » help format 2.1.3. Комплексные числа При вызове команды sqrt(-l) MATLAB автоматически перехо- дит в область комплексных чисел. При вводе комплексных чисел исполь- зуется символ i либо j, а сами числа при умножении, делении и воз- ведении в степень необходимо заключать в круглые скобки. Для вычис- ления комплексно-спряженного числа применяется апостроф, который следует набирать сразу за числом, без пробела. Если необходимо найти выражение, комплексно-сопряженное данному выражению, то исходное выражение должно быть заключено в круглые скобки. В MATLAB воз- можно использование комплексных чисел в качестве аргументов встро- енных элементарных функций. » sqrt(-l.O)*(2.+3i)*3-(7-1.5j)А2+... (l+5i+ 3+2i')'+sin(3i) ans = -51.7500 +34.0179i 2.1.4. Встроенные математические функции Встроенные элементарные математические функции MATLAB включают тригонометрические (Trigonometric), гиперболические (Hyperbolic), экспоненциальные (Exponential), логарифмические (Logarithmic) функции, функции для работы с комплексными числа- ми (Complex), а также функции для округления различными способами (Rounding and Remainder). Помимо элементарных в MATLAB встроены специальные математические функции (функции Бесселя, по- линомы Лежандра, гамма-функции и т. д.). Обратите внимание • Имена функций набираются строчными буквами.
2.2. Типы данных 33 • Аргументы функций заключаются в круглые скобки и разделяются за- пятой. • Для вывода в командное окно списка всех встроенных элементарных функций с их кратким описанием необходимо в командной строке на- брать команду help el fun. • Для вывода в командное окно списка всех встроенных специальных математических функций (функции Бесселя, полиномы Лежандра, Гамма функции и т. д.) с их кратким описанием необходимо в команд- ной строке набрать команду help specfun. 2.2. Типы данных Основным объектом MATLAB является массив, для которого не требуется указывать размерность явно. Это позволяет решать многие вы- числительные задачи, связанные с векторно-матричными формулиров- ками. Система MATLAB ориентирована на работу с реальными данными, поэтому выполняет все вычисления в арифметике с плавающей точкой. В MATLAB различают 15 фундаментальных типов данных, каждый из которых является тем или иным видом массива. Минимальная размер- ность массива 0x0 и может увеличиваться до требуемого значения. Принадлежность того или иного объекта системы MATLAB к одно- му из классов представлена схемой на рис. 2.2. Обратите внимание • Все данные MATLAB являются массивами. • Данные не надо описывать явно. • По умолчанию все числовые переменные считаются матрицами с ком- плексными числами. • Вычисления выполняются с удвоенной точностью, поэтому большин- ство функций работают с массивами чисел удвоенной точности (double), а также со строками (char). • MATLAB использует целые числа для индексирования; а также для работы с графикой. • Индексы начинаются с 1. • Тип sparse предназначен для работы с разреженными матрицами. • Нельзя задать переменную типа array или numeric - они явля- ются виртуальными.
34 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ • Типы int*, uint* предназначены для обработки изображений и эффективного хранения данных в памяти. К данным этих типов можно применять базовые операции индексации и изменения размеров. Рис. 2.2. Иерархия классов данных MATLAB Тип данных uint8 (короткое целое) специально предназначен для компактного хранения больших массивов целых чисел, что часто ис- пользуется при работе с графикой. С этим типом данных можно произ- водить элементарные математические вычисления (сложение, вычита- ние, умножение, деление, возведение в степень). Но его нельзя использо- вать в качестве аргументов функций. В этом случае сначала тип данных uint8 приводят явно к типу double, производят вычисления с помо- щью функций и возвращаются к типу uint8 для дальнейшего хране- ния. Два типа данных MATLAB - структуры и массивы ячеек - позво- ляют хранить различные по типу данные в одном и том же массиве. Язык MATLAB позволяет пользователю создавать собственные ти- пы данных - объектно-ориентированные классы Use г Object и классы Java - и работать с ними по аналогии со встроенными типами. Более детально типы данных описываются в табл. 2.1.
2.2. Типы данных 35 Таблица 2.1. Типы данных MATLAB Тип данных Описание logical Логический массив. Содержит только логическую 1 (ис- тина) и логический 0 (ложь). Отличные от нуля величи- ны при преобразовании в логический тип дают 1. Логи- ческие матрицы (только 2-мерные) могут быть разре- женными. char Символьный массив (каждый символ длиной 16 бит). Рассматривается как текстовая строка. int8, uint8, int!6, uint!6, int32, uint32, int64, uint64 Знаковый и без знака массив целых чисел длиной 8, 16, 32 и 64 бита для эффективной работы с памятью. Не может применяться в математических операциях. single Числовой массив обычной точности. Имеет меньшую точность и меньший диапазон значений, но при этом требует для хранения меньший объем памяти. Не может использоваться в математических операциях. double Числовой массив двойной точности. Самый распро- страненный в MATLAB тип данных. Матрица двойной точности (только 2-мерные) может быть разреженной. cell Массив ячеек. Элементами являются массивы, причем их типы и размерности могут между собой различаться. Может содержать не связанную между собой информа- цию. struct Массив структур. Характеризуется наличием полей. Со- держит связанную между собой информацию. function handle Дескриптор функции. Может передаваться как аргумент другим функциям или использоваться для вычислений при помощи функции f е v а 1. user class Определенный пользователем класс, создаваемый при помощи функций MATLAB. java class Класс Java. Пользователь может использовать классы, уже определенные в программном интерфейсе прило- жения Java (Java API) или создавать собственные клас- сы на языке Java.
36 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ Выражения и команды в MATLAB записываются с помощью раз- личных зарезервированных слов и специальных символов (см. табл. 2.2). Специальные символы могут иметь различные назначения в зависимости от контекста их использования. Таблица 2.2. Зарезервированные имена и специальные символы MATLAB Имя/Символ Описание ans Результат выполнения последней операции с неявным присваиванием inf Бесконечность NaN Нечисловое значение end Последний элемент матрицы, наибольшее значение индекса размерности массива Pi Число 71 i, j Мнимая единица комплексного числа eps Машинная точность realmax Максимальное вещественное число realmin Минимальное вещественное число [] 1) Формирование векторов и матриц. 2) Удаление элемента матрицы. 3) Указание последовательности выходных парамет- ров функции 0 1) Порядок выполнения арифметических операций. 2) Указание индексов элементов вектора, матрицы. 3) Указание последовательности входных парамет- ров функции = Присваивание в выражениях 1) Транспонирование векторов и матриц. 2) Указатель на символьную строку. Для включения самого апострофа в символьную строку необходи- мо поставить два апострофа подряд • 1) Десятичная точка. 2) Поэлементное выполнение операций над массивом данных (.*, .А, ./, А) • • Переход по дереву каталогов на один уровень вверх Признак продолжения выражения на другой строке
2.2. Типы данных 37 Имя/Символ Описание (,) [, ] 1) Отделение операторов языка MATLAB. 2) Отделение индексов элемента вектора, матрицы. 3) Отделение элементов строки матрицы Пробел служит для разделения элементов строки мат- риц г [;] 1) Подавление вывода в командное окно результатов вычислений. 2) Отделение строк матрицы [:] 1) При формировании векторов (для указания диапа- зона - интервала изменения величины). 2) В заголовке цикла for % Комментарий ! Указатель ввода команды DOS 2.2.1. Переменные в MATLAB Как и во всех языках программирования, в MATLAB предусмотрена возможность работы с переменными. Но к отличительным особенностям MATLAB относится то, что по умолчанию все числовые переменные в MATLAB считаются массивами с комплексными числами двойной точ- ности (тип double). В MATLAB нет необходимости в определении ти- па переменных и их размерности. Когда MATLAB встречает новое имя переменной, он автоматически создает переменную и выделяет соответ- ствующий объем памяти. Если переменная уже существует, MATLAB изменяет ее и при необходимости выделяет дополнительную память. В процессе использования массива его размерность может быть изменена (увеличена или уменьшена). Для того чтобы объявить переменную S и определить ее значение, достаточно в командной строке ввести: » S = 12.47 S = 12.47 MATLAB создаст для скалярной величины переменную в виде двумер- ного массива S размером 1x1, определит ее тип double, присвоит указанное значение и выведет результат в окно Command Window (в MATLAB предусмотрена возможность завершения оператора присваи-
38 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ вания точкой с запятой для подавления вывода результата в окно Com- mand Window). Если применить функцию определения размера переменной к ска- ляру S, то видно, что система MATLAB трактует даже скалярные вели- чины как массивы с размером 1x1. » size(S) ans =1 1 MATLAB переходит от скаляров к массивам прозрачно, не требуя от пользователя дополнительных действий. Имя переменной должно начинаться с буквы, за ней могут идти бу- квы, цифры и символ подчеркивания. Допустимы имена любой длины, но MATLAB идентифицирует их по первым 31 символам и различает верхний и нижний регистры. MATLAB запоминает значения всех переменных, определенных во время сеанса работы. Если возникла необходимость вывести информа- цию о какой-либо переменной, следует выполнить одну из следующих операций или команд: • В командной строке ввести имя переменной и нажать <Enter>. В окне Command Window распечатается содержимое переменной. • Команда who возвращает в окне Command Window список всех переменных, содержащихся в Workspace. • Команда whos возвращает список всех переменных, содержащихся в Workspace, с указанием их размерности, количества байт в памяти и класса (типа). • Команда class (obj) возвращает класс объекта obj. • Команда isa(obj, ' class_name' ) возвращает 1, если объект obj принадлежит классу class name или производному от него, и О в противном случае. 2.3. Массивы 2.3.1. Типы массивов Наборы упорядоченных, пронумерованных однородных данных в программировании называют массивами. Всему массиву присваивается одно имя, а доступ к отдельным элементам массива осуществляется по целочисленному индексу, т. е. по номеру элемента в массиве. Массивы
2.3. Массивы 39 характеризуются понятиями размерности и валентности. Валентность - это число размерностей или измерений, т. е. количество индексов у пе- ременной. Массивы бывают одномерными, когда используется единст- венный индекс (номер), а могут быть и многомерными (в частности, двумерными). Размером массива называют число элементов вдоль каж- дого из измерений (см. табл. 2.3). В системе MATLAB массивы являются основными объектами, над которыми выполняются действия. В MATLAB возможно использование • одномерных массивов - векторов; • двумерных массивов - матриц; • многомерных массивов - тензоров. Система MATLAB отличает векторы, матрицы и тензоры, при этом центральным объектом являются матрицы. Следует помнить, что вектор, матрица или тензор являются математическими объектами, а одномер- ные, двумерные или многомерные массивы представляют способы хра- нения этих объектов в памяти компьютера. Таблица 2.3. Размерность и валентность массивов Объект Размерность Валентность Доступ к элементу Индексы Вектор N 1 vx i = I-? п Матрица Nrow х Ncoi 2 Мгс о II II £ £ Тензор Nrow х Ncoi х... х Npage >3 т 1г,с,-р 73 С 1 11 11 д ~ -г Е % % Обратите внимание • Векторы, как правило, используются для циклов и индексов. • Вектор может быть представлен столбцом (вектор-столбец) или стро- кой (вектор-строка). • Доступ к элементам массива происходит либо по одному индексу (по- рядковому номеру элемента), либо при помощи группы индексов. В последнем случае первый индекс - номер строки, второй - номер столбца, все остальные - номера страниц. • Индексация начинается с 1.
40 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ • Тензор - это много матриц. • Элементы любого массива упорядочены по столбцам. Элементы любого массива хранятся в памяти упорядоченными по столбцам (рис. 2.3). Рис. 2.3. Расположение элементов массива в памяти 2.3.2. Работа с массивами Создавать массивы в MATLAB можно несколькими способами: • вводить полный список элементов с помощью операции конкатенации []; • вводить поэлементно все значения с помощью операции индексации О; • использовать операцию формирования диапазона значений : в слу- чае создания вектор-строки, каждый элемент которой отличается от предшествующего на постоянную величину, т. е. шаг; • присваивать значение самому последнему элементу массива; • использовать встроенные функции генерации матриц. Для работы с массивами предназначены две специальные операции: операция конкатенации [ ] и операция индексации (). Для операции конкатенации (concatenation) в качестве раздели- телей элементов используются запятые, пробелы либо точки с запятой. При использовании запятых или пробелов выполняется горизонтальная конкатенация или конкатенация вдоль строк, а при применении точки с
2.4. Векторы 41 запятой - вертикальная конкатенация или конкатенация вдоль столбцов. Например, операция » С = [ Al , А2 ] из двух матриц А1 и А2, у которых должно быть одинаковым число строк, создает матрицу С с числом столбцов, равным сумме столбцов матриц-слагаемых. Операция » С = [ Al ; А2 ] соединяет матрицы А1 и А2 вертикально, создавая матрицу С, у ко- торой число строк будет равно сумме числа строк матриц А1 и А2. В случае разного числа столбцов у А1 и А2 появится сообщение об ошибке: “??? Error using => vertcat. All rows in the bracketed expression must have the same number of columns”. Операция конкатенации является групповой операцией, позволяю- щей компактно выразить большой объем действий. В противном случае пришлось бы задавать большое количество присваиваний значений от- дельным элементам массивов. Операндами операции конкатенации мо- гут служить числа, вектор-строки, вектор-столбцы, матрицы, а также массивы еще большей размерности. В операции индексации применяется единственный разделитель - запятая. Она отделяет друг от друга индексы, соответствующие разным направлениям группировки элементов массива (вдоль строк и вдоль столбцов - для двумерных массивов). Существует еще одна групповая операция, применяемая к массивам. Это операция формирования диапазона значений, обозначаемая двое- точием. Использование понятия пустого массива, которое обозначается как [ ], справа от знака присваивания позволяет удалить элемент, группу элементов, строку или группу строк, столбец или группу столбцов. Сле- дующая операция выполнит удаление из массива А1 второй строки » А1(2, :) = [] 2.4. Векторы Одномерные массивы - это линейные наборы чисел (элементов), в которых позиция каждого элемента задается единственным числом - его номером.
42 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ MATLAB распознает геометрию вектора и наглядно отображает его, располагая элементы для показа в своем окне вертикально в случае век- тор-стол бца и горизонтально - для вектор-строки. 2.4.1. Вектор-строки Для задания одномерного массива, состоящего из нескольких чисел (вещественных или комплексных), используется операция конкатенации, обозначаемая с помощью квадратных скобок [ ]. Например, выражение » vl = [1035 -12] формирует переменную с именем, являющуюся одномерным массивом из пяти элементов (вещественных чисел). Объединяемые в массив эле- менты должны отделяться друг от друга либо пробелом, либо запятой. Таким образом, выражение » vl = [1, 0, 3, 5, -12] идентично предыдущему. Одним из способов задания вектор-строки является поэлементное определение ее элементов. Следующий код » Ь(1)=1; Ь(2)=3; Ь(3)=-5; Ь(4)=2 создаст вектор b= [ 1 3 -5 2]. В MATLAB предусмотрено создание векторов при помощи опера- ции формирования диапазона значений, когда каждый элемент отличает- ся от предшествующего на постоянную величину, т. е. шаг. Для ввода таких векторов служит специальный символ «двоеточие». В общем виде можно записать V = [начальное значение : шаг : конечное значение] Необязательно следить за тем, чтобы последнее значение равнялось ко- нечному значению. Вектор-строка заполнится до элемента, не превосхо- дящего конечного значения. Шаг может быть и отрицательным, в этом случае начальное значение должно быть больше конечного. Если шаг ра- вен 1, то его можно не указывать. Например, допустимы следующие ва- рианты задания вектор-строк: » V=1: 2 :10 - вектор V= [1 3 5 7 9 ] ; » V=[l: 5] - вектор V= [ 1 2 3 4 5] - шаг равен 1; » V= [2.1: -0.3 :1.1 ] - вектор V=[2.1 1.8 1.5 1.2];
2.4. Векторы 43 » V=1: 5 :2 - вектор из одного элемента V= [ 1 ] . При этом начальное значение всегда присутствует в созданном векторе, а конечного значения может и не быть. Самый простой способ создания вектор-строки нужного размера со- стоит в присваивании значения его самому последнему элементу: » v3(4) = 9 -вектор v3=[0 0 0 9]. Из нескольких вектор-строк можно составить одну строку, используя операцию конкатенации [ ] и разделяя исходные вектор-строки запятой или пробелом. » V= [vl v3] - вектор V= [ 1 0 3 5 -12 0 0 0 9] из девяти элементов. Для доступа к отдельному элементу одномерного массива следует после его имени указать в круглых скобках индекс (номер) этого элемен- та. Например, первый элемент массива vl обозначается как vl(l), второй элемент - как vl (2 ) и т. д. Команда vl (end) позволяет по- лучить доступ к последнему элементу массива. Если требуется изменить третий элемент уже сформированного выше операцией конкатенации массива vl, то следует применить оператор присваивания вместе с опе- рацией индексации » vl(3) = 17 Присваивание vl (3 : 5) =3 эквивалентно последовательности команд vl(3)=3; vl(4)=3; vl(5)=3. Попытка чтения несуществующего элемента, например восьмого элемента массива vl, приводит к появлению в командном окне MATLAB сообщения об ошибке. В этом сообщении утверждается, что индекс превысил размер массива: » vl(8) ??? Index exceeds matrix dimensions. Однако попытка записи несуществующего элемента будет выполнена успешно. В этом случае MATLAB увеличит длину вектор-строки и за- полнит все промежуточные элементы нулями: » vl(8) = б - удлинит исходный вектор до восьми элементов: vl=[l 0 17 3 3 0 0 6]. То же самое действие - удлинение массива - можно выполнить и с по- мощью операции конкатенации: » vl(6) = [vl 7 -4]
44 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ Здесь операндами операции конкатенации являются массив, состоящий из восьми элементов, и добавляемые к нему два элемента, равные 7 и -4. Для удаления элемента или группы элементов из вектор-строки сле- дует применить операцию [ ]: » vl(6) = [] - удаляет из указанного вектора шестой элемент: vl=[l 0 17 3 3 0 6 7 -4]; » vl ( [ 1 4 5]) = [] - удаляет первый, четвертый и пятый эле- менты вектора: vl=[0 17 0 6 7 -4]. Массивы могут состоять не только из вещественных чисел. Выра- жение » v4 = [l+7i, -2+9i, ll-4i ] формирует одномерный массив v4 комплексных чисел. Разделителем элементов формируемого одномерного массива может быть либо пробел, либо запятая. При использовании выражений и комплексных чисел ис- пользование запятой предпочтительнее. Примером задания вектора при помощи встроенных функций MATLAB являются команды linspace и logspace. Они создают векторы, значения которых изменяются соответственно в арифметиче- ской и геометрической прогрессиях. Три параметра команды linspace задают соответственно первый и последний члены арифметической про- грессии, а также число членов: » linspace(1, 2, 5) ans =1 1.25 1.5 1.75 2 Три параметра команды linspace задают соответственно десятичные порядки первого и последнего членов геометрической прогрессии, а также число членов: » logspace(-1, 2, 5) ans =0.1 0.56234 3.1623 17.783 100 Количество элементов, валентность и размер вектора можно узнать при помощи встроенных функций: length - количество элементов, ndims - валентность, size- размер вдоль каждого из измерений » length(vl) ans = 6 » ndims(vl) ans = 2 » size(vl)
2.4. Векторы 45 ans =1 6 Таким образом, вектор vl хранится в двумерном массиве vl размер- ностью 1x6 (одна строка и шесть столбцов). 2.4.2. Вектор-столбцы Для задания вектор-столбца, состоящего из нескольких чисел (веще- ственных или комплексных), используется операция конкатенации. При этом элементы следует разделять точкой с запятой. Например, выраже- ние » si = [ 1; 3; -12] si = 1 3 -12 формирует переменную с именем si, являющуюся одномерным масси- вом из трех строк и одного столбца. В случае поэлементного определения вектор-столбца необходимо для каждого элемента указывать два индекса: » b(l,l)=l; b(2,l)=3; b(3,l)=-5; Ь (4,1) =2 - создаст век- тор-столбец Ь=[1; 3; -5; 2]. Из нескольких вектор-столбцов можно составить один столбец, ис- пользуя операцию конкатенации [ ] и разделяя исходные вектор- столбцы точкой с запятой: » S =[sl; si] - продублирует вектор si и создаст столбец из шести элементов. Так же, как и для вектор-строки, количество элементов, валентность и размер вектор-столбца можно узнать при помощи встроенных функ- ций: » length(si) ans = 3 » ndims(si) ans = 2 » size(si) ans =3 1 Таким образом, вектор si хранится в двумерном массиве si размерно- стью 3x1 (три строки и один столбец).
46 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ 2.4.3. Поэлементные операции с векторами Все поэлементные операции применимы как к вектор-строкам, так и вектор-столбцам. Рассмотрим действие этих операций на примере двух векторов » vl = [4 2 3] ; » v2 = [3 -2 0] ; Для нахождения суммы и разности двух векторов используются знаки + и - соответственно. » s = vl+v2 s = 7 0 3 Если размеры векторов, к которым применяется сложение или вы- читание, не совпадают, то выдается сообщение об ошибке. Операция . * осуществляет поэлементное умножение векторов одинаковой длины. В результате получится вектор той же длины, что и исходные, с элементами, равными произведению соответствующих эле- ментов исходных векторов: » u = vl.*v2 u = 12 -4 0 При помощи оператора . А выполняется поэлементное возведение в степень: » u = vl. А3 и = 64 8 27 Показателем может быть вектор той же длины, что и возводимый в сте- пень. При этом каждый элемент первого вектора возводится в степень, равную соответствующему элементу второго вектора: » u = vl.Av2 u = 64 0.2500 1 Операция . / приводит к поэлементному делению векторов одина- ковой длины, при этом элементы первого вектора делятся на соответст- вующие элементы второго вектора: » u = vl./v2 u = 1.3333 -1 Inf
2.4. Векторы 47 Обратное поэлементное деление элементов второго вектора на соот- ветствующие элементы первого вектора выполняется при помощи опе- рации . \ » u = vl.\v2 u = 0.75 -1 0 К поэлементным относятся и операции с вектором и числом. Сло- жение вектора и числа прибавляет число к каждому элементу вектора: » u = vl+10 и = 14 12 13 То же самое справедливо и для вычитания. Умножать поэлементно вектор на число можно как справа, так и слева: vl*10 и 10* vl приведет к одинаковому результату. Делить при помощи знака / можно вектор на число: vl/Ю. Однако попытка деления числа на вектор 10/vl приводит к сообщению об ошибке. В случае, если требуется раз- делить число на каждый элемент вектора, необходимо использовать опе- рацию . / » и = 10./vl и = 2.5 5 3.3333 Для нахождения сопряженного вектора в MATLAB используется апостроф ' , а для транспонирования применяется точка с апострофом .' . Для вектор-столбца с комплексными или вещественными элемен- тами сопряженный к нему вектор определяется как вектор-строка из его комплексно-сопряженных элементов, а транспонированный вектор - как вектор-строка из его элементов. Аналогично сопряжение и транспониро- вание вектор-строки приводят к вектор-столбцу. Для векторов, состоя- щих только из действительных чисел, операции сопряжения и транспо- нирования совпадают. » zl = [3+i; -2-+2i; 10]; » z2=zl' z2 = 3-li -2+2i 10 » z3=zl.’ z3 = 3+li -2-2i 10 Таким образом, операции 'и .' над вещественными векторами при- ведут к изменению геометрии вектора: вектор-строка превратится в век- тор-столбец и наоборот.
48 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ Элементарные математические функции работают с массивами по- элементно. Так, в результате выполнения команд » х = -2*pi : 0.01 : 2*pi; у = sin(x); plot(x,y) MATLAB создаст два вектора по 1257 элементов (вектор х - значений аргумента и вектор у - значений функции sin от каждого элемента вектора х) и выведет график функции sin на экран. 2.5. Матрицы Матрицы можно рассматривать как набор чисел, упорядоченный в виде прямоугольной таблицы, при этом для доступа к отдельному эле- менту используется два индекса - номер строки и номер столбца. Мат- рица характеризуется количеством строк и количеством столбцов и хра- нится в двумерном массиве размерностью mxn (ш строк и п столб- цов). Любая строка матрицы является одномерным массивом, упорядо- ченным горизонтально, и любой столбец матрицы также является одно- мерным массивом, упорядоченным вертикально, и называются они, со- ответственно, вектор-строкой и вектор-столбцом. В этом случае также можно считать, что вектор-строки являются частным случаем матрицы с количеством строк, равным единице, а вектор-столбцы являются част- ным случаем матрицы с количеством столбцов, равным единице. 2.5.1. Создание матриц При задании матрицы А = <1 2 33 ее можно рассматривать как I4 5 6J вектор-столбец из двух элементов, каждый из которых является вектор- строкой из трех элементов, поэтому необходимо использовать запятые или пробелы для разделения элементов в одной строке и точку с запятой в качестве разделителя строк. » А = [123; 456]; Еще один способ ввода матрицы состоит в том, что матрицу можно рассматривать как вектор-строку, каждый элемент которой является век- тор-столбцом.
2.5. Матрицы 49 Например, матрицу А можно ввести при помощи команды » А = [[1; 4] [2; 5] [3; б]]; Как и в случае одномерных массивов, двумерный массив можно создать, прописывая все его элементы: » А(1,1) = 1; А(1,2) = 2; А(1,3) = 3; » А(2,1) = 4; А(2,2) = 4; А(2,3) = б; Конструкторы вида [АВ; CD], где А, В, С, D -элементы, которые сами могут быть матрицами, создают матрицу При этом должна соблюдаться согласованность по количеству строк матриц А и В, С и D соответственно, а также по количеству столбцов матриц А и С, В и D. Для задания ряда матриц специального вида имеются команды MATLAB, аргументами которых являются размерности создаваемых матриц (см. табл. 2.4). Если указано одно число N, то формируется квад- ратная матрица NxN. Таблица 2.4. Функции определения матриц Имя Назначение di ад Создание диагональной матрицы или выделение диагонали eye Единичная матрица gallery Функция, позволяющая получать более пятидесяти стан- дартных матриц hi lb Гильбертова матрица magic Матрица магического квадрата ones Матрица из единиц rand Случайная матрица со значениями из интервала [0, 1] randn Создание матриц равномерно распределенных случайных чисел tril Выделение нижней части треугольной матрицы triu Выделение верхней части треугольной матрицы zeros Нулевая матрица
50 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ Вызов функций ones, zeros, rand с разным числом скалярных аргументов позволяет генерировать многомерные массивы. Вообще воз- можность вызова функции в системе MATLAB с одним именем, но с различными аргументами типична для этой системы. Все варианты воз- можных вызовов любой функции перечисляются с помощью следующей команды, задаваемой в командном окне: » help function_name 2.5.2. Доступ к элементам матрицы Для доступа к отдельным элементам матрицы используется выра- жение с круглыми скобками, в которых через запятую перечисляются его индексы. Первым указывается номер строки, вторым - номер столбца. Доступ к элементам матрицы также осуществляется при помощи одного индекса - порядкового номера. Индексация при помощи порядкового номера производится с учетом того, что в памяти компьютера элементы матрицы хранятся по столбцам в виде вектора. Д 2 3" а4 а' X = 4 5 6 => х = ^21 ^22 Дз => X = cl а, а. 2 Э о ? 8 9? Дз1 ^32 ^33 у ^3 аб а9, Различные способы обращения к элементам и группе элементов матрицы на примере матрицы х представлены в табл. 2.5. Таблица 2.5. Обращение к элементам и группам элементов матрицы Доступ по номеру строки т и номеру столбца п х(/и,и) = атп х(1,3) = 3; х(2,1) = 4; Доступ по порядковому номеру x(k) = cik х(2) = 4; х(4) = 2; Доступ к строке х(1,:) = [12 3] х(2,:) = [4 5 6] х(3,:) = [7 8 9]
2.5. Матрицы 51 Доступ к столбцу pi pl х(:,1)= 4 х(:,2)= 5 х(:,3)= 6 ы ы ы Доступ к группе элементов / ч <1 2 3 Д / Л4 5 6) Z ч Г2 8 91 х(1:2,:) = I4 5 6J х(2:3,:) = v 7 р 8 9J 43,!],:) = [! 2 3] О р 31 р р х(:,1:2)= 4 5 х(:,2:3) = 5 6 4, [3,1])= 6 4 (7 я] [я 9) 4 4 41,3], [1,3]) = ' 39 42,3], [2,3]) = Р fl О У 42,3], [2,1]) = Р f| 0 / Удаление элемента переводит матрицу в вектор-строку х(2,1)=[] х(2) = [] х(2:5) = [] ERROR [1 7 2 5 8 3 6 9] [1 8 3 6 9] x(end) = [] x(l:2:end) = [] =4> х([15 9])=[] [1 4 7 2 5 8 3 6] [4 2 8 6] [4 7 2 8 3 6] Удаление столбцов и строк Г1 3~ х(2,:) =[] x(2:end,:) = [] => х(:,2) = [] ^>х = 4 6 Г1 2 31 х = [1 2 3] 7 9 х = 7 8 9 — — Система MATLAB позволяет переставлять строки (столбцы) масси- вов. Переставим местами столбцы в матрице х таким образом, чтобы по- следний столбец стал первым, второй - последним, а первый - вторым. Для этого следует выполнить операцию: » х = х(: , [3 1 2])
52 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ Гз 1 2Л В результате матрица примет вид х = 6 4 5 У 7 8J Так можно не только переставлять строки или столбцы, но и удалять часть из них (выше для этой цели использовался пустой массив), а дру- гие строки (столбцы) дублировать. Например, в результате выполнения команды » у = х ( [1 1 2 3] , [3 1 2 2] ) "3 1 2 2> 3 1 2 2 создается матрица вида у = 6 4 5 5 <9 7 8 8; 2.5.3. Взаимные преобразования векторов и матриц Рассмотрим примеры, в которых из вектор-столбцов и вектор-строк получают матрицы и наоборот. Создадим вектор-столбец операцией конкатенации: » s = [1; 2] ; Теперь с помощью выражения » s = s(:, [1; 1]) ; превращаем переменную s из вектор-столбца в матрицу <2 2? Для получения матрицы s вида 2x2 исходный вектор-столбец был продублирован. Выражение » s = s(:,ones(1,N)) позволяет продублировать вектор-столбец s N раз, т. е. получить мат- рицу 2xN. В данной команде используется функция ones, создающая массивы любой размерности, все элементы которых равны единице. В примере, описанном выше, эта функция принимает вид ones(l,N) и создает вектор-строку из N единиц. Для индексов можно использовать не только линейные диапазоны, но и структурированные геометрически наборы чисел. Пусть А - мат-
2.5. Матрицы 53 рица 2x3 вида А = [12 3; 4 5 6] и z = [6 5 4 3 2 1]- вектор. Выражение А (: , :) есть та же матрица А. Выражение А (:) есть набор из всех элементов матрицы А, упорядоченный линейно по столбцам (т. е. вектор-столбец): сначала идут все элементы первого столбца, затем - элементы второго столбца и так далее (так, как хранятся все массивы в памяти компьютера). Таким образом, справедливо » z (А(:) ) = [6 3 5 2 4 1] Здесь элементы матрицы А, вытянутые в столбец, являются индексами для входа в массив z, откуда и извлекаются элементы для формирования массива-результата. MATLAB рассматривает z (А) как выражение, порождающее дву- мерный массив той же структуры, что и матрица А, поставляющая ин- дексы для выборки значений из одномерного массива z: 4" 1 / 7(Л) = превращаться в векторы, но и % 5 ч3 2 Наконец, матрицы могут не только менять свою форму. При изменении формы матрицы должна соблюдать- ся согласованность по количеству элементов. Порядок следования эле- ментов при этом не изменяется, элементы только по-другому порежутся на кусочки. » А = reshape (Т, size (В) ) - формирование матрицы А из эле- ментов массива Т по форме матрицы В. » А = reshape (Т ,т, п) - формирование матрицы mxn из элемен- тов массива Т длины mxn. Элементы выбираются последовательно, образуя столбцы А. » А = reshape (T,m,n,p) - формирование массива элементов массива Т длины mxnxp. Аналогичным образом многомерные массивы. Т = mxnxp из создаются а 6 5 9 . 4 2 11 7 14 3 10 6 15 13" 8 12 1 > => reshape (Т, 2, 8) = Эб 9 2 7 3 6 .5 4 11 14 10 15 8 1 13 123
54 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ 2.6. Тензоры Массивы с числом размерностей более двух считаются многомер- ными и называются тензорами. Для индексации элементов таких масси- вов требуется три или более номера, указывающих на положение выби- раемого элемента вдоль нескольких направлений упорядочивания. Рис. 2.4. Пример тензора Так, трехмерный тензор представляет собой упорядоченную прону- мерованную вдоль некоторого направления совокупность матриц одина- кового размера (рис. 2.4). Это будет уже третье направление упорядочи- вания данных, так как вдоль первого направления упорядочиваются строки, вдоль второго - столбцы. В результате третий индекс для досту- па к отдельному элементу данных будет равен номеру таблицы. 2.6.1. Создание тензоров Существует несколько способов создания тензоров. Самый простой способ создания тензора нужного размера состоит в присваивании зна- чения его последнему элементу: » Т(11,4,3) = 1
2.6. Тензоры 55 В данном случае тензор представляет собой совокупность трех матриц, каждая из которых состоит из 11 строк и четырех столбцов. Второй способ - это прямое прописывание всех его элементов: » Т(1,1,1) = 1; Т(1,2,1) = 2;... Т(11,4,3) = 30 Процесс задания всех элементов такого трехмерного массива допус- кает группировку. Сначала можно любым способом сформировать мат- рицу А1, затем матрицу А2 и так далее. После того, как все матрицы будут определены, можно для создания трехмерного массива выполнить следующие групповые присваивания: » Т(:,:,1) = А1; Т(:,:,2) = А2;... Т(:,:,3) = АЗ Рассмотренный способ применялся при создании одномерных и двумерных массивов. Кроме него для таких массивов использовалась еще операция конкатенации. Но эта операция конкатенации непосредст- венно для создания массивов высокой размерности неприменима, так как разделители (запятая и точка с запятой) в этой операции работают только на разграничение столбцов и строк. Для этой цели при создании тензоров применяют функцию конкатенации cat. Для двух матриц Al = [1 2 3; 4 5 6] и А2 = [7 8 9; 1 1 1] конкатенация вдоль разных направлений приводит к следующим результатам: » cat(l,Al,A2) порождает массив [1 2 3; 4 5 6; 7 8 9; 1 1 1], т. е. тот же результат, что и [ Al; А2 ] . » cat(2,Al,A2) порождает массив [1 2 3 7 8 9; 4 5 6 1 1 1], т. е. аналогично [ Al, А2 ] . » cat(3,Al,A2) порождает из двумерных массивов Al,А2 трех- мерный массив. И наконец, можно применить специальные функции ones, zeros в тех случаях, когда почти все элементы многомерного массива равны единице или нулю, после чего прописать индивидуальные значения для отдельных элементов. Например, следующий код создает трехмерный массив Т с размером 5x3x2 из нулей, а затем присваивает всем эле- ментам первой таблицы значение 2, а всем элементам второго столбца второй таблицы - значение 4: » T=zeros(5,3,2) ; » Т(: ,: ,1) = 2; Т(:,2,2) = 4; Работа с массивами валентности 4 и выше аналогична работе с мас- сивами размерности 3.
56 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ 2.6.2. Доступ к элементам тензора Так же как и в рассмотренных выше случаях работы с матрицами, в памяти компьютера элементы тензора хранятся упорядоченными по столбцам: сначала идут элементы первого столбца первой матрицы, за- тем - второго столбца первой матрицы и т. д., и наконец, идут элементы последнего столбца последней матрицы. Обратиться к элементам можно при помощи группы индексов, на- пример, элемент Т (5,2,1) находится в пятой строке, втором столбце первой матрицы. Другой способ доступа к элементу тензора состоит в использовании порядкового номера элемента - T(12),T(end). Возможны следующие варианты доступа к элементу или группе элементов тензора: » Т (i) - i-й элемент тензора; » Т (R,C,P) - подтензор, где R - список индексов строк, С - столб- цов, Р - страниц; » Т ( [ 1 3 ] , : , 3) - первая и третья строки, все столбцы, третья стра- ница; » Т( [end 1] , end, : ) - последняя и первая строки, последний столбец всех страниц; » Т (: ) - весь массив, вытянутый в столбец; » Т ( [ 2 end-1 ]) или Т (2 end-1) - второй и предпоследний эле- менты; » Т ( [ 2 : end-1 ]) - весь массив, вытянутый в строку, кроме 1 -го и последнего элементов; » Т(2,1) - выдаст сообщение об ошибке, так как можно указывать либо все индексы, либо только один (порядковый номер). 2.7. Функции для работы с массивами Для элементарных вычислений с элементами массивов предназна- чены функции sum, prod, max, min и sort. Функцию sum применяют для одномерных массивов, где она сум- мирует все элементы. Для матриц эта функция суммирует элементы в столбцах, так что если А= [ 1 2 3; 4 5 6; 7 8 9 ], то sum (А) ==[12, 15, 18 ]. В случае многомерных массивов функция по- зволяет выбрать направление суммирования элементов.
2.7. Функции для работы с массивами 57 Функция prod аналогична функции sum, но только вместо сум- мирования выполняет умножение: prod(A)==[28, 80, 162]. Функции max и min ищут, соответственно, максимальный и ми- нимальный элементы в массивах. Для одномерных массивов - это един- ственный элемент. В случае матриц рассматриваемые функции трактуют столбцы матриц как векторы, по каждому из которых нужно дать резуль- тат, и возвращают набор экстремальных элементов для каждого столбца. Таким образом, max (А) == [ 7 , 8, 9 ] . Варианты использования функции min: » х = [284; 739]; » у = [711; 440]; » min(x) == min(x,[],l) == [2 3 4] создает вектор-строку из минимальных элементов в каждом столбце; » min(x,[],2) == [2; 3] создает вектор-столбец из минималь- ных элементов в каждой строке; » min (min (х) ) == 2 определяет минимальный элемент матрицы; » min(x,5) == [2 5 4;5 3 5] заменяет в матрице х все эле- менты, большие 5, на 5; » min(x, у) == [2 1 1;4 3 0] создает матрицу, каждый эле- мент которой является минимальным из соответствующих элементов матриц х и у; » [a,i] =min(x) возвращает два вектора: вектор а == [2 3 4] состоит из минимальных элементов каждого столбца матрицы х, а век- тор i == [1 2 1 ] содержит номера строк минимальных элементов в каждом столбце. Функция sort сортирует в возрастающем порядке элементы одно- мерных массивов, элементы столбцов в матрицах (каждый столбец от- дельно). Функция all в случае ее применения к вектору возвращает 1 (ис- тина), если все элементы вектора не равны нулю, или 0 в случае, если хо- тя бы один элемент нулевой. Функция any действует противоположным образом. Она возвра- щает нуль в случае, когда все элементы вектора равны нулю, и единицу, когда хотя бы один элемент ненулевой. В случае применения к матрицам функции all и any возвращают значения по каждому столбцу. Функция find в качестве аргумента принимает некоторое усло- вие, а возвращает набор номеров (индексов) элементов массива, удовле-
58 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ творяющих данному условию. Для одномерного массива вызов этой функции возвращает вектор индексов элементов. Для матриц функция find возвращает не один вектор индексов, а группу. Каждый вектор из этой группы получается в результате обработки отдельного столбца мат- рицы. Например, следующий вызов » А = [230; 407; 0 0 8]; » [vl, v2] = find(А); возвращает вектор-столбцы vl и v2, первый из которых содержит но- мера строк, а второй - номера столбцов отличных от нуля элементов матрицы А, при этом матрица просматривается по столбцам слева на- право. Таким образом, vl== [ 1; 2; 1; 2; 3] и v2==[l; 1; 2; 3; 3]. Вызов следующей команды возвращает вектор-столбцы vl== [ 2; 3 ] и v2== [ 3; 3 ], содержащие соответственно номера строк и номера столбцов элементов матрицы А, больших 4: » [vl, v2] = find(A>4) На примере этих функций видна уникальная особенность функций, реализованная в системе MATLAB, - возможность получать от одной и той же функции разное число возвращаемых значений. Функция spy рисует «портрет», или шаблон матрицы, в котором точками будут отмечены ненулевые элементы. После выполнения ко- манды spy на экране появляется окно Figure № 1. На вертикальной и горизонтальной осях откладываются номера строк и номера столбцов. Ненулевые элементы обозначаются маркерами. Внизу окна указывается число ненулевых элементов матрицы. 2.8. Вычисления с массивами Так как матрицы являются самой распространенной формой пред- ставления данных в системе MATLAB, то рассмотрим действие арифме- тических, логических операций и операций отношения с массивами для случая матриц более детально. 2.8.1. Арифметические операции Основные знаки арифметических операций, используемые при ра- боте с матрицами, представлены в табл. 2.6.
2.8. Вычисления с массивами 59 Таблица 2.6. Знаки арифметических операций Символ Назначение +, - Знак числа или операция сложения и вычитания матриц, причем матрицы должны быть одинакового размера * Матричное умножение . * Поэлементное умножение матриц f Транспонирование вместе с комплексным сопряжением f Транспонирование без вычисления сопряжения / Левое деление . / Левое поэлементное деление \ Правое деление . \ Правое поэлементное деление А Возведение в степень А Поэлементное возведение в степень При сложении, вычитании, умножении, делении матрицы на число соответствующая операция всегда производится поэлементно. Аддитивные операции сложения и вычитания осуществляются с массивами поэлементно и обозначаются знаками + и Складываемые (вычитаемые) матрицы должны иметь одинаковые размеры. Если опера- ция применяется к матрицам, размеры которых не согласованы, то будет выведено сообщение об ошибке. В случае, если одно из слагаемых явля- ется скаляром, производится автоматическая генерация безымянной мат- рицы с таким же размером, как и у матричного слагаемого, при этом все ее элементы одинаковы и равны исходному скаляру. Для операций умножения, деления и возведения в степень традици- онные арифметические знаки зарезервированы за действиями линейной алгебры: знак * означает перемножение матриц (а также вектор-строк и вектор-столбцов) по правилу «строка на столбец». Знак деления / (а также знак \) выполняет операцию нахождения решений систем линей- ных уравнений. Для поэлементного выполнения операций умножения, деления и возведения в степень применяются комбинированные знаки (точка и знак операции). Поэлементное перемножение массивов обозначается . *. При поэлементном умножении на скаляр производится расширение скаляра до матрицы, т. е. на скаляр умножается каждый элемент матри-
60 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ цы. Знак А возводит матрицу в степень, а комбинация .А означает возведение в степень каждого элемента матрицы. Для поэлементного деления используются комбинации знаков . / и . \ , обозначающие «правое» и «левое» поэлементные деления. Выраже- ние А./В делит элементы первой матрицы на соответствующие эле- менты второй и приводит к матрице с элементами A (k ,т) /В (к ,т), а выражение А. \ В служит для деления элементов второй матрицы на соответствующие элементы первой и приводит к матрице с элементами В (к ,т) /А (к ,т) . Обе матрицы должны иметь одинаковые размеры, в случае скаляра производится его расширение до размеров операнда- матрицы. В табл. 2.7 представлены основные арифметические операции 1 21 3 4 с матрицами на примере матрицы у = Таблица 2.7. Операции с матрицами У + У = ’2 4 6 8 у + 1 = 2 3’ 4 5_ У*У = 1-1 + 2-3 1-2 + 2-41 Г7 101 3-1 + 4-3 3 2 + 4 - 4 J — |_15 22J У.*У = ’1-1 2-21 Г1 41 _3-3 4 4 J — |_9 16J у! У = ’1 О’ ° 1 У./У = ’1 Г 1 1 У*3 = ’3 6’ 9 12_ у!2 = 0.5 1 1.5 2 у.л3 = ’ i 81 _27 64J ул2 = 7 10 15 22 Г1 31 у.' = L2 4J Г1 31 у= L2 4J [у, у] = ’1 2 1 21 _3 4 3 4J [у,у] = ’1 2" 3 4 1 2 _3 4_
2.8. Вычисления с массивами 61 2.8.2. Операции отношения и логические операции Операторы отношения и логические операторы, а также соответст- вующие им команды позволяют выполнять сравнения массивов одинако- вого размера. Операции отношения и логические операции выполняют поэлементные действия. Результатом таких операций являются массивы из нулей и единиц того же размера, что и исходные. Здесь каждый нуль означает «ложь» для данной позиции внутри матриц, а единица означает «истину». Попытка сравнения массивов разных размеров приводит к ошибке. В случае скаляра производится его расширение до массива нуж- ного размера, а затем происходит сравнение. Логические операции и операции отношения применимы и для чисел. Операции ==, ~= про- водят сравнения вещественных и мнимых частей комплексных чисел, а операции >, <, >=, <= - только вещественных частей. Основные логические операторы и операторы отношения, а также соответствующие им функции представлены в табл. 2.8, 2.9. Таблица 2.8. Операции отношения Символ Назначение Функция > Больше gt >= Больше или равно де < Меньше 11 <= Меньше или равно 1е == Равно eq ~= Не равно пе Применение логических операций к массивам приводит к поэле- ментному их выполнению над каждым элементом массива. Результатом является массив того же размера, что и исходный, со- стоящий из нулей и единиц. Одним из элементов логических операций может быть число. В этом случае происходит поэлементное выполнение логической операции для каждого элемента и числа. Выполнение бинар- ных логических операций хог, & и | над массивами разных размеров недопустимо. Выделение части массива, элементы которого удовлетворяют опре- деленному условию, производится функцией find. Следующий код
62 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ создает вектор-столбец Anew из всех элементов матрицы А, меньших 7 и больших или равных 3. » А = [230; 457; 0 0 8]; » Anew = A(find((A<7) & (А>=3))) Следующий код заменяет числом 9 все элементы матрицы А, меньшие 4 или большие 7: » A(find((А>7) | (А<4)))= 9 Таблица 2.9. Логические операции Символ Назначение Результат Функция & Логическое «И» Бинарная операция: 1 - если оба элемента не 0, 0 - если хотя бы один из них 0 and 1 = Логическое «ИЛИ» Бинарная операция: 1 - если хо- тя бы один из элементов не 0 or Отрицание Унарная операция: 1 - если элемент массива 0, 0 - если элемент массива не 0 not Исключающее «ИЛИ» Бинарная операция: 1 - если один элемент 0, а другой не 0; и 0 - если оба элемента 0 или оба не 0 xor MATLAB предоставляет возможность логического индексирования при работе с данными. Таблица 2.10. Построение индексных логических матриц Функция Назначение isfinite 1 - соответствует числам; 0- Inf, NaN isinf 1 - соответствует +Inf, -Inf; 0-числам isnan 1 - соответствует NaN; 0 - числам isprime 1 - соответствует простым числам; 0 - остальным числам isreal 1 - соответствует вещественным числам; 0 - комплекс- ным числам
2.9. Текстовые строки 63 Некоторые индексные логические матрицы вычисляются по исход- ной матрице при помощи специальных функций. Каждая функция для входной матрицы строит индексную логическую матрицу из нулей и единиц, соответствующую проверяемому условию. Функции для построения индексных логических матриц представ- лены в табл. 2.10. 2.9. Текстовые строки Во всех языках программирования большую роль играет обработка текстовых данных. Для этой цели в системе MATLAB предусмотрен тип данных char («символ»). Текстовые данные, в том числе и одиночный символ, должны заключаться с обеих сторон в апострофы: » si = ’a’; s2=’abcd'; s3 = ’Hello, MATLAB!’ В результате таких присваиваний создаются переменные в виде массивов (в системе MATLAB все есть массив) типа char. Печатаемые символы из стандартного набора ASCII представлены числами от 32 до 255. Для ввода русских символов следует выбрать в меню File | Preferences ► Command Windows Font шрифт с русской кодировкой. Во внутрен- нем представлении символы даны целыми числами. Конвертировать массив символов в числовую матрицу позволяет команда double. Об- ратная операция выполняется по команде char. Если после того, как переменная s 3 получила текстовое значение, написать » s3 = 2.345 то переменная s3 станет уже переменной типа double. Если неизвестен тип переменной в какой-либо момент времени ис- полнения, то с целью определения типа переменной следует применить функцию isa. Например, вызов этой функции вернет истину (единицу), если переменная s 3 является в этот момент строковой (символьной), и вернет ложь (нуль) в противоположном случае. » isa(s3char’) По отношению к массивам символов справедливы также все опера- ции, ранее рассмотренные для случая массивов типа double. Например, вместо группового присваивания s2='abcd’ можно выполнить по- элементное присваивание с помощью операции индексации:
64 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ »s2(l)=’a'; s2(2)='b’; s2(3)=’c’; s2(4)=’d’ или осуществить операцию конкатенации » s2 = [’ab' 'с' 'd'] 2.9.1. Функции для работы со строками В MATLAB имеется полный набор функций для классической обра- ботки текстовых строк (см. табл. 2.11), свойственный языкам програм- мирования высокого уровня. Часто текстовые строки используются для вывода в командное окно системы MATLAB для информирования пользователя о ходе выполне- ния М-функции. Это осуществляется с помощью функции disp, при- нимающей в качестве аргумента текстовую строку » х = 17; » message = [' Variable х = ’, int2str(x)]; » disp( message ) Кроме того, в командное окно надо выводить сообщения, преду- преждающие пользователя о необходимости ввода с клавиатуры значе- ния переменной: » X = input(’X = ? ’) Функция input выводит в командное окно текст, являющийся ее аргументом, после чего ожидает ввода значения с клавиатуры и нажатия клавиши <Enter>. Таким образом можно ввести с клавиатуры число- вое значение и запомнить ее значение в переменной X. Внутри строки- аргумента функции input может присутствовать специальный набор из двух символов /п, приводящий к показу сообщения на двух строках (часть сообщения после /п показывается на новой строке). Для ввода не числового, а текстового значения следует вызвать функцию input с двумя аргументами: » str = input('str = ’, ’s') В результате выполнения этой функции на экране появляется надпись, после чего можно набирать необходимый текст с клавиатуры, заканчивая ввод нажатием клавиши <Enter>. Если нажать <Enter>, не введя с клавиатуры никакого текста, то переменная str примет значение пус- того массива. Перед использованием этой переменной следует проверить
2.9. Текстовые строки 65 ее содержимое функцией isempty (str), возвращающей единицу, ко- гда аргумент является пустым массивом. Таблица 2.11. Функции для работы со строками Функция Назначение char Перевод массива целых чисел в массив символов num2str Перевод числа в строку int2str Перевод целого числа в строку mat2str Преобразование матрицы в строку str2mat Объединение строк в матрицу str2num Перевод строки в число str2double Преобразование символьного вида числа в числовой strcat Объединение (сцепление) строк strvcat Вертикальное объединение (сцепление) строк findstr Поиск подстроки в строке strtok Поиск первой подстроки, отделенной пробелами strcmp Сравнение строк strcmpi Сравнение строк без учета регистра strncmp Сравнение первых п символов двух строк strrep Замена в строке одной подстроки на другую upper Преобразование в прописные буквы lower Преобразование в строчные буквы ischar Проверка, является ли объект массивом символов blanks Вставка пробелов deblank Удаление пробелов в конце строки strjust Выравнивание элементов в строке sprintf Форматная запись в строку sscanf Чтение данных из строки в заданном формате 2.9.2. Массивы строк Удобной возможностью организации строковых переменных явля- ются массивы строк, которые формируются так же, как обычные вектор-
66 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ столбцы, но в качестве их элементов выступают строки одинаковой дли- ны. Массив строк является двумерным массивом (матрицей), состоящим из символов, поэтому возникает ограничение на длину его строк. Корот- кие строки следует дополнить пробелами до максимальной из длин строк, входящих в массив. » name=[ ’MATLAB ’ ; ’MAPLE ’ ; ’MATHEMATICA’ ] name = MATLAB MAPLE MATHEMATICA Функция char решает эту задачу: » name = char ( ’MATLAB ’ , ’MAPLE ’ , ’MATHEMATICA’) ; Доступ к строкам в массиве осуществляется при помощи индексации: » name(1,:) ans МЧАТ LAB 2.10. Структуры Система MATLAB поддерживает работу со структурами - объек- тами данных (тип struct), содержащими разную поименованную ин- формацию. Структурами MATLAB являются многомерные массивы, со- держащие контейнеры данных, называемые полями, каждому из которых присваивается свое имя. Поля структуры могут содержать любой тип данных. Отдельная структура - это структурный массив размерности 1x1. Использование массива структур является эффективным способом хранения информации, представленной в виде таблицы с полями, содер- жащими однотипные элементы данных. 2.10.1. Создание структуры Допускаются два способа заполнения массива структур - операто- рами присваивания для всех полей каждой структуры массива, или функцией-конструктором struct, позволяющей внести значения сразу в несколько полей структуры. Можно создать структуру, а затем в любом месте добавить новое поле. » Human = struct(’Name’,’Ivan','Age’,28,’Sex','m'); » Human.Info = [1 2; 3 4] ; » Human.Addres = 'Minsk';
2.10. Структуры 67 Или: » Human.Name =’Ivan'; » Human.Age = 28; » Human.Sex = ' m' ; » Human.Info = [11 12; 13 14]; » Human.Addres = 'Minsk'; Расширение структуры производится по тому же правилу, что и до- бавление строк или столбцов в массив: » Human(2).Info = [21 22; 23 24]; При этом незаполненным полям второго элемента массива структуры Human будут автоматически присвоены значения пустого массива [ ]. Для пополнения структуры можно также использовать конструктор struct, но в этом случае в нем уже надо указать и заполнить все суще- ствующие поля или присвоить им значение [ ]. » Human(3)=struct('Name','Ann','Age',[], 'Sex','f', 'Info',[]); Набор полей массива структур можно изменять динамически. На- пример, уже после того, как определен массив Human типа struct размера 1x3 с четырьмя указанными выше полями ('Name' , 'Age' , ' Sex' , ' Info '), можно выполнить присваивание » Human(1).Number = 123456; после которого массив структур уже будет обладать пятью полями. Так как у второго и третьего элементов массива Human поле Number яв- но не задано, то оно равно пустому массиву [ ]. Чтобы вывести содержимое отдельных полей массива структур, нужно использовать фигурные скобки {Human. Name}, если с данным полем связаны символьные данные, и квадратные скобки [Hu- man . Name ], если с данным полем связаны числовые данные. Обратите внимание При использовании массива структур необходимо придерживаться сле- дующих правил: • Доступ к структурам, входящим в массив, осуществляется при помо- щи индексации: Human (1) .
68 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ • Поле отделяется от имени структуры при помощи точки: Hu- man (1) . Number. • Доступ к элементу матрицы, являющейся значением поля структуры, осуществляется при помощи двух операций индексации и одной опе- рации доступа к полю структуры: Human (1) . Inf о (1,2 ) . Если два массива структур имеют одинаковый набор полей, то до- пускается групповое присваивание, например, когда значения всех полей второго элемента массива Student копируются в поля третьего эле- мента массива Human. » Human(3) = Student(2); Если же требуется групповая операция копирования содержимого одноименного поля всех элементов массива структур, то необходимо выполнить следующую команду: » age = [Human.Аде]; Применение прямоугольных скобок обязательно, так как над значениями полей отдельных элементов производится операция конкатенации. В качестве содержимого некоторого поля структуры может высту- пать другая структура, т. е. структуры могут быть вложенными. В каче- стве имени вложенной структуры выступает имя поля внешней структу- ры: » ext.data = 1; » ext.inn.text=’info’; » ext.inn.data=[1 2 3; 4 5 6; 7 8 9]; Здесь inn - имя внутренней структуры, являющейся полем внешней структуры ext. Для изменения числового данного, стоящего в третьей строке первого столбца (поле data), применяется команда » ext.inn.data(3,1) = 11 2.10.2. Функции для работы со структурами В MATLAB имеется ряд функций для работы со структурами. Пере- чень функций для организации работы со структурами представлен в табл. 2.12. Структуры MATLAB можно назвать агрегированным типом дан- ных.
2.11. Массивы ячеек 69 Таблица 2.12. Функции для работы со структурами Функция Назначение fieldnames Получение названий полей структуры getfield Получение содержимого определенных полей rmfield Удаление полей структуры setfield Присвоение значения полю структуры struct Создание структур и массива структур struct2cell Преобразование массива структур в ячейки deal Организация доступа к полям массива структур isstruct Проверка, является ли указанный объект структурой isfield Проверка, содержит ли структура указанное поле Другим агрегированным типом данных в системе MATLAB являют- ся ячейки (тип cell). 2.11. Массивы ячеек Кроме числовых массивов, массивов строк и структур, в MATLAB определен еще один тип переменных - массив ячеек (тип cell), кото- рый предназначен для хранения разнородных объектов (массивов разных размерностей, разнотипных данных). Массив ячеек состоит из ячеек, или контейнеров, каждый из кото- рых может содержать данные разных типов. Массив ячеек может быть полем структуры. Этот тип данных является более удобной формой ор- ганизации данных по сравнению с массивом структур в том случае, когда данные не содержат однотипных полей. 2.11.1. Создание массива ячеек Методы создания массивов ячеек похожи на методы создания структур. Как и в случае структур, массивы ячеек могут быть созданы либо путем последовательного присваивания значений отдельным эле- ментам массива, либо целиком при помощи специальной функции- конструктора cell. При работе с массивами ячеек важно различать ячейку (элемент массива ячеек) и ее содержимое. Ячейка - это содержи- мое плюс некоторая оболочка (служебная структура данных) вокруг это-
70 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ го содержимого, позволяющая хранить в ячейке произвольные типы данных любого размера. Выражение любого типа данных системы MATLAB можно превра- тить в ячейку, заключив его в фигурные скобки. Тогда с помощью опе- рации присваивания и обычных операций индексации » W = {[7 9] 'Tony' 3+4i; [1 2;3 4] -5 'abc'}; » h_struct =struct('fieldl',[ 1 2 3],'field2','a'); » W(l,4) = { h_struct } W = [1x2 double] 'Tony' [3+4i] [1x1 struct] [2x2 double] [ -5] 'abc' [] строится массив ячеек 2x4, элементами которого являются ячейки, со- держащие соответственно вектор-строку 1x2, текстовую строку, скаляр 1x1, структуру hstruct, числовой массив 2x2, скаляр 1x1, текстовую строку и пустой массив. Таким образом, построенный массив ячеек со- держит разнородные данные. При этом в командном окне показывается содержимое не всех ячеек этого массива. Более подробную информацию можно получить, вызвав функцию celldisp (W). Содержимое массива ячеек можно отобразить в графическом окне (рис. 2.5) при помощи функции cellplot (W). Рис. 2.5. Отображение содержимого массива ячеек в графическом окне Для того чтобы воздействовать на содержимое ячеек, нужно индек- сировать массив ячеек при помощи фигурных скобок. При обычной ин-
2.11. Массивы ячеек 71 дексации круглыми скобками из массива ячеек извлекается отдельная ячейка (следует четко различать саму ячейку и ее содержимое). » W(l,l) ans = [1x2 double] » W{1,1} ans =7 9 Массивы ячеек полностью решают типовую задачу хранения не- скольких строковых данных под одним именем. При формировании мас- сивов строк каждая строка должна иметь одну и ту же длину, что огра- ничивает применение такого решения. В случае массива ячеек такого ог- раничения нет: » W{1} = ’MATLAB’; W{2} = ’MATHEMATICA ’ ; В данном случае фигурные скобки применены в роли индексирующих элементов, так что использовать фигурные скобки в правых частях опе- рации присваивания теперь не нужно (там присутствуют значения, а не ячейки). В итоге под именем массива W хранятся две текстовые строки разной длины. Как и в случае структур, кроме поэлементного создания массива ячеек, возможно использование функции-конструктора: » W = cell(size(ones(2,2)) ) W = [] [] или » W = cell(2,2); которая сразу создаст массив ячеек требуемой размерности и размера, при этом каждая ячейка будет пустой (содержимым пустой ячейки явля- ется пустой числовой массив). Затем можно осуществлять поэлементные присваивания. В этом случае уже не выполняется перестройка структуры массива ячеек с каждым новым присваиванием. Чтобы удалить некоторый диапазон ячеек из массива ячеек, нужно этому диапазону присвоить значение пустого массива [ ]. » W(2, :) = [] ; Теперь массив ячеек W имеет размер 1x2, так как предыдущая команда удалила всю вторую строку массива.
72 Т е м a 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ У массивов ячеек имеется множество применений. Например, если стоит задача передачи в М-функцию произвольного числа параметров или возвращения функцией произвольного числа выходных значений, то использование массивов ячеек является единственно возможным ее ре- шением. Существуют еще и другие случаи, когда применение массива ячеек предпочтительно или обязательно. Как и структуры, массивы ячеек также можно назвать агрегированным типом данных системы MATLAB. 2.11.2. Функции для работы с массивами ячеек В MATLAB имеется ряд сервисных функций для работы с массива- ми ячеек. Основные функции, выполняющие действия с массивами яче- ек, представлены в табл. 2.13. Таблица 2.13. Функции для работы с массивами ячеек Функция Назначение cell Создание пустого массива ячеек заданного размера cellfun Применение функции к содержимому массива ячеек cellstr Преобразование массива символов в массив ячеек iscellstr Проверка, является ли объект массивом ячеек из строк cell2struct Преобразование массива ячеек в массив структуры cell2matrix Преобразование массива ячеек в матрицу celldisp Вывод содержимого массива ячеек в командное окно cellplot Отображение содержимого массива ячеек в графиче- ском окне num2cell Преобразование числового массива в массив ячеек iscell Проверка, является ли указанный объект массивом ячеек
ТЕМА 3 ЭЛЕМЕНТЫ ПРОГРАММИРОВАНИЯ Система MATLAB включает в себя язык программирования - высокоуровневый язык матриц и массивов с операторами управления, функциями, структурами данных, вводом-выводом и возможностями объектно-ориентированного программирования. Это позволяет создавать большие и сложные прикладные программы с высокоразвитым графиче- ским интерфейсом пользователя. 3.1. Управление вычислением Язык программирования MATLAB включает стандартный набор конструкций языка программирования высокого уровня. В данном раз- деле описаны основные операторы, задающие порядок выполнения ко- манд. Такие конструкции называются операторами управления. Опера- торы можно использовать как в m-сценариях, так и в ш-функциях. К операторам управления относятся операторы ветвления и опера- торы цикла. 3.1.1. Операторы ветвления К операторам ветвления относятся условный оператор if и опера- тор переключения switch. Эти операторы позволяют создать гибкий разветвляющийся алгоритм выполнения команд, в котором при выпол- нении определенных условий управление передается соответствующему блоку команд. 3.1.1.1. Условный оператор Условный оператор использует ключевые слова if («если»), else («иначе»), el seif («иначе, если»), end («конец всей конст- рукции»). Область действия условного оператора начинается ключевым сло- вом if, а заканчивается ключевым словом end. Под условием понима-
74 Т е м a 3. ЭЛЕМЕНТЫ ПРОГРАММИРОВАНИЯ ется произвольное выражение (чаще всего это операции отношения и ло- гические операции), истинность или ложность которого (т. е. соответст- венно отличие или равенство нулю) влияет на дальнейший ход выполне- ния программы. Условный оператор может выступать в одной из следующих трех форм. if condition statements end if condition statements else statements end if condition_l statements elseif condition_2 statements else statements end Если условие истинно, то выполняется блок команд, стоящий после строки с ключевым словом if. Если условие ложно, то эти команды пропускаются и либо происходит переход к блоку, следующему после end (первая форма), либо проверяется еще одно условие в строке с ключевым словом el seif (третья форма условного оператора), либо выполняются без дополнительных проверок команды, стоящие после строки с ключевым словом else (вторая из приведенных выше форм). При записи условия используются операции отношения и логиче- ские операции, приведенные в табл. 2.8, 2.9 темы 2. В условных выражениях можно использовать не только перемен- ные, но и массивы. В тех случаях, когда значением таких выражений бу- дет массив, истинность условия наступает, когда истинным является ус- ловие для каждого элемента массива. Если хоть для одного элемента та- кого массива условие будет ложным, то условие считается ложным и для всего массива. Кроме того, ложность имеет место при использовании пустых массивов. Следующий фрагмент кода иллюстрирует работу условного опера- тора, в результате выполнения которого переменная z получит значе- ние -1, так как матрица А содержит элемент, меньший 1, и все условие считается ложным. » А = [78; 10]; if А >= 1 z = 1, else z = -1, end
3.1. Управление вычислением 75 Запись if А по своему действию полностью эквивалентна записи if А ~=0 и записи if all (А (:)). Запись if ~А является более компактной формой записи if А ==0. 3.1.1.2. Оператор переключения Оператор переключения switch предоставляет возможность раз- ветвления и выполнения операторов в зависимости от значения выраже- ния переключения switch_expr (скаляра или строки). Оператор пе- реключения использует ключевые слова switch («переключить»), case («случай»), otherwise («иначе») и имеет следующую конст- рукцию: switch switch_expr case case_expr, statement, ..., statement case {case_exprl, case_expr2, case_expr3,...} statement, ..., statement otherwise, statement, ..., statement end Сначала вычисляется значение выражения переключения switch_expr, а затем полученный результат сравнивается с набором значений case_expr, case_exprl и так далее. В случае совпадения значения выражения со значением, указанным после case, или с одним из значений из списка case, выполняется нижестоящая ветка. Если нет совпадения ни с одним из перечисленных значений, то выполняется вет- ка, стоящая после ключевого слова otherwise. Строк с ключевым словом case может быть много, а строка с ключевым словом other- wise -только одна. В отличие от языка C++ после выполнения какой-либо из ветвей case происходит обязательный выход из оператора switch. При этом значения, заданные в других case, уже не проверяются, поэтому в кон- струкции нет необходимости использовать оператор break. appl = ’MatLab’; swi tch upper(appl) case {’MATLAB’,’MATHCAD’}
76 Т е м a 3. ЭЛЕМЕНТЫ ПРОГРАММИРОВАНИЯ disp('Application is numeric') case { 'MAPLE ' , 'MATHEMATICA' } disp('Application is symbolic') otherwise disp('Unknown application') end 3.1.2. Операторы цикла Назначение операторов цикла - циклическое повторение группы программного кода. В зависимости от способа определения условия пре- кращения повторов различают два вида операторов цикла в М-языке сис- темы MATLAB. Цикл for предназначен для выполнения заданного числа повторяющихся действий, цикл while - для действий, число ко- торых заранее не известно, но известно условие продолжения цикла. З.1.2.1. Цикл while Цикл while использует ключевые слова while и end. Он име- ет вид while expression statements end Здесь повтор участка кода statements продолжается до тех пор, пока выражение expression истинно (не равно нулю). В случае мас- сивов истинность наступает, когда все элементы массива истинны. Следующий фрагмент вычисляет сумму отрезка ряда ^1/п!: S=0; п=1; х=1; while х > 1е-10 S = S + х; n = n + 1; х = 1/factorial(п); end Условием выполнения цикла служит требование к очередным сла- гаемым быть больше некоторого заранее определенного числа: как толь- ко слагаемое станет меньше этого числа, суммирование прекратится. Для задания условия выполнения цикла используются операции от- ношения. Задание более сложных условий производится с применением логических операторов (см. табл. 2.8, 2.9 темы 2). Определение порядка
3.1. Управление вычислением 77 выполнения логических операций выполняется при помощи круглых скобок. З.1.2.2. Цикл for Цикл for используется при выполнении заранее определенного числа повторяющихся действий. В конструкции цикла используются ключевые слова for («для») и end. Он имеет вид: for variable = expression statements end где variable - произвольно выбираемое программистом имя пере- менной цикла. Тело цикла statements выполняется для всех воз- можных значений переменной variable. Набор возможных значений для переменной цикла поставляет выражение expression. Чаще всего в MATLAB выражение expression определяется с помощью операции формирования диапазона значений. В этом случае цикл имеет вид: for count = start:step:final statements end Здесь count - переменная цикла, start: step: final определяют диапазон ее значений. Цикл заканчивается, как только значение count становится больше final. Переменная цикла может принимать не только целые, но и вещест- венные значения любого знака. Следующий фрагмент кода демонстрирует работу цикла for на примере заполнения матрицы Гильберта. k=4; а = zeros(к,к); for m = 1:к for n = 1:к a(m,n) = 1/(m+n -1); end end При каждом новом проходе переменные цикла тип увеличиваются на единицу. В данном примере условием останова является исчерпание всех возможных значений переменной цикла. Таким образом, использо-
78 Т е м a 3. ЭЛЕМЕНТЫ ПРОГРАММИРОВАНИЯ вание того или иного варианта оператора цикла диктуется особенностя- ми конкретной математической задачи. Вместо операции задания диапазона можно явно указывать весь на- бор возможных значений в виде вектор-строки, например: for n = [1, 3, 9] что приведет к трем итерациям. Циклы for и while можно прервать, если применить оператор break внутри тела цикла. Передать управление следующей итерации обоих циклов можно при помощи оператора continue. Обратите внимание Для повышения эффективности программы очень важно векторизо- вать алгоритм. Везде, где это возможно, вместо операторов цикла лучше применять эквивалентные по результатам векторные или матричные операции, так как последние исполняются в системе MATLAB быстрее. Например, вместо к=0; for х = 0:0.01:2*pi к=к+1; у(к) = cos(х); end лучше использовать векторизованную версию кода: х = 0:0.01:2*pi; у = cos(х); так как такой код быстрее исполняется и записывается короче. 3.2. Обработка исключительных ситуаций В MATLAB в отличие от многих языков программирования выпол- нение некоторых некорректных математические операций не приводит к завершению программы. Так, при делении положительного числа на нуль получается Inf (бесконечность), при делении отрицательного числа на нуль получается -Inf (минус бесконечность), при делении нуля на нуль получается NaN (Not-a-Number - не число). Во всех случаях выдается предупреждение об ошибке “Warning: Divide by zero”. При этом программа не прекращает своей работы. Но встречаются так называемые исключительные ситуации - ошиб- ки, приводящие к завершению программы. В этих случаях использова-
3.2. Обработка исключительных ситуаций 79 ние конструкции try... catch позволяет выделить и обработать такие ситуации, выполнив некоторые действия в случае возникновения. try, statement, • • • t statement, catch, statement, statement, end Операторы, выполнение которых может привести к ошибке, заклю- чаются в конструкцию между try и catch. Если эти операторы вы- полняются без ошибок, то после них управление передается первой ко- манде, стоящей после ключевого слова end. Если возникает ошибка во время выполнения любого из этих операторов, то управление передается блоку, заключенному между ключевыми словами catch и end. Если и здесь встречается ошибка, то выполнение программы прекращается.
ТЕМА 4 СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ Работа в интерактивном режиме требует постоянного ввода команд в командной строке с клавиатуры. Такой режим удобен для выполнения простых операций. Но если объем операций велик, вычисления нужно повторять многократно или необходимо реализовать сложные алгорит- мы, то работа из командной строки затрудняется. В этих случаях самым удобным способом выполнения команд MATLAB является оформление их в виде М-файлов. Последовательность команд набирают и сохраняют в текстовых файлах, дополняют их комментариями и выполняют из ре- дактора М-файлов или запускают из командной строки в командном ок- не Command Window. Для работы с М-файлами предназначен встроенный текстовый ре- дактор М-файлов, который вызывается командой меню File | New ► M-file и работает в своем собственном окне, обеспечивая создание, редактирование, запуск и отладку кода. 4.1. Типы М-файлов Файлы, содержащие команды и операторы MATLAB, называются М-файлами. Существует два типа М-файлов: файл-сценарии (Script М- files), содержащие последовательность команд, и файл-функции (Function M-files), в которых описываются функции с характеристиками, пред- ставленными в табл. 4.1. 4.1.1. Сценарии Сценарий (script) - это текстовый файл, в котором в нужном по- рядке записаны команды, подлежащие последовательному выполнению. Сценарий производит вычисления как с переменными, которые опреде- ляются непосредственно внутри него, так и с переменными, ранее опре- деленными в рабочем пространстве Workspace системы MATLAB. Все переменные, которые создаются и используются в сценарии, сохра-
4.1. Типы М-файлов 81 няются в рабочем пространстве Workspace, после выполнения сцена- рия они могут быть использованы для дальнейших вычислений в других сценариях и в командах, выполняемых из командной строки. Сценарию нельзя в момент его вызова передать для обработки в виде параметров дополнительную информацию, не содержащуюся в рабочем пространст- ве. Сценарий не возвращает результаты своей работы через выходные параметры. После создания сценария его надо сохранить в файле на диске. Этот файл может иметь произвольное имя (желательно, чтобы оно не совпало с именами файлов, входящих в стандартную поставку системы MATLAB) с расширением в виде одной буквы ш (например, filel.m). Со- храненный сценарий в любой момент можно выполнить одним из сле- дующих способов: • целиком или частично из редактора М-файлов; • целиком из командного окна, если набрать в командной строке имя файла (без расширения), содержащего сценарий, и нажать клавишу <Enter>; • целиком из другого сценария, если в качестве команды указать имя файла (без расширения), содержащего сценарий. Для того чтобы MATLAB нашел и выполнил указанный сценарий, содержащий его М-файл должен находиться в текущем каталоге Cur- rent Directory, либо путь к нему должен быть указан в пути поиска Search Path. 4.1.2. Функции Если первая строка М-файла начинается с определения function [<список вых. параметров>] = <имя функ- ции>(<список вход. параметров>) то этот файл содержит определение М-функции. М-функция включает следующие компоненты: • строка заголовка функции задает имя функции, количество и порядок следования выходных и входных аргументов; • первая строка подсказки определяет исчерпывающее краткое назначение функции. Она выводится на экран с помощью команд lookfor или help;
82 Т е м a 4. СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ • текст подсказки представляет собой более детальное описание назначения и способов вызова функции, выводится на экран при ис- пользовании команды help; • тело функции представляет собой непосредственно программный код, который реализует вычисления и присваивает значения выходным аргументам; • комментарий представляет собой текст внутри программного кода, описывающий алгоритм выполнения функции. Как функции, так и сценарии могут иметь все эти части, за исклю- чением строки определения функции, которая имеет отношение только к функциям. Сравнительная характеристика М-сценариев и М-функций пред- ставлена в табл. 4.1. Таблица 4.1. Характеристика М-сценариев и М-функций М-сценарий М-функция He допускает входных и выход- ных параметров Допускает входные и выходные па- раметры Оперирует с данными рабочей области. Переменные сохраня- ются в рабочем пространстве Workspace По умолчанию внутренние перемен- ные являются локальными и хранят- ся во внутреннем рабочем простран- стве, относящемся к данной функ- ции Предназначен для автоматиза- ции многократно использую- щихся последовательностей ко- манд Используется для расширения воз- можностей языка MATLAB при соз- дании собственных приложений Не может использоваться в ка- честве операндов в выражениях или в качестве аргументов функций Может использоваться как составная часть выражения или в качестве ар- гументов другой функции. Следующий код демонстрирует пример стандартного оформления М-файла на языке программирования системы MATLAB. function n = factorial(n) % FACTORIAL Factorial function. % FACTORIAL(N) for scalar N, is the product of all % the integers from 1 %to N,
4.1. Типы М-файлов 83 % FACTORIAL(N) for N-D matrix, is the factorial for % each element of N. N = n (:) ; if any (fix (N) ~=N) | |any(N<0) I I . . . ~isa(N,’double') I I~isreal(N) error('MATLAB:factorial:NNegativeInt’, ... 'N must be a matrix of non-negative integers.') end n(N>170) = 171; m = max([1; n(:)]); N = [11 cumprod(2:m)]; n(:) = N(n+1); 4.1.2.1. Строка определения функции Строка определения функции (Function Definition Line) информирует MATLAB о том, что М-файл содержит функцию, опреде- ляет ее имя и указывает количество и порядок следования входных и вы- ходных аргументов. Имя функции должно начинаться с буквы, может содержать любые буквенно-цифровые символы и символ подчеркивания. Так как именование переменных и функций подчиняется определенным правилам, проверить правильность определяемого имени можно при по- мощи функции, которая определит, допустимо ли данное имя. » isvarname myfun Хотя имена функций могут быть любой длины, MATLAB использу- ет только первые N символов имени (где N - это число, возвращаемое функцией namelengthmax) и игнорирует остальные. Поэтому важно обеспечить уникальность имени определяемой функции по первым N символам. Имя текстового файла, содержащего функцию, состоит, как прави- ло, из имени первой функции и расширения ш. Обратите внимание Хотя имя функции, указанное в строке определения функции, не обязательно должно совпадать с именем содержащего ее М-файла, реко- мендуется использовать одно и то же имя в обоих случаях во избежание путаницы.
84 Т е м a 4. СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ Если имя файла и имя функции не совпадают, то внутреннее имя функции игнорируется. Так, если файл func.m содержит определение функции newFunc, то вызов функции происходит по имени f unc. 4.1.2.2. Аргументы функции Входные аргументы функции, если имеются, заключаются в круг- лые скобки и следуют после имени функции. Если функция имеет не- сколько выходных аргументов, то они заключаются в квадратные скоб- ки. Для разделения аргументов используется запятая. Например, объяв- ление функции с именем sphere, тремя входными и тремя выходными аргументами имеет следующий вид: function [х, у, z] = sphere(theta, phi, rho) В зависимости от количества входных и выходных аргументов объ- явления функции могут иметь следующие представления: function у = funcName(х) function [] = funcName(х) function funcName(x) function [x, y, z] = funcName() function funcName Одна и та же функция может вызываться с разным числом входных и выходных аргументов (механизм перегрузки функций). В этом случае при определении функции в списках входных и выходных аргументов должно указываться их максимально возможное количество. Имена фактических параметров, передаваемых в функцию, не обя- заны совпадать с именами формальных аргументов, указанных в опреде- лении функции. 4.1.2.3. Первая строка подсказки Первая строка подсказки (Hl Line), которая называется так, пото- му что является первой строкой текста подсказки, - это первая строка комментария, следующая сразу же за строкой определения функции. Так как она содержит текст комментария, то начинается со знака %. Она яв- ляется первой строкой текста, который появляется в командном окне MATLAB, когда пользователь вызывает функцию справки help functionname. Функция lookfor functionname ищет и отобра- жает в командном окне только эту строку. Первая строка подсказки должна содержать резюмирующую информацию о функции.
4.1. Типы М-файлов 85 4.1.2.4. Текст подсказки Система MATLAB рассматривает группу последовательных строк, начинающихся со знака % и следующих сразу же за первой строкой под- сказки, как текст подсказки (Help Text) для функции. Первая строка без знака % в самой левой позиции строки означает конец текста подсказки. Весь этот набор строк вместе с первой строкой подсказки выводится в командное окно системы MATLAB при исполнении команды help function_name. Так как такую команду в первую очередь будут при- менять пользователи функции (а не разработчики), то желательно распо- ложить в этих комментариях описательную информацию и сведения о правильном вызове этой функции. Если функция может вызываться с разным числом входных и выходных параметров (перегрузка функций), то в тексте подсказки следует описать все возможные комбинации аргу- ментов и их значение в каждом случае. Система подсказки игнорирует любые строки комментария, появ- ляющиеся после блока подсказки. 4.1.2.5. Тело функции или сценария Тело функции - это внутренняя часть функции, содержащая описа- ние некоторого действия. Тело функции содержит код, который выпол- няет вычисления и присваивает значения выходным аргументам. Опера- торы тела функции могут содержать блоки управления, вызовы функций, вычисления, присваивания, команды интерактивного ввода/вывода, ком- ментарии и пустые строки. 4.1.2.6. Однострочный комментарий Комментарий - это часть программы, которая игнорируется интер- претатором М-языка при выполнении и служит для удобочитаемости ис- ходного текста программы. Однострочным комментарием в MATLAB является любая последовательность символов, располагающаяся за зна- ком % и до конца текущей строки. Например, % Add up all the vector elements. у = sum(x) % Use the sum function. В дополнение к строкам комментария можно добавлять пустые строки в любом месте М-файла. Пустые строки игнорируются.
86 Т е м a 4. СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ 4.1.2.7. Блок комментария Для записи комментария более чем на одну строку следует исполь- зовать пару символов % { и %}. %{ This next block of code checks the number of inputs passed in, makes sure each input is a valid data type, then branches to start processing the data. %} Обратите внимание Операторы % { и %} должны занимать отдельные строки непосред- ственно перед блоком комментария и за ним. В эти строки нельзя вклю- чать никакой другой текст. 4.1.3. Типы функций Система MATLAB предлагает несколько типов функций для ис- пользования в программировании: • Первичные функции М-файлов (The Primary М-File Functions) - первые функции М-файлов, как правило, содержащие в себе основную программу. • Подфункции (Subfunctions) - действуют как подпрограммы основ- ных функций, также используются для определения множественных функций в пределах отдельного М-файла. • Анонимные функции (Anonymous Functions) - являются быстрым способом создания функции из произвольного выражения MATLAB, не требующим создания М-файла. • Вложенные функции (Nested Functions) - определяются внутри дру- гих функций. Улучшают читабельность программы, а также предос- тавляют более гибкий доступ к переменным М-файла. • Перегруженные функции (Overloaded Functions) - имеют одно и то же имя, но отличаются количеством и типом входных параметров. Действуют аналогично перегруженным функциям любого объектно- ориентированного языка программирования. • Частные функции (Private Functions) - дают возможность ограни- чить доступ к функции. Их можно вызвать только из функций, нахо- дящихся в М-файле в каталоге предыдущего уровня.
4.1. Типы М-файлов 87 4.1.З.1. Анонимные функции Анонимные функции - это простая форма функции MATLAB, не требующая создания М-файла. Она состоит из единственного выражения MATLAB и любого числа входных и выходных параметров. Определить анонимную функцию можно непосредственно в командной строке ко- мандного окна MATLAB, а также внутри М-файла. Это обеспечивает возможность быстрого создания простых функций без необходимости создания дополнительного М-файла. Синтаксис определения анонимной функции из выражения следую- щий: f = @(arglist)expression Представленная ниже команда создает анонимную функцию, которая вычисляет квадрат числа. При вызове этой функции MATLAB присваи- вает передаваемое значение переменной х и затем использует х в вы- ражении х. л 2: sqr = @(х) х.А2; Используется описанная функция следующим образом: а = sqr(5) а = 25 4.1.3.2. Первичные функции и подфункции Все функции, которые не являются анонимными, должны быть оп- ределены внутри М-файла. Каждый М-файл обязательно содержит пер- вичную функцию, располагающуюся в файле самой первой, и может со- держать любое число подфункций, которые следуют за основной функ- цией. Первичные функции могут вызываться извне своего М-файла (из командной строки MATLAB или в функциях других М-файлов), в то время как подфункции не могут. Подфункции видимы только для пер- вичной функции и для других функций, находящихся в данном М-файле. 4.1.3.3. Частные функции Частная функция - это разновидность первичной функции М-файла. Ее особенностью является то, что она видима только для ограниченной группы функций. Данный тип функций удобен, если необходимо огра- ничить доступ к функции. Частные функции размещаются в подкатало- гах со специальным именем private. Они являются видимыми только
88 Т е м a 4. СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ функциям, находящимся в каталоге предыдущего уровня. Например, те- кущий каталог Current Directory MATLAB установлен на каталог newmath. Подкаталог каталога newmath, названный private, со- держит функции, которые могут вызываться только функциями из new- math. Поскольку частные функции видимы только в каталоге предыдуще- го уровня, они могут использовать те же самые имена, что и функции в других каталогах. Это удобно при создании собственной версии опреде- ленной функции, поскольку оригинал сохранен в другом каталоге. Так как MATLAB в первую очередь ищет частные функции и только после этого стандартные функции М-файла, то, например, вместо нечастной функции с именем test.m он найдет частную функцию test.m. 4.1.3.4. Вложенные функции Функции могут определяться внутри тела любой функции М-файла. Это называется вложением во внешнюю функцию. Вложенная функция может содержать любые компоненты других функций М-файла. В дан- ном примере функция В является вложенной в функцию А: function х = A(pl, р2) В(р2) function у = В(рЗ) end end Подобно другим функциям вложенная функция имеет свое собст- венное рабочее пространство, в котором хранятся используемые данной функцией переменные. Также она имеет доступ к рабочим пространст- вам всех тех функций, в которые она вложена. Так, например, перемен- ная, которая определена в первичной функции, может использоваться функцией, вложенной в первичную, независимо от уровня вложенности. Точно так же переменная, которая определена во вложенной функции, может использоваться любой из функций, содержащих данную функ- цию.
4.1. Типы М-файлов 89 4.1.3.5. Перегрузка функции Перегруженные функции в MATLAB действуют по такому же принципу, что и перегруженные функции большинства языков програм- мирования. Перегрузка используется для создания функций, отвечающих различным типам входных данных. 4.1.4. Видимость имен функций Когда пользователь вводит в командной строке какое-либо имя, на- пример name, MATLAB выполняет действия в следующей последова- тельности: 1) ищет указанное имя среди переменных; 2) ищет в текущем каталоге файл с именем name . m; 3) просматривает каталоги, указанные в пути поиска Search Path, для поиска файла name . bi (встроенные функции) или name . m. Если существует более одной функции с одним и тем же именем, то порядок каталогов в пути поиска Search Path определяет, какая функция будет вызвана. MATLAB вызывает первую найденную функ- цию. Для того чтобы вызвать функцию из каталога, расположенного дальше в пути поиска, следует сделать этот каталог текущим. При запус- ке М-сценария можно указать полный путь к соответствующему М-файлу. 4.1.5. Синтаксис вызова М-функций Входные параметры и возвращаемые значения могут быть скаляра- ми или массивами различных размеров. Например, функция fund принимает два массива произвольных, но одинаковых размеров: function [ А, В ] = fund ( Ml, М2) А = [Ml, М2 ] ; В = [Ml; М2 ] ; Эти массивы в теле функции подвергаются операции конкатенации, вы- полнимость которой гарантируют одинаковые размеры входных масси- вов Ml и М2. Вызов созданной функции осуществляется из командного окна или из текста какой-либо другой функции обычным образом: записывается имя функции, после которого в круглых скобках через запятую перечис- ляются фактические входные параметры. Фактические параметры, со
90 Т е м a 4. СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ значениями которых и будут выполняться действия, могут быть заданы числами (массивами чисел), именами переменных, уже имеющими кон- кретные значения, а также выражениями. Если фактический параметр задан именем некоторой переменной, то реальные вычисления будут производиться с копией этой переменной (а не с ней самой). Это называ- ется передачей параметров по значению. XI = [123; 456]; Х2 = [987; 654]; [Y, Z] = fund (XI, Х2) ; В рассмотренном примере из двух входных матриц 2x3 получаются две выходные матрицы Y и Z: Y == [123987; 456654] Z == [123; 456; 987; 654] Очевидно, что при вызове функции не требуется совпадения имен фактических (XI, Х2, Y, Z) и формальных (Ml, М2, А, В) входных и выходных параметров. Вызов функции [Y, Z] = fund ( [1 2] , [3 4]) ; с двумя входными массивами размера 1x2 возвращает две выходные матрицы размера 1x4 и 2x2. Таким образом, одна и та же функция может обрабатывать входные параметры различных размерностей. Одним из отличий М-функции от М-сценария является возможность использования М-функции в качестве составной части выражения. При этом если функция возвращает несколько значений, то в составе выра- жений в качестве значения функции, применяемого для дальнейших вы- числений, используется первое из возвращаемых функцией значений. Следующий фрагмент кода иллюстрирует это положение: fund ( [1 2] , [3 4] )+10 ans = 11 12 13 14 Так как при вызове функции фактическими параметрами, со значе- ниями которых и будут выполняться действия, могут быть числа, масси- вы чисел, имена переменных, уже имеющих конкретные значения, а также выражения, то могут возникнуть ошибочные ситуации, связанные с несовпадением типов фактических и формальных параметров. MATLAB не выполняет никаких проверок на эту тему, а просто передает управление функции. Чтобы избежать, по возможности, возникновения
4.1. Типы М-файлов 91 таких ошибочных ситуаций, следует в теле М-функций осуществлять проверку входных параметров. Для написания такого кода используются конструкции управления. 4.1.5.1. Проверка параметров М-функций Несовпадение типов, размеров и числа фактических и формальных параметров в М-функции приводит к их неправильной работе. Жела- тельно встраивать внутрь кода М-функций проверки входных парамет- ров, так как пользователь М-функции всегда может ошибиться при ее вызове. Например, функция fund предполагает использование в качест- ве первого и второго аргументов массивов одинаковых размеров. Если пользователь по ошибке задаст фактические параметры в виде массивов разных размеров, то в процессе выполнения функции возникнет ошибка. Чтобы избежать этого, можно в теле функции организовать проверку размеров первого и второго параметров: function [А, В] = fund (Ml, М2) if size(Ml) ~= size(М2) error('Error in parameters size') end A = [Ml, М2 ] ; В = [Ml; М2 ] ; При вызове функции fund с неправильными размерами первого и второго аргументов встроенная функция системы MATLAB error будет корректно останавливать всю работу и выводить в командное окно MATLAB диагностическое сообщение, после чего пользователю оста- нется лишь повторно вызвать функцию fund, но уже с правильными параметрами. Для проверки общего числа фактических параметров в системе MATLAB предусмотрены две переменные nargin и nargout, со- держащие соответственно количество входных и выходных аргументов, фактически переданных функции при вызове. Тогда проверка на число параметров выполняется следующим образом: if nargin ~= 2 error('Bad number of parameters') end if nargout > 2
92 Т е м a 4. СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ error('Must be <=2 return values') end Такие проверки приводят к тому, что функцию можно вызвать толь- ко с правильным числом входных параметров и возвращаемых значений. Перечень функций, используемых для организаций проверок вход- ных и выходных аргументов, представлен в табл. 4.2 В случае, когда функция допускает многовариантность работы при разном числе входных аргументов и возвращаемых значений (как многие встроенные функции системы MATLAB), необходимо при проверках их числа вместо прекращения работы функции осуществлять переход на разные ветви выполнения. В определении функции при этом нужно ис- пользовать максимально используемое в теле функции число формаль- ных входных и выходных параметров. Степень подробности проверок зависит от предназначения функции. Если предполагается передача функции для внешнего использования, то проверки необходимо сделать более строгими, а текст подсказки, выводимый в командное окно по ко- манде help, более подробным. Таблица 4.2. Функции MATLAB для работы аргументами Функция Назначение nargchk Проверка количества входных аргументов nargin Проверка количества входных аргументов nargout Проверка количества выходных аргументов varargin Список входных аргументов переменной длины varargout Список выходных аргументов переменной длины inputname Определение имени переменной по номеру входного ар- гумента М-функции Обратите внимание • Функции оформляются в виде текстовых файлов с расширением ш. • М-файлы могут содержать коды нескольких функций. Первая функция в файле - это первичная (основная) функция, вызываемая по имени М-файла. Другие функции внутри файла - это подфункции, которые являются видимыми только для основной функции и других подфунк- ций этого файла. • Имя первичной функции обычно совпадает с именем М-файла. Из ко- мандной строки можно вызвать только первичную функцию, все ос- тальные функции вызываются только внутри файла.
4.1. Типы М-файлов 93 • Каждая функция имеет собственный заголовок. Подфункции следуют друг за другом непрерывно. Ключевое слово function или конец файла означает конец функции (никаких специальных признаков кон- ца функции нет). Подфункции могут вызываться в любом порядке, в то время как основная функция выполняется первой. • При обращении к функции компилятор ищет файл с соответствующим именем, компилирует его и выполняет. • Для удаления откомпилированной функции из памяти используется команда »clear func_name. • Если при выполнении функции включен режим echo, то функция будет выполняться в режиме интерпретации, и на экран будут выво- диться результаты выполнения каждого оператора. • Функции внутри одного и того же М-файла не могут обращаться к од- ним и тем же переменным, если они не объявлены глобальными пере- менными внутри соответствующих функций или не переданы им в ка- честве параметров. • Справка help видит только основную функцию и не видит подфунк- ции. • В качестве имени подфункции можно использовать имена функций системы MATLAB, т. к. когда приходит вызов функции из М-файла, то MATLAB в первую очередь проверяет, не является ли эта функция подфункцией. • Все функции перегружаемы. • Новые функции добавляются к словарю системы MATLAB и стано- вятся доступными наряду со встроенными функциями. • MATLAB различает верхний и нижний регистр. • Переменные vargout, vargin имеют тип cell - массив ячеек, каж- дый элемент которого может иметь разный тип. Они возвращают (на- значают) список выходных (входных) аргументов переменной длины. • Переменные nargout, nargin определяют число реально задан- ных выходных (входных) аргументов функции. • Оператор return - это оператор выхода из функции. При вводе в ко- мандной строке оператор return позволяет закончить отладку. • При возможной работе функции с разным числом входных аргументов и возвращаемых значений необходимо в определении функции зада- вать максимально возможное число как первых, так и вторых.
94 Т е м a 4. СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ 4.2. Переменные и их область действия Область действия (scope rules) переменной - это правила, кото- рые устанавливают, какие данные доступны из данного места програм- мы. В языке MATLAB каждая функция - это отдельный блок програм- мы. Попасть в тело функции нельзя иначе, как через вызов данной функ- ции. С точки зрения области действия переменных различают три типа переменных: глобальные, локальные и формальные параметры. Правила области действия определяют, где каждая из них может применяться. Локальные переменные - это переменные, объявленные внутри функции. Локальная переменная доступна только внутри функции, в ко- торой она объявлена, и существует до тех пор, пока выполняется функ- ция. При выходе из функции эта переменная и ее значение теряются. Формальные параметры - это переменные, объявленные при описа- нии функции как ее аргументы. Функции могут иметь некоторое количе- ство параметров, которые используются при вызове функций для пере- дачи значений в тело функции. Формальные параметры могут использо- ваться в теле функции так же, как локальные параметры. Область дейст- вия формальных параметров - блок, являющийся телом функции. Глобальные переменные в языке MATLAB - это переменные, объ- явленные при помощи ключевого слова global: global name_l, name_2, ... Как правило, каждая М-функция использует локальные переменные, которые изолированы от переменных других функций и рабочей облас- ти. Функция располагает собственным, изолированным от рабочего про- странства системы MATLAB, пространством переменных. Внутри функ- ции не видны переменные, определенные в командном окне MATLAB, - они являются внешними по отношению к функции. 4.2.1. Глобальные переменные Одним из каналов передачи информации из командного окна систе- мы MATLAB в М-функцию и из одной функции в другую является ме- ханизм параметров функции. Другим таким механизмом являются гло- бальные переменные. Если несколько функций, сценариев и, возможно, базовое рабочее пространство Workspace системы MATLAB объяв- ляют некоторую переменную глобальной, то в этом случае все модули
4.2. Переменные и их область действия 95 используют одну и ту же копию этой переменной. Присваивание значе- ния глобальной переменной возможно из любой функции, где эта пере- менная объявлена глобальной. Если эта переменная в момент объявления не существует, то ей присваивается значение пустого массива [ ]. Обратите внимание • Команда global name_l,... определяет переменные как глобаль- ные. • Команда clear global name_l,... удаляет указанные глобальные переменные. • Команда clear global удаляет все глобальные переменные. • Команды who global и whos global выводят список глобаль- ных переменных. • Команда isglobal (name_l) определяет, является ли указанная переменная глобальной. • Если при объявлении переменной глобальной уже существует пере- менная с тем же именем в рабочей области, то MATLAB выдает пре- дупреждающее сообщение и переводит переменную в разряд глобаль- ных переменных. 4.2.2. Устойчивые переменные Устойчивые переменные (persistent variables} - это локальные пере- менные, сохраняющие свое значение между вызовами функции. Устой- чивые переменные обладают следующими свойствами: • Устойчивые переменные объявляются и используются только в преде- лах М-функции. • При объявлении устойчивой переменной MATLAB присваивает ей значение [ ]. Затем переменной присваивается требуемое значение. • Система MATLAB не очищает устойчивые переменные, пока функция существует. Значение устойчивых переменных сохраняется от одного вызова функции до другого. • Переменная должна быть объявлена устойчивой до того, как она будет использоваться в функции. Поэтому обычно объявление переменных устойчивыми помещается в начало функции. • Объявить устойчивую переменную можно при помощи команды persistent name 1,...
96 Т е м a 4. СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ • MATLAB очищает все устойчивые переменные, используемые в функции, если функция очищается по команде clear func_name или если редактируется М-файл, содержащий данную функцию. Следующий фрагмент кода демонстрирует использование устойчи- вой переменной. function findSum(inputvalue) persistent SUM_X if isempty(SUM_X) SUM_X = 0; end SUM_X = SUM_X + inputvalue 4.3. Отладка М-функций В среде программирования MATLAB имеются возможности отлад- ки разрабатываемых функций, то есть существуют способы, при помощи которых можно выявить месторасположение ошибок и их причину. При возникновении ошибки в процессе выполнения М-функции в командное окно выводится приблизительное диагностическое сообщение и номер строки, в котором, по мнению MATLAB, произошла ошибка. Другим способом отладки функции является применение точек останова и поша- гового выполнения функции при помощи встроенного редактора- отладчика medit.exe. Чтобы поставить точку останова на какой-либо строке кода функ- ции, следует установить курсор на нужной строке и нажать клавишу <F12>. Повторное нажатие клавиши <F12> на этой строке убирает точку останова. Точку останова можно поставить также, выполнив ко- манду меню Debug | Set/Clear Breakpoint. В строке слева появ- ляется красный кружок, указывающий на то, что в данной строке про- ставлена точка останова. После этого, не закрывая окна редактора-отладчика, следует пере- ключить при помощи мыши фокус ввода в командное окно MATLAB и обычным образом запустить функцию на выполнение. Система MATLAB выполнит все команды до первой точки останова и сделает паузу. В строке останова появится зеленая стрелка. Теперь можно про- сматривать фактические значения входных параметров функции, теку- щие значения глобальных и локальных переменных, значения выраже- ний. Чтобы просмотреть значение переменной, достаточно подвести кур-
4.3. Отладка М-функций 97 сор к ее имени в тексте функции, после чего на экране появится всплы- вающий желтый прямоугольник со значением переменной внутри него. Содержимое любой переменной также может быть выведено в команд- ном окне обычным указанием ее имени и нажатием клавиши <Enter>. В режиме отладки приглашение командной строки принимает вид К». Затем можно продолжить работу программы в одном из отладочных ре- жимов. Пункты меню и кнопки панели инструментов позволяют выполнять отладочные действия, представленные в табл. 4.3. Таблица 4.3. Пункты меню отладки редактора-отладчика medit.exe Пункт меню Описание Set/Clear Break- Point F12 Поставить /убрать точку останова Clear All Break- Points Убрать все точки останова Step In Fll Выполнять построчно с заходом в вызывае- мые функции Single Step F10 Выполнять построчно Continue Выполнять до следующей точки останова Quit Debugging Завершить отладку Stop if Er- rors /Warnings... Установить режимы отладки при возникно- вении определенных ситуаций
ТЕМА 5 ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ Все в мире есть объекты. Подобные объекты обладают определен- ным набором свойств и поведением, т. е. объединяются в классы. Класс описывает тип объекта и определяет, какими свойствами будет обладать объект и какие действия к нему могут быть применены. Объект - это эк- земпляр (представитель) некоторого класса. Современное объектно-ориентированное программирование осно- вано на возможности введения новых типов данных и определения опе- раций для них. Наиболее важное понятие языков ООП - это понятия объекта (object). Объект - это логическая единица, которая содержит данные и правила (методы) обработки этих данных. В языке MATLAB в качестве таких правил обработки выступают функции. 5.1. Основные понятия ООП Язык MATLAB обладает рядом важнейших характеристик, прису- щих объектно-ориентированным языкам. Инкапсуляция (Encapsulation of Data and Methods) - скрытие внутренней реализации объектов. Понятие инкапсуляции озна- чает, что в качестве единого целого рассматривается объединение неко- торой группы данных и некоторой группы функций. Свойства объектов хранятся в структурах данных, а поведение объектов реализуется в виде функций объектов. В объекте реализована защита данных: к данным, а также к функциям, расположенным в каталогах private, нет доступа извне. Свойства объектов не видны из Command Line. Непосредст- венный доступ к ним можно получить только внутри методов класса. До- ступ к свойствам объектов происходит только через вызовы соответст- вующих методов класса. Перегрузка функций и операций (Function and Oper- ator Overloading) - использование стандартных операторов и на- званий функций для работы с объектами класса. Когда вызывается суще- ствующая в MATLAB функция с объектом класса в качестве входного
5.1. Основные понятия ООП 99 аргумента, MATLAB сначала проверяет, определена ли такая функция в классе. Если - да, то MATLAB вызывает ее, иначе - обычную функцию MATLAB. Наследование (Single and Multiple Inheritance) позволяет одним объектам (потомкам) приобретать атрибуты и свойства других объектов (родителей). Наследование позволяет строить иерархию объектов, переходя от общего к частному, уточняя и конкретизируя объ- ект. При простом наследовании (один класс-родитель) дочерний объект включает в себя все поля родительского объекта, и при работе с ним можно обращаться к методам родительского класса. К классу-потомку добавляются новые поля, определяются новые методы и, возможно, пе- реопределяются некоторые методы родительского класса. Новые методы дочернего класса не могут применяться к объектам родительского клас- са. Команда » obj = class(sclass_name') создает объект класса MATLAB class name, используя структуру s в качестве шаблона. Такой синтаксис действителен только для функции class name, определенной в М-файле с именем class name.m в каталоге, названном @class_name. Для реализации множественного наследования (несколько классов- родителей) применяется команда » obj = class(sclass_name',parentl,parent2, ) которая из структуры s создает объект класса class name, насле- дующий методы и поля родительских классов parent 1, parent! и т. д. Создаваемый класс унаследует все данные и методы всех родителей. Если у нескольких родителей совпадут имена каких-либо методов, то приоритет при вызове у потомка получат методы классов, идущих пер- выми в списке параметров функции class (). Агрегирование (Aggregation) - создание объектов из не- скольких уже существующих объектов (например, создание объекта «ра- циональная дробь» из двух объектов класса «полином»). Вместе с тем язык программирования MATLAB отличается от дру- гих объектно-ориентированных языков по некоторым важным пунктам. Среди них: • В MATLAB не реализован последний принцип объектно- ориентированного программирования - полиморфизм (polymor- phism), т. е. возможность вызывать методы классов-потомков через
100 Т е м a 5. ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ интерфейсы базовых классов. Конкретнее, в MATLAB нет ничего по- добного механизму виртуальных функций в языке программирования C++. MATLAB не поддерживает виртуального наследования (Vir- tual Inheritance) и виртуальных базовых классов (Virtual Base Classes). • В MATLAB нет эквивалента методу destructor. Для удаления объекта класса из рабочего пространства Workspace используется функция clear. • В MATLAB нет эквивалента понятию «абстрактный класс» (Ab- stract Class). • В MATLAB тип переменной или соответствующий класс не объявля- ется и не описывается, а определяется автоматически при создании объекта. В системе MATLAB все типы данных разработаны как классы ООП. Все основные типы данных MATLAB: числовые массивы (double), разреженные матрицы (sparse), массивы ячеек (cell), структуры (struct) и символьные строки (char) представляют собой встроенные классы, а переменные - объекты этих классов. Принадлежность того или иного объекта системы MATLAB к одному из классов представлена схе- мой на рис. 2.2. Пользователь имеет возможность вводить свои классы, а также пе- реопределять и доопределять методы всех существующих классов. Схе- ма показывает, что классы пользователя User Classes наследуют родительскому классу struct, т. е. все новые типы (классы) данных базируются на структурах. 5.2. Правила создания класса В чем отличие «создать класс» и «создать объект»? Объект - это эк- земпляр класса. Класс - это абстрактная сущность. Рассмотрим последо- вательность создания класса в среде MATLAB на примере класса ро- lynom, подробно описанном в справочной документации по пакету. • Один из первых шагов создания нового класса - выбор структуры данных для использования в классе. Объекты хранят свои данные в структурах. Все поля структуры, хранящей данные класса, являются скрытыми (private), т. е. их поля доступны только для методов дан- ного класса и его потомков. Напрямую в выражениях их использовать нельзя.
5.2. Правила создания класса 101 • Объекты нового класса создаются при помощи специальной функции- конструктора класса. Ее имя должно совпадать с названием класса. В рассматриваемом примере это функция polynom, описанная в файле polynom.m. • Класс содержит функции-методы для работы с его объектами, реали- зованные с помощью М-файлов. Функция-метод - это функция, один из аргументов которой - объект данного класса. Имя М-файла - имя действия, реализованного функцией, описанной в этом файле. Напри- мер, для сложения двух полиномов должна быть реализована функция сложения, т. е. должен существовать файл plus . m. • Функции-методы класса должны размещаться в специальной папке- контейнере - каталоге с именем ...\@className. Имя начинается с символа ’ @ , а в остальном должно совпадать с именем класса. В MATLAB класс - это папка, функции-методы класса - это М-файлы, находящиеся в этом каталоге. • Методы класса можно вызывать откуда угодно. • Для работы с классом текущий каталог Current Directory дол- жен быть открыт на папке, содержащей папку @ с1a s s Name. • Папка QclassName должна входить в каталог, определенный в пути поиска Search Path среды MATLAB. Саму папку-контейнер мето- дов добавлять в путь MATLAB не нужно. Например, если класс po- lynom находится в с:\temp\@polynom, то необходимо ввести командную строку » addpath с: \ temp • В классах существуют скрытые частные (private) функции, разме- щаемые в папке @className\private\. Все файлы, находящиеся в этом подкаталоге, доступны только внутри методов данного класса. Пользователь не может их вызывать из командной строки или из дру- гих каталогов. Private-функции не имеют в качестве входного аргу- мента объект класса. Private-функции обычно используются как вспо- могательные функции для реализации задач класса и не оперируют непосредственно с объектом класса. • После каждого переопределения класса (изменение названия или чис- ла полей класса, редактирование функций) необходимо ввести изме- нения в сеанс MATLAB, для чего подается команда » clear classes. Эта команда удаляет из памяти MATLAB «старое» опреде- ление класса, а также очищает рабочее пространство Workspace.
102 Т е м a 5. ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ 5.3. Методы класса Для нового класса следует определить методы обработки объектов, написав соответствующие функции. Какие методы должны быть реали- зованы в классе? Помимо функций, реализующих основное назначение создаваемого класса, в его определение необходимо включить также ряд стандартных методов, которые позволят данному классу вести себя в среде MATLAB аналогично встроенным типам данных. В табл. 5.1 пере- числены основные методы, включенные в классы MATLAB. Таблица 5.1. Базовые методы классов MATLAB Метод класса Описание class constructor Создание объекта класса display Вывод содержимого объекта, если выражение с пе- ременной этого класса не завершается разделителем точкой с запятой set и get Доступ к свойствам объекта. Функция get предна- значена для получения значений свойств, а функция set - для установки новых значений subsref Индексная ссылка, т. е. использование индексов или указателей полей к объекту, размещенному в правой части оператора присваивания (переопределение ме- тодов для a(i), a{i}, a. field) subsasgn Индексное присваивание, т. е. использование индек- сов или указателей полей к объекту, размещенному в левой части оператора присваивания (переопределе- ние методов для a(i)=b, a{i}=b, a.field=b) subindex Индексный дескриптор, т. е. использование объекта класса в качестве целочисленного индекса другого объекта (переопределение методов для х (а)) end Последний индекс по указанной размерности конверторы double, char Преобразование объекта одного класса к другому классу
5.3. Методы класса 103 5.3.1. Конструктор класса Язык программирования MATLAB не имеет деклараций новых классов и типов. Объекты класса создаются в момент вызова функции- конструктора этого класса. Таким образом, функция-конструктор - это первая функция, которая должна быть определена при создании нового класса и размещена в папке-контейнере класса. Имя функции- конструктора совпадает с названием класса и размещается в М-файле с аналогичным именем. Рассмотрим пример конструктора, создающего объекты класса polynom. Этот конструктор должен находиться в М-файле @ро1упот/ро1упот.т. Данный конструктор создает полином из за- данного вектора коэффициентов полинома при убывающих степенях пе- ременной х. function р = polynom(а) %POLYNOM Polynomial class constructor. % p = POLYNOM(v) if nargin == 0 p. c = [ ] ; p = class(p, ’polynom’); elseif isa(a,’polynom’) P = a; else p. c = a (:) . ’ ; p = class(p,’polynom’); end При вызове конструктора динамически создается объект, который может быть инициализирован некоторыми начальными значениями. В зависимости от способа вызова конструктора существует три типовые ситуации: • Конструктор по умолчанию. Конструктор вызывается без аргументов, например: р = polynom (). В этом случае создается шаблон объек- та, обычно с пустыми полями. В отдельных случаях поля инициализи- руются некоторыми начальными значениями. • Конструктор копирования. На вход конструктора подается объект того же класса, что и создаваемый объект, например: а = polynom (р) . В этом случае конструктор обычно возвращает копию объекта. При этом в конструкторе необходимо использовать функцию
104 Т е м a 5. ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ isa(p, ' polynom'), чтобы определить, является ли входной аргу- мент объектом данного класса. • Конструктор с параметрами. Конструктору передаются входные аргу- менты, например: а = polynom([3 0 -2 5]). Конструктор соз- дает структуру и инициализирует ее поля, используя входные данные. Затем из этой структуры конструируется сам объект при помощи встроенной функции class (). У этой функции есть два обязательных параметра. Первый - структура, которая будет представлять данные объекта, а второй - текстовая строка, содержащая имя создаваемого класса. Подобная последовательность действий обычна для конструктора объектов любого класса. Структура, хранящая данные объекта, может быть сколь угодно сложной. 5.4. Перегрузка функций и операторов В MATLAB предусмотрена возможность изменения поведения опе- раторов и функций системы MATLAB, когда в качестве операнда или ар- гумента выступает объект класса. Это достигается путем переопределе- ния (перегрузки) соответствующих функций. Переопределение функций класса дает возможность обработки с помощью этих функций различных типов данных единообразно. 5.4.1. Преобразование объектов к другому классу Часто бывает необходимо преобразовать объект одного класса к другому классу. Такая возможность обеспечивается созданием для ис- ходного класса специальной функции-конвертора. Имя этой функции и имя ее М-файла должно совпадать с именем класса, к которому она бу- дет преобразовывать исходный объект. Например, для преобразования объекта класса polynom обратно в вектор его коэффициентов исполь- зуется метод double (): function с = double(р) % @polynom/double.m. с = р. с ; Теперь можно преобразовывать векторы в полиномы и обратно: » р = polynom([1 2 -4 5]); double(р)
5.4. Перегрузка функций и операторов 105 ans =12-45 Для преобразования объекта к текстовому виду, применяемому при отображении объекта, используется метод char (). В примере класса polynom этот метод определяется в М-файле @polynom/char .m и используется следующим образом: » р = polynom([1 2 -4 5]); char(р) ans = хА3 +2*хА2 - 4*х + 5 Преобразование к текстовому виду используется в методе dis- play (), который относится к базовым методам классов MATLAB. Этот метод вызывается всякий раз, когда в среде MATLAB введено выраже- ние, не завершенное точкой с запятой. function display(р) % @polynom/display.m di sp(' ') ; disp([inputname(1),' = ']) di sp(' ') ; disp([' ' char(p)]) di sp(' ') ; 5.4.2. Переопределение математических операторов Одним из важнейших способов управления поведением объекта служит переопределение для него основных математических операторов. Для этого необходимо в папке-контейнере, содержащей методы класса, создать М-файл с именем, соответствующим имени переопределяемого оператора, и в этом файле определить функцию с этим же именем. На- пример: function г = plus(p,q) % @POLYNOM/PLUS.М р = polynom(р); q = polynom(q); k = length(q.c) - length(p.c); r = polynom([zeros(1,k) p.c] + [zeros(l,-k) q.c]); Такая функция, определенная в файле @polynom/plus .m, позво- лит складывать полиномы, как обычные объекты MATLAB - числа, век-
106 Т е м a 5. ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ торы или матрицы. При этом преобразование формальных аргументов к типу полинома в первых строках этой функции, а также вызовы функции zeros в методе сложения полиномов обеспечивают правильность вы- числения выражений с полиномами разной степени и смешанных выра- жений: » р = polynom([1 2 -1 3]); q = polynom([4 -5]); pl = p + 1; s = p + q; Если MATLAB встречает вызов функции, содержащей объект клас- са в качестве аргумента, то поиск такой функции всегда начинается с просмотра папки-контейнера, содержащей методы данного класса. Такой подход означает, что при создании нового класса всегда есть возмож- ность переопределения любой функции для данного класса. В табл. 5.2 приводится список имен методов большинства операто- ров MATLAB. Таблица 5.2. Операторы MATLAB Оператор Выражение М-функция Описание + +а uplus(a) Унарный плюс — -а uminus(a) Унарный минус + а+Ь plus(a,b) Бинарное сложение — а-Ь minus(a,b) Бинарное вычитание * а*Ь mtimes(a,b) Матричное умножение . * а. *Ь times(a,b) Поэлементное умноже- ние \ а\Ь mldivide(a,b) Решение систем линей- ных уравнений АХ = В => X = А-1В . \ а. \Ь ldivide(a,b) Левое поэлементное де- ление / а/Ь mrdivide(a,b) Решение систем ЛУ ХА = В => X = В А-1 . / а. /Ь rdivide(a,b) Правое поэлементное деление
5.4. Перегрузка функций и операторов 107 Оператор Выражение М-функция Описание А аАр mpower(a,p) Матричное возведение в степень А а. АЬ power(a,b) Поэлементное возведе- ние в степень ! а' ctranspose(a) Комплексно-сопряжен- ное транспонирование а. ' transpose(a) Транспонирование > а>Ь gt( a, b) Больше >= а>=Ь ge( a, b) Больше или равно < а<Ь lt( a, b) Меньше <= а<=Ь le( a, b) Меньше или равно == а==Ь eq( a, b) Тождественно ~= а~=Ь ne( a, b) Не равно & а&Ь and( a, b) Логическое И 1 а | Ь or( a, b) Логическое ИЛИ ~а not(a) Логическое НЕ • • а: d:b colon(a,d,b) Формирование вектора • а :Ь colon(a,b) Формирование вектора display(a) Вывод на дисплей [] [а Ь] horzcat(a,b,...) Г оризонтальная конка- тенация [;] [а;Ь] vertcat(a,b,...) Вертикальная конкате- нация a (si,, sn) subsref(a,s) Индексная ссылка a (si,..., sn) =b subsasgn(a,s,b) Индексное присваива- ние b(a) subindex(a,b) Индексный дескриптор По умолчанию объекты всех классов имеют одинаковый приоритет, поэтому, как правило, при выполнении бинарных операций вызывается бинарный метод левого операнда выражения. Однако существует воз- можность изменения иерархии приоритетов для разных классов так, что в выражениях а+Ь и b+а всегда будет вызываться метод операнда Ь.
108 Т е м a 5. ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ Для повышения приоритета создаваемого класса по сравнению с другим классом необходимо в конструкторе вызвать функцию supe- riorto() и в качестве ее аргумента указать текстовую строку - имя класса, приоритет которого в выражениях должен быть всегда ниже при- оритета создаваемого класса. Аналогично понижение приоритета созда- ваемого класса по сравнению с некоторым другим классом выполняется при помощи функции inferiorto (), вызываемой в конструкторе. 5.4.3. Переопределение индексных операций Использование индексов или указателей полей к объекту, разме- щенному в правой части оператора присваивания, называется индекс- ной ссылкой (subscripted reference). Примерами индексных ссылок являются выражения вида A(i), A{i}, A.field. Функция В = subsref(A,S) вызывается при обработке выражений такого ви- да, где А - объект, aS- массив записей со следующими полями: • type - строка, содержащая группы символов, которые определяют тип индексов: () - числовой массив, {} - массив ячеек, . - массив записей; • subs - массив ячеек или строка, содержащая реально используемые символы, при этом разделитель : передается как строка. Например: » А (1:2,:) вызывает метод subs ref (А, 3),где S - массив за- писей размера 1 х 1 с полями S.type='()' и S.subs » А{1:2} вызывает метод subsref (А, 3),где S - массив запи- сей размера 1 х 1 с полями S.type = '{}' и S.subs = {1:2}. » A.field вызывает метод subsref (А, 3),где S - массив за- писей размера 1 х 1 с полями S.type = 'А и S.subs = 'field'. » А(1,2) .name (3 : 4) вызывает метод subsref (А, 3),где 3 - массив записей размера 3x1 с полями 3(1) .type = '()', 3(2).type = ' . ', S (3) .type = '() ’ и 3 (1) .subs = {1,2}, 3(2).subs = 'name', 3(3).subs = '{3:4}'. Одно из возможных переопределений данного метода для класса polynom состоит в следующем: для объекта р данного класса выра- жение р ( [ 3 4 ] ) возвращает значения полинома при х = 3 и х = 4. » р = polynom([l 0 -2 -5]);
5.5. Идентификация объекта 109 » Р([3 4]) ans = 16 51 Аналогично в случае операции индексного присваивания (subscripted assignment) вида A(i) = В, A{i} = В или A.field=B генерируется вызов функции А = subsasgn (A, S ,В), где S - та же структура, что и в предыдущем случае. Переопределяемый метод индексирования subs index () вызыва- ется при использовании объекта А класса в качестве целочисленного массива индексов другого объекта В. Метод вызывается в выражении В (А) независимо для каждого указанного индекса. Этот метод обязан возвращать целочисленный массив реальных индексов, так как именно они и будут использоваться для извлечения значений из массива В. Ме- тод вызывается встроенными методами subsref (), subasgn () и может быть использован при переопределении этих методов для созда- ваемого класса. 5.5. Идентификация объекта В MATLAB существует ряд функций (табл. 5.3), позволяющих ра- ботать с классами, а также проверять принадлежность объекта какому- либо классу. Таблица 5.3. Функции для работы с классами Функция Описание class(р) Определение класса объекта isa(p,'polynom') Проверка принадлежности объекта данно- му классу isobject(р) Выявление принадлежности объекта како- му-либо классу MATLAB methods('polynom') Вывод списка методов для данного класса whos p Вывод подробной информации об объекте
ТЕМА 6 ВЫСОКОУРОВНЕВАЯ ГРАФИКА Мощная графическая поддержка является одной из пяти состав- ляющих системы MATLAB. При проведении исследований и вычисле- ний важным этапом является анализ получаемой информации, которая часто представляется в виде больших массивов данных. Составной ча- стью такого анализа является наглядное представление данных, т. е. ви- зуализация данных, выполняемая при помощи набора графических ко- манд. В MATLAB существует два уровня работы с графикой: • Высокоуровневая графика (High-Level Graphics) вклю- чает команды и функции, предназначенные для построения графиков в прямоугольных и полярных системах координат, трехмерных поверх- ностей и линий уровня, гистограмм, разного вида диаграмм, анимации и т. д. Врафические команды высокого уровня автоматически контро- лируют масштаб, выбор цветов, маркировку осей, не требуя манипу- ляций со свойствами графических объектов. Имеется также возмож- ность интерактивного оформления рисунков. • Дескрипторная графика (Handle Graphics) основана на низкоуровневых графических функциях. Каждому графическому объ- екту в составе рисунка ставится в соответствие некоторый описатель (дескриптор), через который можно получить доступ ко всем характе- ристикам графического объекта и управлять его свойствами. Приме- нение дескрипторной графики требует знания основ объектно- ориентированного программирования. Все графические изображения строятся в специальном графическом окне Figure. Первый вызов в сеансе графической команды приводит к появлению окна Figure с номером 1. Для создания нового окна следует выбрать пункт меню File | New ► New Figure или вызвать коман- ду figure. Появится окно со следующим порядковым номером. Вызов команды figure (N) делает текущим существующее окно с номером N или создает новое окно с указанным номером. Одновременно может быть открыто несколько графических окон. Переключение между окна-
6.1. Двумерная графика 111 ми может быть выполнено обычными способами перемещения от при- ложения к приложению: при помощи панели задач или нажатием Alt+Tab. Графические возможности системы MATLAB разнообразны. В пер- вую очередь это наиболее простые в использовании функции, которые называют командами высокоуровневой графики. Само название отража- ет тот факт, что пользователю нет необходимости самому реализовывать все детали работы с графикой. Команды высокоуровневой графики реа- лизуют построение графиков разного вида в двумерном и трехмерном пространствах. Функции реализованы на основе векторной графики, при которой изображаемые объекты задаются координатами. Оформление графиков, т. е. выбор цвета, типа линий и поверхностей, масштаба, нане- сение подписей, вывод и маркировка осей координат, происходит при помощи простых в применении команд. Во многих случаях режимы, на- значенные по умолчанию, удовлетворяют требованиям пользователей. 6.1. Двумерная графика Система MATLAB предоставляет широкие возможности для визуа- лизации функций одной переменной. Она позволяет строить графики в линейном, логарифмическом и полулогарифмическом масштабе, исполь- зовать декартову или полярную системы координат. 6.1.1. Функция plot Построение графиков функции одной переменной в линейном мас- штабе в декартовой системе координат осуществляется при помощи функции plot. Функция plot относится к функциям высокого уров- ня. При ее выполнении MATLAB выполняет целый комплекс операций: система сама создает графическое окно с новым номером, строит оси ко- ординат, вычисляет диапазоны изменения переменных хну, простав- ляет на осях метки и соответствующие им числовые значения и, наконец, строит через опорные точки график функции некоторыми выбранными по умолчанию цветом и стилем линии. Следующие команды » х = -2.5*pi : 0.01 : 2.5*pi; у = sin(x); plot(x, y)
112 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА вычисляют массив у значений функции sin для заданного набора ар- гументов и с помощью команды plot строят график функции, как по- казано на рис. 6.1. Рис. 6.1. График функции Если, не убирая с экрана дисплея первое графическое окно, ввести еще одну команду » plot(x, 0.5*cos(x)) то в том же самом графическом окне появляется график новой функции, при этом старые оси координат и график в нем пропадают. Для построения нескольких графиков в одних координатных осях следует перед исполнением второй графической команды plot выпол- нить команду, которая предназначена для управления режимом сохране- ния текущего графического окна » hold on В результате будет получено изображение, представленное на рис. 6.2. Того же самого можно добиться, вызвав функцию plot со следующи- ми параметрами: » х = -2.5*pi : 0.01 : 2.5*pi; у = sin(x); z = 0.5*cos(x); plot(x, y, x, z);
6.1. Двумерная графика 113 Преимущество второго из указанных способов состоит в том, что в этом случае графики автоматически строятся разным цветом. Рис. 6.2. Г рафики двух функций Функции необязательно должны быть определены на одном и том же отрезке. В этом случае при построении графиков MATLAB выбирает максимальный отрезок, содержащий все остальные. Важно только в каж- дой паре векторов значений аргумента и значений функции указать соот- ветствующие друг другу диапазоны. » xl = -2*pi : 0.01 : 2*pi; х2 = -pi : 0.01 : pi; у = sin(xl); z = cos(x2); plot(xl, y, x2, z); К недостаткам построения нескольких графиков в пределах одних и тех же осей координат относится использование максимального диапа- зона изменения координат, что при несопоставимых значениях двух функций приводит к плохому изображению одного из графиков. Если необходимо одновременно просматривать несколько графиков, то это можно сделать двумя способами. Во-первых, можно построить их в раз- ных графических окнах. » х = -pi : 0.01 : pi; Y = sin (x) ; z = cos (x) ; u = exp (x) ; plot(x, y, x, z) ; plot(x,u);
114 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА В результате графики функций sin и cos выводятся в одном графическом окне, а график функции ехр строится в другом графиче- ском окне, как показано на рис. 6.3. Это происходит потому, что команда figure создает новое графическое окно, и все следующие за ней ко- манды построения графиков выводят их в новое окно. Рис. 6.3. Вывод графиков в разные графические окна Вторым возможным решением рассматриваемой задачи одновре- менного просмотра нескольких графиков является использование функ- ции subplot. Эта функция позволяет создать в графическом окне не- сколько систем координат, в каждую из которых можно вывести графики различных функций. Функция subplot принимает три числовых аргумента, первый из которых равен числу рядов систем координат, второе число равно числу колонок, а третье число - номеру системы координат (номер отсчитыва- ется вдоль рядов с переходом на новый ряд). Например, графическое окно, представленное на рис. 6.4, выводится в результате выполнения команд » subplot(1,2,1) ; plot(x, у, х, z) subplot(1,2,2); plot(x, u)
6.1. Двумерная графика 115 Диапазоны изменения переменных на осях координат в этом случае не- зависимы друг от друга. Рис. 6.4. Вывод графиков в разные оси координат Еще одним способом вывода графиков является их построение в по- лярных координатах. Следующий код строит график функции sin(2*t) .*cos(2*t) в полярных координатах (рис. 6.5). » t = 0:. 01:2*pi; polar(t,sin(2*t).*cos(2*t)) Puc. 6.5. Г рафик функции в полярных координатах
116 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА Если для графика диапазоны изменения переменных вдоль одной или обеих осей координат слишком велики, то можно воспользоваться функциями построения графиков в полулогарифмическом или логариф- мическом масштабах. Для этого предназначены функции semilogx (ло- гарифмический масштаб по оси х), semi logy (логарифмический мас- штаб по оси у) и loglog (логарифмический масштаб по обеим осям). Рассмотренные примеры показывают, что функции высокоуровне- вой графики MATLAB выполняют различные способы построения гра- фиков без особых усилий со стороны пользователя. 6.2. Оформление графиков функций Построенные графики функций должны быть максимально удобны- ми для восприятия, что достигается при помощи правильного оформле- ния графиков. Рассмотрим ряд вопросов, связанных с оформлением внешнего вида графиков функций - цветом, толщиной и типом линий, которыми проведены сами графики, маркерами в дискретных вычисляе- мых точках, а также различными надписями в пределах графического окна. 6.2.1. Изменение свойств линии Система MATLAB позволяет управлять видом линии графика, по- строенного при помощи функций plot, semilogx, semilogy и loglog. Для этого предназначен дополнительный аргумент, помещае- мый за каждой парой векторов координат. Этот аргумент заключается в апострофы и состоит из трех символов, которые определяют цвет, тип маркера и тип линии. Следующие команды позволяют придать графику вид красной сплошной линии, на которой в дискретных вычисляемых точках про- ставляются черные квадраты. » х = 0:0.1:3; plot( х, х, 'г’, х, х, ’ks' ) Здесь функция plot дважды строит график одной и той же функ- ции, но в двух разных стилях. Первый из этих стилей ' г- ' определяет проведение сплошной линии красным цветом. Второй стиль ' ks ’ за- дает проведение черным цветом квадратов на месте вычисляемых точек. Результат выполнения команд представлен на рис. 6.6.
6.2. Оформление графиков функций 117 Возможные значения типов и цветов линий, типов маркеров пред- ставлены в табл. 6.1. Таблица 6.1. Свойства линии Тип линии Цвет линии Тип маркера — непрерывная с голубой • точка — штриховая m фиолетовый + плюс • пунктирная У желтый * звездочка — . штрихпунктирная красный о кружок g зеленый X крестик ь синий S квадрат W белый d ромб к черный V треугольник верши- ной вниз А треугольник верши- ной вверх < треугольник верши- ной влево > треугольник верши- ной вправо р пятиконечная звезда h шестиконечная звезда Можно указывать один, два или три символа в зависимости от тре- буемых изменений. В этом случае для остальных символов используются значения, установленные по умолчанию. Порядок, в котором указывают- ся символы, не является существенным, т. е. ’ r+h' и ' +hr' приво- дят к одинаковому результату. В общем случае функция » plot(xl, yl, si, х2, у2, s2, ... ) позволяет нарисовать в одной системе координат несколько графиков функций, каждый со своим стилем si, s 2, ...
118 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА Рис. 6.6. Изменение свойств графика 6.2.2. Толщина линии Изменение толщины линии выполняется при помощи команд низ- коуровневой графики системы MATLAB, основанной на управлении свойствами графических объектов при помощи дескрипторов. Следую- щий код демонстрирует прорисовку графика с измененной толщиной линии. » х = 0:0.1:6; hPlot = plot(x, sin(x)); set( hPlot, ’LineWidth’, 6 ); Функция plot через опорные (вычисленные) точки строит график указанной функции, создавая при этом графический объект типа Line, и возвращает его дескриптор (handle). Этот дескриптор передается в ка- честве входного параметра функции set. Функция set изменяет свой- ства, которые указаны в качестве остальных аргументов. В результате замена свойства ’ LineWidth' (толщина линии) на новое значение вме- сто используемого по умолчанию 0.5 приводит к автоматической пере- рисовке графика с измененной толщиной линии. Кроме использования дескриптора изменить свойства линии графи- ка функции можно при помощи следующих действий. Необходимо щелчком мыши выделить линию на графике и выбрать в меню графиче- ского окна пункт Edit | Current Object Properties. Откры- вается диалоговое окно Property Editor, изображенное на рис. 6.7.
6.2. Оформление графиков функций 119 Данное диалоговое окно позволяет изменить стиль, толщину и цвет линии, размер, тип, цвет контура и цвет заливки маркера вычисляемых точек графика при помощи имеющихся полей редактирования. Кроме этого, нажав в диалоговом окне на кнопку Inspector..., можно вы- звать инспектор свойств Property Inspector для данного графи- ческого объекта и внести необходимые изменения в его свойства. Рис. 6.7. Диалоговое окно Property Editor 6.2.3. Надписи на графиках Хорошее восприятие графиков во многом обеспечивается дополни- тельными элементами оформления: наличием координатной сетки, под- писями к осям системы координат, заголовком и легендой. Для этого ис- пользуют команды, представленные в табл. 6.2. Применение приведен- ных в таблице команд придает графическому изображению законченный вид.
120 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА Таблица 6.2. Функции оформления графика Функция Описание title('string') Вывод заголовка xlabel('string') Маркировка оси х ylabel('string') Маркировка оси у zlabel('string') Маркировка оси z text(x,y,'string') Вывод текста в заданную координатами (х, у) позицию графика gtext('string' ) Вывод текста в интерактивно определяемое место на графике (указать место мышкой и щелкнуть) legend Идентификация графиков (легенда) grid on/off Координатная сетка box on/off Рамка hold on/off Вывод в одно графическое окно axis Масштабирование zoom Управление масштабом графика colorbar Вывод в графическом окне шкалы палитры Следующий код строит график функции, выводит оси координат, координатную сетку, заголовок графика, подписывает оси координат, а также подписывает график в указанном при помощи курсора мыши мес- те в системе координат. » х = 0:0.01:6; plot( х, sin(x),'k'); grid on title('у = sin(x)' ); xlabel('x coordinate'); ylabel('sin(x) ' ); gtext('\leftarrowsin(x) ' ); Надпись функцией gtext помещается, начиная от точки с коор- динатами, указанными мышкой (рис. 6.8). Специальные символы вводят- ся внутри текста после символа \ («обратная косая черта»). Обозначе- ния для специальных символов совпадают с обозначениями в системе подготовки научных текстов ТеХ.
6.2. Оформление графиков функций 121 Рис. 6.8. Оформление графика 6.2.4. Оформление осей системы координат При построении графика выбор масштаба и построение осей выпол- няются автоматически. MATLAB выбирает пределы по горизонтальной оси равными указанным для независимой переменной. Для зависимой переменной по вертикальной оси MATLAB использует диапазон изме- нения значений функции в рассматриваемом интервале значений незави- симой переменной. При этом график функции оказывается вписанным в прямоугольник. В системе MATLAB имеется возможность явного указания пределов изменения переменных по осям координат. Это делается при помощи функции » axis ( [ xmin, xmax, ymin, углах ] ) Числа xmin и xmax задают интервал изменения горизонтальной ко- ординаты (ее минимальное и максимальное значения), a ymin и ушах - интервал изменения вертикальной координаты. Данную команду можно вводить в командную строку многократно уже после построения графика функции. Такое изменение пределов приводит к эффекту масштабирова- ния и позволяет получить подробные изображения тех частей графика, которые вызывают наибольший интерес в конкретном случае. Если нуж- но сохранить автоматическое масштабирование по какой-нибудь коор- динате, то для этого направления в качестве значения следует поставить идентификатор Inf или -Inf.
122 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА » axis([-5, 5, -Inf, Inf]) Различные способы применения команды axis приведены в табл. 6.3. Таблица 6.3. Команда axi s Команда Описание axis(v4) Изменение масштаба 2Э-графика вектором из 4 зна- чений axis(v6) Изменение масштаба ЗЭ-графика вектором из 6 зна- чений axi s(axi s) Использование текущего масштаба для следующих графиков (фиксация текущего масштаба) axis(auto) Восстановление режима автомасштабирования v=axis Получение вектора с текущими значениями масшта- ба axi s('i j') Матричная система координат - начало отсчета в ле- вом верхнем углу axis('xy') Декартова система координат - начало отсчета в ле- вом нижнем углу axis on/off Восстановление/отключение изображения осей и на- сечек axis style Изменение стиля масштабирования: square Область вывода - квадрат normal Масштабирование по умолчанию equal Одинаковый масштаб по осям tight Изображаемые данные занимают всю область вывода auto Автомасштабирование manual Масштабирование вручную Изменить отметки на осях координат можно с помощью функции set, обрабатывающей графический объект Axes. Это объект, который отвечает за систему координат и содержит оси координат и белый пря- моугольник, внутри которого и строится график функции. Для получе- ния дескриптора текущего объекта Axes (т. е. объекта, в который в дан-
6.3. Трехмерная графика 123 ный момент направлен вывод) применяют функцию дса, которую вызы- вают без параметров. Следующий фрагмент кода, выполняющийся после построения гра- фика, устанавливает новые метки на горизонтальной оси координат. » hAxes = дса; set( hAxes, 'xtick', [xmin : step : xmax] ) Внести изменения в систему координат графика можно также при помощи следующих действий. Необходимо щелчком мыши выделить в графическом окне требуемую систему координат и выбрать в меню гра- фического окна пункт Edit | Axes Properties. Открывающееся при этом диалоговое окно Property Editor - Axes позволяет вы- полнить все указанные выше настройки для текущего объекта Axes. Аналогично пункт меню Edit | Figure Properties откры- вает диалоговое окно Property Editor - Figure, которое позво- ляет изменить настройки текущего графического окна Figure. 6.3. Трехмерная графика Изображение графиков функций двух переменных (трехмерных ли- ний и поверхностей) требует реализации трехмерной графики на плос- ком экране дисплея компьютера. Высокоуровневые графические функ- ции системы MATLAB автоматически реализуют трехмерную графику. Многие приемы оформления трехмерных графиков совпадают с те- ми, что используются при построении плоских графиков функций одной переменной. Для масштабирования применяется функция axis, которая в трехмерном случае принимает три пары скалярных аргументов » axis( [ xmin, xmax, ymin, углах, zmin, zmax ]) Функции text, xlabel, ylabel, zlabel, title, дополняют графики текстовой информацией. Применение функции subplot по- зволяет разместить в одном графическом окне несколько трехмерных графиков. 6.3.1. Функции для отображения поверхностей Чаще всего при построении поверхностей точки аргументов распо- ложены в области определения функции регулярно в виде прямоуголь- ной сетки. Поэтому для отображения функции двух переменных, как правило, следует выполнить следующие действия:
124 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА • Сгенерировать матрицы с координатами узлов сетки на прямоуголь- ной области определения функции. Для генерации сетки обычно при- меняется функция meshgrid. Ее аргументами являются два вектора, элементы которых соответствуют координатам узлов сетки соответст- венно вдоль оси х и у. Если область построения функции - квадрат, то используется один вектор. Функция meshgrid возвращает две матрицы одной и той же структуры: первая матрица содержит значе- ния первых координат этих точек (координат х), а вторая матрица со- держит значения вторых координат (координат у). • Вычислить значение функции z=f(x,y) в узлах сетки. • Использовать одну из графических функций для отображения трех- мерного объекта. • Нанести на график дополнительную информацию. Рис. 6.9. Построение ЗО-поверхности Поверхность, изображенная на рис. 6.9, представляет собой каркас- ную ЗИ-поверхность, залитую цветом. Данное построение выполняется при помощи группы команд » [X,Y] = meshgrid(-2:.2:2, -2:.2:2); Z = X .* ехр(-Х.А2 - Y.A2); surf(X,Y,Z)
6.3. Трехмерная графика 125 Высокоуровневые функции системы MATLAB, используемые при построении поверхностей и позволяющие добиваться большей реали- стичности в изображении трехмерных графиков, описаны в табл. 6.4. Таблица 6.4. Функции для построения трехмерных поверхностей Функция Описание meshgrid Формирование массивов координат узлов сетки mesh Построение каркасной поверхности me she Построение каркасной поверхности вместе с проек- циями линий постоянного уровня на плоскости ху meshz Построение каркасной поверхности вместе с плоско- стью отсчета на нулевом уровне surf Построение залитой цветом каркасной модели surfc Построение залитой цветом каркасной модели вместе с линиями уровня на плоскости ху surfl Построение освещенной поверхности contour Построение линий уровня функции двух переменных contour3 Построение трехмерных линий уровня contourc Формирование массива описания линий уровня contourf Построение линий уровня и закрашивание областей между ними некоторым постоянным цветом clabel Маркировка линий уровня sphere Отображение сферы и генерация точек, лежащих на поверхности сферы cylinder Отображение цилиндра и генерация точек, лежащих на поверхности цилиндра fill3 Рисование закрашенного цветом многоугольника в ЗО-пространстве plot3 Построение линий в трехмерном пространстве hidden on/off Режим удаления невидимых линий shading Способ затенения объектов Surface и Patch brighten Управление яркостью палитры colormap Установка цветовой палитры colorbar Вывод в графическом окне цветовой палитры
126 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА 6.3.2. Функция plot3 Простейшей функцией построения графика функции двух перемен- ных в системе MATLAB является функция » plot3(X, Y, Z) где X, Y и Z - матрицы одинаковых размеров, смысл которых описан выше. Применение функции plot3 позволяет построить график по- верхности, представленной на рис. 6.10. » [ X , Y ] = meshgrid(-2:0.1:2, -1:0.1:1); Z = ехр(-Х.А2 -Y.A2); plot3(X, Y, Z) Рис. 6.10. Применение функции plot3 Из рисунка видно, что функция plot3 строит график в виде набо- ра линий в пространстве, каждая из которых является сечением трехмер- ной поверхности плоскостями, параллельными плоскости у О z. Для построения трехмерных линий, задаваемых параметрически, применяется другая форма вызова функции plot3, где входные пара- метры являются одномерными массивами координат точек, которые нужно последовательно соединить отрезками прямых. Следующий фрагмент кода позволяет построить винтовую линию, как показано на рис. 6.11. » t = 0 : pi/50 : 10*pi ;
6.3. Трехмерная графика 127 х = sin(t); у = cos(t); plot3(х, у, t) ; grid on Рис. 6.11. Трехмерная линия, заданная параметрически 6.3.3. Положение камеры и вращение графиков Для трехмерных графиков существует возможность изменять точку обзора, т. е. положение камеры. Положение камеры определяется углом азимута и углом возвышения. Изменение первого угла означает враще- ние плоскости хОу вокруг оси Oz против часовой стрелки. Угол воз- вышения есть угол между направлением на камеру и плоскостью хОу. Когда выполняются функции mesh или surf, то по умолчанию уста- навливаются значения az = -37.5°, el = 30°. Эти значения в лю- бой момент времени можно изменить функцией » view([az, el]) Угол зрения можно задать также посредством декартовых координат: » view([х, у , z]) Имеется возможность выбрать положение камеры интерактивно средствами графического окна. Для этого нужно установить режим вра- щения изображения при помощи пункта меню Tools | Rotate 3D или соответствующего значка, а затем, перемещая мышь при нажатой
128 Т е м a 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА левой кнопке мыши, задать расположение осей. При этом в левом ниж- нем углу окна будут отображаться текущие значения углов az и el. Активизация пункта меню View | Camera Toolbar обеспечи- вает появление в графическом окне дополнительной панели инструмен- тов с кнопками, позволяющими изменять положение камеры, тип и по- ложение источника освещения, тип проекции (ортографическая или пер- спективная). Такие же действия могут быть выполнены при помощи пунктов контекстного всплывающего меню, появляющегося при щелчке в графическом окне правой кнопки мыши. Комбинирование различных функций системы MATLAB и исполь- зование различных вариантов закраски, освещения и точки обзора помо- гает добиться оптимального вида трехмерных объектов. 6.4. Сохранение графических изображений Экспорт графики из MATLAB возможен в различные графические форматы, в частности: EPS, Al, BMP, GIF, TIFF, JPEG. При экспорте в графический файл записывается только область графического окна без меню и панели инструментов (клиентская часть). Самым простым способом сохранения графического изображения является использование команды меню Edit | Copy Figure, в ре- зультате чего изображение будет сохранено в буфере обмена Clip- board операционной системы Windows. После этого можно вставить это изображение в документ редактора Word или графического редак- тора Paint командой меню Paste последнего. Пункт меню File | Save as... графического окна позволяет сохранить клиентскую часть окна в файле в одном из выбранных форма- тов. Вместо использования команды меню графического окна можно из командного окна системы MATLAB выполнить команду, которая сохра- нит изображение в буфере обмена в формате Bitmap. » print -dbitmap Команда » print -dformat filename сохранит полученное в MATLAB изображение в файле указанного гра- фического формата.
ТЕМА 7 ОСНОВЫ ДЕСКРИПТОРНОЙ ГРАФИКИ Дескрипторная графика (Handle Graphics) - это объект- но-ориентированная графическая система, основанная на низкоуровне- вых графических функциях. Объектами дескрипторной графики являют- ся базовые графические элементы, используемые для визуализации дан- ных. Каждый графический объект пронумерован, ему присваивается уникальный идентификатор - дескриптор (handle), используя который можно управлять свойствами графических объектов при помощи соот- ветствующих функций. Использование этих функций в разрабатываемой программе придает графическим результатам законченный вид, обеспе- чивает их лучшее восприятие. Помимо этого, дескрипторная графика по- зволяет разрабатывать приложения, оснащенные полноценным графиче- ским интерфейсом пользователя с кнопками, пунктами меню, окнами ре- дактирования, полосами прокрутки и другими стандартными графиче- скими компонентами, обычно присутствующими в стандартных интер- фейсах пользователя приложений. 7.1. Описание графических объектов 7.1.1. Иерархия графических объектов Графические объекты - это базовые элементы, используемые для вывода графики, а также элементы пользовательского интерфейса. Так как MATLAB является объектно-ориентированной системой, то все эле- менты, используемые при выводе графики (графическое окно Figure, системы координат Axes, линии, поверхности, текстовая информация и т. д.), являются объектами. Каждый объект обладает целым рядом свойств, изменение которых вызывает требуемые перенастройки в самом объекте. Поэтому при написании приложений, отображающих результа- ты в графическом виде или оснащенных собственным графическим ин- терфейсом пользователя, необходимо знать свойства объектов и уметь изменять их значения в программе.
130 Т е м a 7. ОСНОВЫ ДЕСКРИПТОРНОЙ ГРАФИКИ Создание любого графического объекта в MATLAB сопровождается появлением уникального числового указателя на него - дескриптора. Де- скриптор назначается по умолчанию. Все графические объекты расположены в определенной иерархиче- ской последовательности, представленной на рис. 7.1. Рис. 7.1. Иерархия графических объектов MATLAB Работа всех высокоуровневых графических функций MATLAB ос- нована на использовании графических объектов. Например, вызов функ- ции » h = plot(х,у) создает графическое окно - графический объект Figure, создает сис- тему координат - графический объект Axes, рисует линию при помощи графического объекта Line, дескриптор которого возвращает в качест- ве значения переменной h. Если функция выводит графики нескольких функций, то создается несколько графических объектов класса Line, при этом в переменной h будет содержаться массив дескрипторов. Краткое описание назначения каждого графического объекта пред- ставлено в табл. 7.1.
7.1. Описание графических объектов 131 Таблица 7.1. Графические объекты системы MATLAB Объект Описание Root Вершина иерархии, соответствующая экрану ком- пьютера Figure Окно для вывода графики и пользовательских ин- терфейсов Axes Оси (система координат) для вывода графики в графическом окне Uicontrol Управляющий элемент пользовательского интер- фейса Uimenu Оконное меню пользователя Ui contextmenu Контекстное меню пользователя, появляющееся при щелчке правой кнопки мыши на объекте Image Двумерное растровое изображение Light Источник освещения, воздействующий на графи- ческие объекты типа patch и surf асе Line Линия Patch Замкнутый закрашенный полигон с ребрами Rectangle Двумерная фигура, изменяющаяся от прямоуголь- ника до эллипса Surface Трехмерная поверхность Text Символьная строка 7.1.2. Графический объект Root Графический объект Root соответствует экрану компьютера. Су- ществует единственный объект Root, который не имеет родителей, а все другие графические объекты являются его потомками. Непосредствен- ными потомками объекта Root являются объекты Figures. Дескриптор объекта Root - 0. Этот объект создается в момент за- пуска системы MATLAB и не может быть удален. Но пользователь мо- жет управлять его свойствами с помощью функций set (0), get (0).
132 Т е м a 7. ОСНОВЫ ДЕСКРИПТОРНОЙ ГРАФИКИ 7.1.3. Графический объект Figure Графический объект Figure соответствует отдельному графиче- скому окну на экране, где отображаются графические визуальные дан- ные. В MATLAB нет ограничений на количество создаваемых графиче- ских окон. Графические объекты Figure являются прямыми потомками объекта Root. Все высокоуровневые команды и функции, которые выводят графи- ки (plot, surf, contour), автоматически создают графический объ- ект Figure, если он не существует. Если открыто много графических окон, то одно из них выделяется в качестве текущего графического объ- екта. Дескриптором графического объекта Figure является номер графического окна. Дескриптор графического объекта Figure может быть определен с помощью команды gcf. Пользователь может управ- лять его свойствами с помощью функций set(l), get(l) или set (hf,, get (hf,, где hf - дескриптор текущего окна. • figure - создание нового объекта со свойствами по умолчанию. Пользователь может установить свойства по умолчанию для объекта Figure только на корневом уровне (root level). » set (0, 'DefaultFigureProperty', PropValue..) • figure('PropertyName', Propertyvalue,...) - создание нового объекта с заданными свойствами. • figure (h) - если h является дескриптором существующего объекта, то он становится текущим, видимым, помещается поверх окон экрана и в него осуществляется графический вывод. Если h не является де- скриптором существующего объекта, но является целым числом, то функция создает объект и назначает его handle = h. Если же h не является целым, то выдается сообщение об ошибке. • hf = figure (...) - получение дескриптора объекта. Следующий фрагмент кода создает два графических окна Figure и выводит графики поочередно в одно из окон: » х=0:0.01:2*pi; hl=figure(1); h2=figure(2); figure(1); plot(x, sin(x)); figure(2); plot(x, cos(x), x, sin(x)); figure(hl); plot(x, [cos(x); sin(x); sin(2*x)]);
7.1. Описание графических объектов 133 Следующий фрагмент кода создает объект Figure размером в четверть экрана, расположенный в левом верхнем углу: % 4-element vector: [left, bottom, width, height] sz = get(0,'ScreenSize'); figure('Position’, [1 sz(4)/2 sz(3)/2 sz(4)/2] ) Список функций, управляющих графическим окном Figure, пред- ставлен в табл. 7.2. Таблица 7.2. Создание и управление графическим окном Функция Назначение figure Открыть графическое окно (команда) gcf Получить дескриптор текущего объекта figure elf Очистить графическое окно figure close Закрыть графическое окно figure refresh Обновить графическое окно figure 7.1.4. Графический объект Axes Графический объект Axes задает область размещения графика в ок- не объекта Figure. Текущий объект Axes является целью для функ- ций, рисующих графические объекты image, line, patch, sur- face, text. Все высокоуровневые команды и функции, которые выво- дят графики (plot, surf, contour, mesh, bar), автоматически создают графический объект Axes, если он не существует. Если в од- ном графическом окне создано несколько объектов Axes, то один из них выделяется в качестве текущего графического объекта. Дескриптор графического объекта Axes может быть определен с помощью команды дса. Пользователь может управлять его свойствами с помощью функций set(дса), get(дса). • axes - создание в текущем графическом окне Figure нового объ- екта Axes со свойствами по умолчанию. Пользователь может переус- тановить свойства по умолчанию для объекта Axes только на корне- вом уровне или на уровне фигуры: » set(0,’DefaultAxesPropertyName’,PropValue,..) » set(gcf,'DefaultAxesPropertyName’,PropValue,..)
134 Т е м a 7. ОСНОВЫ ДЕСКРИПТОРНОЙ ГРАФИКИ • axes (’ PropertyName ’ , PropertyValue, . . .) - создание но- вого объекта Axes с заданными свойствами; • axes (h) делает объект текущим, размещает его первым в списке Children объекта Figure; • h = axes (. . .) - получение дескриптора объекта Axes; • gca - получение дескриптора текущего объекта Axes. Следующий фрагмент кода создает два объекта Axes в одном графическом окне: » axes('position1 .1 .8 .6]) mesh(peaks(20)); axes('position1 .7 .8 .2]) pcolor([l:10;l:10] ) ; Список функций, управляющих графическим объектом Axes, представлен в табл. 7.3. Таблица 7.3. Создание и управление осями координат Функция Назначение axes Создание осей координат (команда) cla Очистка осей координат gca Получение дескриптора графического объекта Axes 7.1.5. Графический объект UI Объекты Uicontrol являются управляющими элементами пользо- вательского интерфейса, которые выполняют функции обратного вызова, когда пользователь активизирует объект. Объект Uimenu является выпадающим меню, который выполняет функции обратного вызова, когда пользователь активизирует пункт ме- ню. Система MATLAB размещает Uimenu в Menu Ваг окна Figure справа от существующего меню, определенного системой. Объект Ui contextmenu создает контекстное меню, которое по- является, когда пользователь нажимает правую кнопку мыши над графи- ческим объектом. Более подробное знакомство с данными типами графических объек- тов см. в теме 9, посвященной созданию графического интерфейса поль- зователя.
7.1. Описание графических объектов 135 7.1.6. Графический объект Image Рассмотренные ранее графические команды основаны на примене- нии векторной графики, когда изображаемые объекты задаются коорди- натами. Существует много изображений в растровых форматах, когда каждой точке изображения соответствует пиксель информации. Система MATLAB обеспечивает возможность работы с растровыми объектами, включая подготовку изображений, запись или считывание их из файла. Для работы с растровыми изображениями предназначен графический объект image. Команда image создает графический объект, интерпретируя каж- дый элемент матрицы как индекс цветовой палитры colormap или непо- средственно как RGB-значение в зависимости от способа представления данных. Существует три основных типа задания изображения, которые отличаются по способу интерпретации элементов матрицы данных в ка- честве цветов пикселей (цветовых моделей) - индексный режим (indexed mode), режим, устанавливающий соответственно доли красного, зелено- го и синего цветов (truecolor mode), и режим, устанавливающий цветовой тон, насыщенность и интенсивность (intensity). • image (С) отображает матрицу С как графический образ (изображе- ние). Каждый элемент матрицы определяет цвет прямоугольного сег- мента этого образа. Если С - двумерный массив, то каждый его эле- мент рассматривается как значение индекса для массива, определяю- щего текущую цветовую палитру (indexed image). В случае трехмерно- го массива его элементы определяют соответственно доли красного, зеленого и синего цветов. В этом случае таблица цветов не использу- ется. • image (х,у,С) масштабирует выводимое изображение на диапазон векторов хну, где хну являются векторами. • image(х,у,СPropertyNamePropertyValue, ...) - вы- сокоуровневая функция вывода графического образа с одновременной спецификацией его свойств. • image (’ PropertyName ’ , Propertyvalue, . . .) - низкоуровне- вый синтаксис функции image, только определяющий значения свойств. • handle = image (...) возвращает дескриптор созданного графи- ческого образа.
136 Т е м a 7. ОСНОВЫ ДЕСКРИПТОРНОЙ ГРАФИКИ Для работы с изображениями используются команды, представлен- ные в табл. 7.4. Таблица 7.4. Функции для работы с растровыми изображениями Функция Описание image Вывод графического образа iminfo Информация о графическом образе imread Чтение изображения из графического файла imwrite Запись изображения в графический файл Следующий код выполняет чтение из файла изображения и его цве- товой палитры, вывод графического образа и установку цветовой палит- ры, ему соответствующей. » [Image,ColorMap]= imread( FileName ); hi = image(Image); colormap(ColorMap) 7.1.7. Графический объект Light Графический объект Light определяет источник света, который воздействует на все графические объекты класса patch и surface. Нельзя увидеть источники света, но можно установить свойства, управ- ляющие стилем, цветом, позицией и другими свойствами, общими для всех графических объектов. • light - создание источника света в текущей системе координат. • light (’PropertyName ’ , PropertyValue, . . .) - создание ис- точника света с одновременным определением указанных свойств. • handle = light (...) - получение дескриптора созданного объ- екта Light. Следующий фрагмент кода помещает источник света в бесконеч- ность, ориентирует его вдоль вектора [1 0 0], т. е. вдоль оси Ох. Ис- точник света освещает поверхность. » h = surf (peaks); set(h, ’FaceLighting’,’phong’, ... 'FaceColor’,’interp’, ’Ambientstrength’,0.5); light ('Position[1 0 0],'Style', 'infinite');
7.1. Описание графических объектов 137 Основные свойства объекта Light перечислены в табл. 7.5. Таблица 7.5. Основные свойства графического объекта Light Свойство Описание Color Цвет источника света Style Указывает на бесконечную (значение infinite по умолчанию) или конечную (значение local) удален- ность источника света от объекта Position Три координаты, задающие положение источника света в случае конечной его удаленности или направление на бесконечно удаленный источник света. В последнем слу- чае направление определяется прямой, проходящей через задаваемую точку и начало координат 7.1.8. Графический объект Line Графический объект Line является графическим примитивом для создания двумерных и трехмерных графиков. Высокоуровневые коман- ды plot, plot3, contour создают графические объекты Line. Деск- риптор графического объекта Line может быть получен, например, при помощи функции hl = plot (...) . Пользователь может управлять его свойствами при помощи функций set (hl), get (hl) . • line (X, Y) - создание линии, определенной векторами X и Y в теку- щей системе координат Axe s. • line (X, Y, Z) - создание линии в трехмерных координатах. • line(X,Y,Z,’PropertyName',PropertyValue,...) - созда- ние линии с одновременной установкой указанных свойств и с осталь- ными значениями свойств, определенными по умолчанию. • line(’XData',х,'YData’,у,’ZData',z,'PropName’,Prop Value, . . .) - низкоуровневая форма функции line. • h = line (...) - получение вектор-столбца дескрипторов, соответ- ствующих каждой линии графического объекта. Следующий пример использует функцию line для добавления тени к нарисованному графику функции sin. Сначала при помощи функции plot рисуется линия, и ее дескриптор сохраняется в hlinel. Затем добавляется более широкая и более светлая тень смещением по координате х. Наконец, первая линия помещается поверх второй.
138 Т е м a 7. ОСНОВЫ ДЕСКРИПТОРНОЙ ГРАФИКИ » t = 0:pi/20:2*pi; hlinel = plot (t, sin(t), 'k’); hline2 = line (t+.06,sin(t)LineWidth4, ... ’Color’, [.8 .8 .8]); set (gca, 'Children', [hlinel hline2]) 7.1.9. Графический объект Patch Графический объект Patch представляет собой один или не- сколько многоугольников, определенных координатами своих вершин, при этом многоугольники могут быть соединены, а могут быть не соеди- нены между собой. Высокоуровневые команды fill, fill3, contour, cont our 3 создают графические объекты Patch и возвращают его дескриптор. К низкоуровневым функциям создания графического объекта относится функция patch, вызываемая с разным числом и типом входных аргу- ментов. Пользователь может управлять свойствами данного объекта че- рез его дескриптор при помощи функций set (), get (). Графический объект Patch задается координатами своих вершин и данными цветовой палитры. Существует два способа определения гра- фического объекта Patch: • определение координат всех вершин каждого полигона, которые MATLAB соединяет в поверхность; • определение координат всех уникальных вершин и матрицы, которая указывает, как соединить эти вершины для создания поверхности. Второй способ предпочтителен в тех случаях, когда описание объ- екта содержит много вершин. Любая вершина, совместно используемая при создании нескольких многоугольников, встречается в описании только один раз. Следующий фрагмент кода строит куб, каждая грань которого рас- крашена в свой цвет: » vm=[0 0 0; 1 0 0; 1 1 0; 0 1 0; 0 0 1; ... 1 0 1; 1 1 1; 0 1 1 ] ; fm=[l 265;2376;3487; 4158; ... 1 2 3 4; 5 6 7 8 ] ; elf; view(3); axis square
7.1. Описание графических объектов 139 patch(’Vertices',vm,’Faces',fm,... 'FaceVertexCData',hsv(6),’FaceColor’,’flat'); Правильный 10-угольник желтого цвета можно построить, вызвав следующие команды: » t = 0:pi/5:2*pi; patch (sin(t), cos(t), 'у') axis equal 7.1.10. Графический объект Rectangle Графический объект Rectangle представляет двумерную закра- шенную область, которая может принимать определенную форму от прямоугольника до эллипса: » elf; set (gca, ’Visible', 'off'); rectangle( 'Position', [-.9 -.4 1.8 .8], ... 'Curvature', [1 1], 'FaceColor', [1 .7 .7]); rectangle( 'Position', [-.8 -.3 1.6 .6], ... 'Curvature', [.5 .5], 'FaceColor', [.7 1 .7]); rectangle( 'Position', [-.7 -.2 1.4 .4], ... 'Curvature', [0 0], 'FaceColor', [.7 .7 1]); 7.1.11. Графический объект Surface Графический объект Surface представляет собой результат трехмерной визуализации массива данных, когда элемент массива опре- деляет высоту точки над плоскостью хОу. Таким способом формирует- ся трехмерная поверхность, состоящая из четырехугольников, вершины которых определяются массивом исходных данных. Графические объекты Surface создаются при вызове высокоуров- невых функций pcolor, surf, mesh или низкоуровневой функции surface. Следующий фрагмент кода демонстрирует создание графического объекта Surface при помощи функции surface: » title('SURFACE - regular surface') t= 0:pi/10:2*pi; [X,Y,Z]= cylinder(.7+.3*cos(t));
140 Т е м a 7. ОСНОВЫ ДЕСКРИПТОРНОЙ ГРАФИКИ Z= Z-0.5; hs= surface(X,Y,Z); Дескриптор графического объекта Surface может быть получен, например, с помощью функции hs =surf (...) . Пользователь может управлять его свойствами с помощью функций set(sh), get (sh) . 7.1.12. Графический объект Text Графический объект Text представляет собой текстовый объект, т. е. строки символов, выводимые в графическом окне. Графические объекты Text создаются при использовании высоко- уровневых команд title, xlabel, ylabel, zlabel, gtext или низкоуровневой команды text. Следующий фрагмент кода рисует график функции y=sin (х) в диапазоне [0 2*pi] и подписывает график в позиции (pi, 0) в виде sin(n)”: » plot (0:pi/20:2*pi, sin(0:pi/20:2*pi)); text (pi,0,' \leftarrow sin(\pi)FontSize18); Функции, создающие графический объект Text, возвращают его дескриптор, например ht = title (...) . Пользователь может управлять его свойствами с помощью функций set (ht), get (ht) . 7.2. Управление свойствами объектов Графические объекты имеют большой набор свойств, каждое со своими допустимыми значениями. Полная информация о свойствах гра- фических объектов и их значениях содержится в справочной системе MATLAB. Для получения и установки свойств графических объектов исполь- зуются функции get и set, которые выполняют действия в зависимо- сти от входных параметров. Каждое свойство графического объекта кроме допустимых значений имеет значение, установленное по умолчанию. Если это значение не пе- реопределяется, то оно используется при работе с графическим объек- том. Переустановить значение свойства можно при помощи функции set, как показано в табл. 7.6.
7.2. Управление свойствами объектов 141 Таблица 7.6. Управление свойствами графических объектов Функция Описание get(hobj) Вывод списка текущих значений свойств графического объекта с де- скриптором hobj set(hobj) Вывод списка возможных значений всех свойств объекта get(hobj,'PropertyName') Вывод текущего значения указан- ного свойства объекта set(hobj,'PropertyName') Вывод списка возможных значений указанного свойства объекта set(hobj,'PropertyName', 'PropetyValue' ) Установка нового значения указан- ного свойства объекта reset(hobj) Восстановление стандартных зна- чений свойств по умолчанию объ- екта Кроме этого, можно изменить значения свойств, установленные по умолчанию, на уровне родительских объектов. Например, изменить свойства графического объекта Text, установленные по умолчанию, можно на уровне родительских объектов Axes, Figure и Root: » set(0,'DefaultTextProperty',PropertyValue...) » set(gcf,’DefaultTextProperty',Propertyvalue...) » set(gca,'DefaultTextProperty',PropertyValue...)
ТЕМА 8 ИМПОРТ И ЭКСПОРТ ДАННЫХ Система MATLAB обеспечивает различные способы загрузки дан- ных из файлов, хранящихся на дисках, или из буфера обмена Clip- board в рабочее пространство Workspace и, наоборот, сохранение переменных рабочего пространства в файлы. Такие процессы называют- ся соответственно импортированием данных (importing data) и экспортированием данных (exporting data). Выбор механизма импорта или экспорта зависит, в основном, от формата перемещаемых данных: текстовые, бинарные данные или данные стандартного формата. Если для работы с каким-либо форматом система MATLAB не имеет вы- сокоуровневой функции, то всегда можно воспользоваться низкоуровне- выми функциями файлового ввода-вывода. В системе MATLAB организована работа с файлами разных форма- тов. Среди них: • формат стандарта ASCII (American Standard Code for Information Inter- change). Данные текстовые файлы содержат буквенно-цифровые сим- волы и могут просматриваться текстовыми редакторами; • форматы электронных таблиц Microsoft Excel и Lotus 123; • стандартные графические форматы: BMP (Microsoft Windows Bitmap), TIFF (Tagged Image File Format), GIF (Graphics Interchange Format), JPEG (Joint Photographic Experts Group), PNG (Portable Network Graph- ics); • аудио- и видеоформаты: AVI (Audio/Video Interleaved), WAV (Micro- soft WAVE sound); • форматы научных данных: HDF (Hierarchical Data Format), CDF (Common Data Format), FITS (Flexible Image Transport System); • передача данных через Интернет; • низкоуровневый файловый ввод-вывод (Low-Level File I/O).
8.1. Сохранение данных рабочего пространства 143 8.1. Сохранение данных рабочего пространства Для записи и считывания информации в MATLAB предусмотрен специальный формат МАТ-файла, позволяющий сохранять данные из рабочего пространства Workspace в файлах на диске. Существует ряд команд для сохранения информации на диске и для ее считывания. • importdata - загрузка данных из файла в рабочее пространство Workspace. importdata ( ’ filename’ ) загружает данные из файла file- name в рабочее пространство. А = importdata ( ’ filename ’ ) загружает данные из файла fi- lename в переменную А. А = importdata (’ filename delimiter ’ ) загружает данные из файла filename, используя delimiter как разделитель столбцов (в случае текстового файла). • load - загрузка данных из файла в рабочее пространство Work- space. load загружает все переменные из МАТ-файла mat lab. mat, если он существует. load filename загружает все переменные из файла filename. Если у filename нет расширения, то функция ищет файл с именем fi- lename или filename .mat и рассматривает его как двоичный МАТ- файл. Если у filename есть расширение, отличное от .mat, функция рассматривает его как файл с ASCII данными. load filename X Y Z загружает указанные переменные. load -ascii filename или load -mat filename заставля- ет функцию рассматривать файл или как ASCII файл, или как МАТ-файл независимо от расширения. S = load ( ... ) возвращает содержимое МАТ-файла в перемен- ной S. Если файл является МАТ-файлом, то S - структура, содержа- щая поля-переменные. Если файл содержит ASCII данные, то S - мас- сив двойной точности. • save - сохранение данных из рабочего пространства Workspace в файле. save сохраняет значения всех переменных рабочего пространства в МАТ-файл matlab.mat.
144 Т е м a 8. ИМПОРТ И ЭКСПОРТ ДАННЫХ save filename сохраняет значения всех переменных рабочего пространства в файл filename. Если у файла filename не указано расширение, то данные запишутся в двоичный файл filename .mat. save filename X Y Z ... сохраняет указанные переменные. Следующая команда сохраняет в файле переменные с общей частью в имени: » save mydat.mat abc* Обращаться к командам load и save можно так же, как и к функ- циям. Например, вызов функции » save('mydat.mat', 'а', 'Ь', 'с') сохраняет в файле перечисленные переменные. 8.2. Низкоуровневый файловый ввод-вывод Система MATLAB включает ряд низкоуровневых функций файло- вого ввода-вывода (Low-Level File I/O) и следует стандарту ANSI языка программирования С. Такой ввод-вывод называется также буферизован- ным (buffered), или форматированным (formatted) вводом-выводом. Для того чтобы осуществить файловый ввод-вывод данных, необходимо вы- полнить действия в следующей последовательности: 1) открыть файл и получить указатель файла (file identifier) - функция fopen. 2) выполнить операции с данными файла: а) чтение, запись бинарных данных - функции f read, fwrite; б) чтение текстовых строк из файла - функции f gets/f getl; в) чтение форматированных ASCII данных - функция f scant; г) запись форматированных ASCII данных - функция fprintf; 3) закрыть файл - функция f close. Рассмотрим данные функции более подробно. 8.2.1. Работа с именем файла Для работы с файлом любого формата необходимо знать его имя, расширение и местоположение на диске, т. е. путь поиска. Система MATLAB предоставляет ряд вспомогательных функций для организации работы с файлами, которые представлены в табл. 8.1.
8.2. Низкоуровневый файловый ввод-вывод 145 Таблица 8.1. Вспомогательные функции для работы с файлами данных Функция Описание и -р й (в Л ф Н 4-1 Выделение составляющих пути доступа. Входной аргу- мент - текстовая строка полного пути доступа к файлу. Выходные аргументы - составляющие пути доступа: путь, имя файла, расширение, версия fullfile Формирование полного имени файла из имен каталогов и имени файла filesep Получение символа разделителя имен каталогов при формировании полного пути к файлу (в зависимости от платформы) tempdir Получение полного имени системного временного ката- лога, если он существует (не создавая его) tempname Получение уникального имени временного файла - воз- вращает текстовую строку, подходящую для использо- вания в качестве имени временного файла (уникальность не гарантируется, но предполагается) Пример использования функций fileparts и fullfile: » file = ’\С:\temp\matlab\myfile.txt’; » [pathstr, name, ext, versn] = fileparts(file) pathstr = \C:\temp\matlab name = myfile ext =.txt versn = ’’ » str = fullfile(’Ctemp','matlab’,'myfun.m') str = C:\temp\matlab\myfun.m 8.2.2. Работа с бинарными и текстовыми файлами Для операций ввода-вывода с использованием форматов текстовых данных и работы с бинарными файлами применяются команды, подоб- ные стандартным функциям языка С. • f open - открытие файла и получение информации о файлах. Функция fopen выполняет два действия: во-первых, открывает файл; во-вторых, возвращает файловый идентификатор, который используют
146 Т е м a 8. ИМПОРТ И ЭКСПОРТ ДАННЫХ все остальные функции низкоуровневого файлового ввода-вывода. Функция также позволяет получить информацию об открытых файлах. fid = fopen (filename) открывает файл filename для чте- ния и возвращает файловый идентификатор fid. [fid,message] = fopen (filename, permission) от- крывает файл filename в режиме, указанном в разрешении permis- sion. В message содержится сообщение о системной ошибке, если файл не открыт. Режимы разрешения permission представлены в табл. 8.2. Таблица 8.2. Режимы открытия файлов Тип Описание ' г' Открыть файл для чтения (по умолчанию) ' W ' Открыть файл или создать новый файл для записи, уничто- жая старые данные ' а' Открыть файл или создать новый файл для записи, добавляя данные в конец файла ' г+' Открыть файл для чтения и записи ' w+' Открыть файл или создать новый файл для чтения и записи, уничтожая старые данные 'а+' Открыть файл или создать новый файл для чтения и записи, добавляя данные в конец файла ' t' Открыть текстовый файл 'Ь' Открыть бинарный файл fids = fopen ('all') возвращает вектор-строку, содержащую идентификаторы всех открытых файлов, не включая идентификатор 1 (standard output) и идентификатор 2 (standard error). Число элементов вектора равно числу открытых файлов. [filename, permission, machineformat] = fopen (fid) возвращает имя файла, строку разрешения и строку формата, со- ответствующие файлу с указанным идентификатором fid. Идентификатор файла fid, возвращаемый функцией fopen, ис- пользуется во всех остальных низкоуровневых функциях файлового вво- да-вывода в качестве первого аргумента. • f close - закрытие файлов.
8.2. Низкоуровневый файловый ввод-вывод 147 Функция fclose закрывает один или более отрытых файлов и может вызываться следующими способами: status = fclose(fid) закрывает указанный файл, если он от- крыт, возвращая 0 в случае успеха и -1 в противном случае. status = fclose('all') закрывает все открытые файлы, кро- ме файлов с идентификатором 0, 1 или 2. • f tell - получение текущей позиции в файле. Вызывается: position = ft ell (fid) возвращает текущую позицию. • f seek - переустановка текущей позиции в файле. Вызывается: status = fseek (fid, offset, origin) перемещает те- кущую позицию в файле на offset байтов относительно origin. До- пустимые значения аргумента origin: • ' bo f' или -1: от начала файла, • ’ oof ’ или 0: от текущей позиции в файле, • ' еоf' или 1: от конца файла. Допустимые значения аргумента offset: • offset >0 - передвижение к концу файла; • offset = 0 - текущая позиция не изменяется; • offset < 0 - передвижение к началу файла. • feof - проверка достижения конца файла. Вызывается: eofstat = feof (fid) возвращает 1, если указатель указывает на конец файла, и 0 в других случаях. • f rewind - переход на начало файла. frewind (fid) устанавливает текущую позицию файла с иден- тификатором fid на начало файла. • f read - чтение двоичных данных из файла. [A,count] = fread (fid, size, precision) читает дво- ичные данные из указанного файла в матрицу А. Параметр size опреде- ляет количество данных. Если размер не указан, fread читает до конца файла. Возможные значения параметра size представлены в табл. 8.3. Параметр precision - это строка, указывающая формат данных ('unsigned', 'char', 'int8', 'double' и т. д.). Параметр skip указывает число байт, которые будут пропущены каждый раз после прочтения ука- занного числа данных.
148 Т е м a 8. ИМПОРТ И ЭКСПОРТ ДАННЫХ • fwrite - запись двоичных данных в файл. count = fwrite(fid, A, precision) записывает элементы матрицы А по столбцам в файл. Параметр precision такой же, как и функции tread. Выходной аргумент возвращает количество записанных элементов. Таблица 8.3. Возможные значения параметра size функции tread Вид Описание п Чтение п элементов в вектор-столбец inf Чтение до конца файла в вектор-столбец, содержащий чис- ло элементов, равное количеству элементов в файле [m,n] Чтение данных в ш строк и п столбцов, при этом запол- нение происходит по столбцам. Недостающие элементы за- полняются нулями; п может быть определено как inf, а ш - нет [m,inf] Чтение до конца файла с заполнением ш строк по столб- цам. Недостающие элементы заполняются нулями Следующий пример открывает файл testl.dat и записывает в не- го 101 раз число типа double и закрывает файл. Затем открывает этот же файл, читает каждое второе число в массив В, переустанавливает те- кущую позицию в начало файла, читает каждое третье число в массив С и закрывает файл. » А=[0:0.01:10] ; fid = fopen(’testl.dat', 'w'); fwrite(fid, A, 'double'); fclose(fid); fid = fopen(’testl.dat', 'r'); [B, count] = fread(fid, inf, 'double',8); frewind(fid); [C, count] = fread(fid, inf, 'double',16); fclose(fid); Бинарные файлы являются просто потоками данных. Для работы с текстом используются текстовые файлы, а также следующие функции для чтения и записи информации в текстовый файл.
8.2. Низкоуровневый файловый ввод-вывод 149 • А = fgetl (fid) - чтение следующей строки текстового файла, включая символ перевода строки. • А = fgets (fid) - чтение следующей строки текстового файла без символа перевода строки. • [A, count] = fscanf (fid, format, size) - чтение дан- ных из текстового файла, записанных в определенном формате. • count = fprintf (fid, format, A, ...) - форматный вы- вод в текстовый файл. Если идентификатор файла равен 1 или отсут- ствует, то вывод идет на экран. • А = sscanf (s, format, size) - чтение форматированных дан- ных из строки (а не из текстового файла). • [s,errmsg] = sprintf (format,А, . . .) - запись форматиро- ванных данных в строку (не в текстовый файл). Для чтения и записи текстовой информации применяются формат- ные спецификации, представленные на рис. 8.1. Возможные значения управляющего символа представлены в табл. 8.4. Таблица 8.4. Значения управляющего символа формата данных Символ Значение — Выравнивание по левому краю + Обязательное написание знака числа (+ или -) 0 Заполнение недостающих значений поля нулями
150 Т е м a 8. ИМПОРТ И ЭКСПОРТ ДАННЫХ Возможные значения управляющего символа форматной спецификации представлены в табл. 8.5. Таблица 8.5. Спецификации при вводе и выводе форматированных данных Код Описание %с Одиночный символ %d Десятичное представление (знаковое) %f Представление с фиксированной точкой (вещественное) %е %Е Экспоненциальное представление %д %G Более компактное представление %f или %е %i Десятичное представление (знаковое) %о Восьмеричное представление (беззнаковое) %s Строка символов %u Десятичное представление (беззнаковое) %х %Х Шестнадцатеричное представление 8.3. Работа со стандартными файлами 8.3.1. Графические файлы Система MATLAB предлагает команды для чтения и записи ряда стандартных форматов графических файлов: BMP (Microsoft Windows Bitmap), TIFF (Tagged Image File Format), GIF (Graphics Interchange For- mat), JPEG (Joint Photographic Experts Group), PNG (Portable Network Graphics). Перечень функций, позволяющих читать, записывать и отображать графические образы, представлен в табл. 8.6. Таблица 8.6. Функции для работы с графическими файлами Функция Назначение image Отображение графического изображения imread Чтение графических данных из файла в массив imwrite Запись графических данных из матрицы в файл imfinfo Получение информации о графическом файле и содержа- щемся в нем изображении
8.3. Работа со стандартными файлами 151 В среде MATLAB для обработки изображений имеется сервисный пакет Image Processing ToolBox. 8.3.2. Другие форматы данных Для работы с аудио- и видеофайлами в стандартах au, vaw и avi применяются команды auread, auwrite, wavread, wavwrite, avi- read, что позволяет использовать MATLAB для подготовки и обработки звуковой и видеоинформации. Для работы с данными электронных таблиц Excel применяются функции xlsread, xlswrite, а для работы с электронными таблица- ми в стандарте Lotus 123-функции wklread, wklwrite.
ТЕМА 9 ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ Под графическим интерфейсом пользователя (Graphical User Interface - GUI) подразумевается тип экранного представления, при котором пользователь может выбирать команды, запускать задачи, вводить и просматривать исходные данные, обрабатывать полученные результаты, указывая на элементы управления (кнопки, пункты меню и т. д.), показанные на экране. Действия, как правило, выполняются при помощи мыши либо нажатием клавиш на клавиатуре. Среда MATLAB предоставляет разработчику набор средств от команд создания элемен- тарного интерфейса для интерактивного взаимодействия с приложением до реализации графического интерфейса пользователя на основе стан- дартных графических окон. Графический интерфейс пользователя приложения, созданного в среде MATLAB, представляет собой одно или несколько графических окон Figures, содержащих элементы управления (кнопки, окна редак- тирования, списки, переключатели, полосы прокрутки, контейнеры, ме- ню, контекстные меню), а также оси координат для вывода информации в графическом виде. Разработка приложения, оснащенного GUI, предпо- лагает выполнение следующих действий: создание графического окна, выбор и расположение необходимых элементов управления в пределах графического окна, определение внешнего вида элементов интерфейса, а также определение действий, которые будут выполняться при наступле- нии какого-либо события, связанного с элементом интерфейса, например при нажатии пользователем кнопки. Процесс создания приложения до- пускает постепенное наращивание возможностей программы: добавле- ние элементов управления в графическое окно, запуск и тестирование приложения, возврат в режим редактирования. Стиль визуального объ- ектно-ориентированного программирования позволяет наглядно в реаль- ном времени конструировать пользовательский интерфейс с помощью мыши в отличие от традиционного процесса написания кодов, при кото- ром результат виден на экране только после запуска программы на вы- полнение.
9.1. Элементарный интерфейс 153 9.1. Элементарный интерфейс Для создания элементарного интерфейса в виде простого ввода и вывода данных, приостановки вычислений и организации меню в MATLAB реализованы команды, представленные в табл. 9.1. Таблица 9.1. Команды элементарного интерфейса Функция Описание input Интерактивный ввод с клавиатуры ginput Срафический интерактивный ввод координат точек на графике курсором мыши и клавишами клавиатуры gtext Вывод текстовой строки в графическое окно после ин- терактивного выбора позиции вывода курсором мыши di sp Вывод сообщения на экран keyboard Запрос на ввод с клавиатуры pause Пауза до нажатия какой-либо клавиши или задержка на N секунд waitfor Блокировка работы до наступления события error Печать сообщения об ошибке и выход из М-файла menu Меню диалогового ввода Следующий фрагмент кода позволяет интерактивно ввести число или текстовую строку с клавиатуры и затем вывести полученную ин- формацию в командное окно Command Window. » А= input('А = '); message = ['variable А = ' , int2str(A)]; disp(message) Str= input('Str = ' , 's'); message = ['string Str = ' , Str]; disp(message) 9.2. GUI и дескрипторная графика Средствами MATLAB можно разрабатывать приложения, оснащен- ные графическим интерфейсом пользователя GUI (Graphical User Interface). Для этого непосредственно в графическом окне Figure
154 Т е м a 9. ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ размещаются меню и графические элементы управления, позволяющие вводить и выводить данные в окнах редактирования, нажатием кнопок выполнять действия, выбирать и исполнять пункты меню и контекстного меню и т. д. Все действия выполняются при помощи элементов дескрип- торной графики MATLAB - графических объектов. Из командного окна MATLAB требуется всего лишь один раз вызвать М-функцию, создаю- щую такое графическое окно. Команды для создания меню и контекстно- го меню, а также различных элементов управления и контейнеров пред- ставлены в табл. 9.2. Все перечисленные в таблице графические объекты выполнены в системе MATLAB по объектно-ориентированной техноло- гии и характеризуются присущим им набором свойств. Команды- конструкторы позволяют создавать объекты и одновременно задавать их некоторые свойства. Изменением свойств можно модифицировать внеш- ний вид объектов и их поведение. Чтобы изменить свойства графических объектов после их создания, нужно получить доступ к ним по их деск- риптору при помощи функций set () и get (). Все остальные свой- ства объектов определяются по умолчанию. Таблица 9.2. Команды создания графического интерфейса пользователя Функция Описание figure Крафическое окно axes Оси координат uicontrol Элемент управления uimenu Меню ui contextmenu Контекстное меню uipanel Контейнер для группировки элементов управления uipushtool Управляющая кнопка на инструментальной панели uitoggletool Кнопка с фиксацией нажатого состояния на инст- рументальной панели uitoolbar Инструментальная панель для быстрого доступа к часто используемым функциям приложения uibuttongroup Контейнер для управления радиокнопками и кноп- ками с фиксацией нажатого состояния
9.2. GUI и дескрипторная графика 155 9.2.1. Объект Uicontrol Объекты Uicontrol являются управляющими элементами пользо- вательского интерфейса, которые выполняют функции обратного вызова, когда пользователь активизирует объект. Объект Uicontrol является потомком объекта Figure и, следовательно, не зависит от Axes. Способы вызова конструктора следующие: » h = uicontrol('PropertyName’,PropertyValue,...) » h = uicontrol(parent,'PropName’,PropValue,...) » h = uicontrol » uicontrol(h) Объект Uicontrol обладает целым рядом свойств. Одно из са- мых важных свойств - свойство Style, которое определяет тип эле- мента управления и принимает одно из следующих значений: • ’ checkbox' - индикатор с флажком; • ' edit' - поле ввода и редактирования текста; • ’frame’ - контейнер любых компонентов; • ’ listbox' - компонент для отображения раскрытого списка строк; • ' popupmenu ’ - компонент для отображения и редактирования выпа- дающего списка строк; • ' pushbutton ’ - управляющая кнопка; • ’ radiobutton’-радиокнопка; • ’ slider' - ползунок, управляемый клавишами или курсором мыши (линейка прокрутки); • ’ text ’ - статический неизменяемый текст (метка); • ’ toggle ’ - кнопка с фиксацией нажатого состояния. Свойство String определяет надпись на элементе, а также список строк компонентов ListBox и PopupMenu. Свойство Position представляет собой вектор-строку из четырех чисел и задает положение управляющего элемента относительно левого нижнего угла графического окна и его размеры. Свойство Enable определяет, реагирует ли элемент на события, связанные с мышью и клавиатурой. Свойство Тад задает имя элемента - текстовую строку- идентификатор, определяемую разработчиком, для возможного обраще- ния к элементу не только через дескриптор, но и по имени.
156 Т е м a 9. ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ Свойство Visible определяет видимость элемента управления. Например, следующий фрагмент кода создает элемент управления в виде кнопки, определяет ее имя, надпись, положение в графическом ок- не, а также реакцию на нажатие этой кнопки: » hTgbSave= uicontrol('Tag','btnSave', ... 'String’,’Save', 'Style','Pushbutton',... 'Callback’,’Save_fun’, ’Units',’Characters',... 'Position', [50 0,10 2]); 9.2.2. Объект Uimenu Объекты Uimenu являются выпадающими меню, которые выпол- няют функции обратного вызова при активизации пользователем пункта меню. Система MATLAB размещает Uimenu в Menu Ваг окна Fig- ure справа от существующего меню, определенного системой. Объект Uimenu является потомком объекта Figure и, следова- тельно, не зависит от Axes. Способы вызова конструктора следующие: » uimenu ('PropertyName', PropertyValue,...) » uimenu (parent, 'PropName', PropValue,...) » h = uimenu ('PropertyName', PropertyValue,...) » h = uimenu (parent, 'PropName', PropValue,...) Следующий пример создает в текущем окне Figure пункт меню Workspace, который размещается справа от стандартного меню окна Figure и чей выбор позволяет пользователю создать новый объект Figure, сохранить переменные рабочего пространства Workspace в файле mat lab. mat, а также выйти из MATLAB. Кроме этого, опреде- ляется разделитель пунктов меню и «горячая» клавиша Ctrl+Q для выхода из MATLAB. % Define the user menu f = uimenu('Label','Workspace'); % Define the menu items with standard callbacks uimenu(f,'Label','New Figure','Callback','figure'); uimenu(f,'Label','Save','Callback','save'); uimenu(f,'Label','Quit','Callback','exit',... 'Separator','on','Accelerator','Q');
9.2. GUI и дескрипторная графика 157 9.2.3. Объект Uicontextmenu Объект Uicontextmenu создает контекстное меню, которое появ- ляется при нажатии пользователем правой кнопки мыши над графиче- ским объектом. » h = uicontextmenu ('PropName', PropValue,...); Следующий пример создает контекстное меню, ассоциированное с линией на графике, которое появляется всякий раз, когда пользователь нажимает правую кнопку мыши в любом месте линии на графике. Пунк- ты меню позволяют пользователю изменить стиль линии. % Define the context menu степи = uicontextmenu; %Define the line, associate it with the context menu hline = plot(1:10, 'UIContextMenu’, степи); % Define callbacks for context menu items cbl = [’set(hline, ’’LineStyle’’, cb2 = ['set(hline, ’’LineStyle’’, cb3 = ['set(hline, ''LineStyle'', % Define the context menu items iteml = uimenu( степи, ’Label’, ’dashed’, ... ..’Callback’, cbl); item2 = uimenu( степи, 'Label', 'dotted', ... ..’Callback’, cb2); item3 = uimenu( степи, 'Label', 'solid', ... ..’Callback’, cb3); 9.2.4. Callback функции Следующий фрагмент кода создает управляющий элемент - кнопку. » hF = figure; uicontrol( hF, ’Style','pushbutton’, ... 'String’, ’Button’, ’Position’, [ 10 10 70 30 ]); Визуально эта кнопка функционирует - с помощью левой кнопки мыши она нажимается и отжимается, но при этом не выполняются ника- кие действия как результат последствий нажатия. Это происходит пото- му, что кнопке не приписаны никакие функции, выполнение которых и должно стать реакцией на нажатие.
158 Т е м a 9. ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ Функции, которые связывают какие-либо действия с графическими элементами управления, называют callback-функциями. Чтобы свя- зать кнопки с callback-функциями, которые будут вызываться средой MATLAB при нажатии на эти кнопки, при создании кнопок функцией uicontrol необходимо прописать свойство ’ Callback', указав ему в качестве значения имя М-функции. » hBtnl = uicontrol( hF,'Style’,’pushbutton', ... 'Position’, [60 20 140 40], ... 'String', 'Action', 'Callback', 'ActFun'); » hBtn2 = uicontrol( hFg,'Style','pushbutton', ... 'Position', [300 20 140 40], ... 'String', 'New Figure', 'Callback', 'figure'); Если функция, которая должна вызываться при нажатии на кнопку Action, будет записана в файле Actfun.m, то в качестве значения свойства 'Callback' обязательно нужно написать значение в виде имени функции ' ActFun', но не имени файла ' ActFun. m'. 9.3. Среда GUIDE Создание графических окон с элементами управления возможно не только при помощи ручного написания соответствующих М-файлов и вызова внутри них функций-конструкторов uicontrol, uimenu и т. д. Такой способ оправдан в случае, если разработчик хочет полностью кон- тролировать процесс разработки. К его недостаткам относится ненагляд- ность конструирования интерфейса. Увидеть, как выглядит разрабаты- ваемый интерфейс на экране, можно только после написания кода и за- пуска программы на выполнение. Для поддержки визуальной реализации графического интерфейса пользователя GUI в MATLAB имеется среда GUIDE (Graphical Us- er Interface Development Environment), при помощи которой создается графический интерфейс и описываются прототипы функций на языке MATLAB. Интегрированная среда GUIDE основывается на техно- логии быстрой разработки приложений (Rapid Application Development - RAD) и является примером визуального объектно-ориентированного программирования. Такой способ взаимодействия разработчика и про- граммы с компьютером позволяет наглядно конструировать пользова- тельский интерфейс с помощью мыши на основе механизма Drag&Drop.
9,3, Среда GUIDE 159 По команде » guide открывается графический редактор Layout Editor, содержащий палитру графических элементов управления и форму для создания GUI. Графический интерфейс редактора представлен на рис. 9.1. Рис. 9.1. Окно разработки графического интерфейса С помощью мыши можно методом буксировки перетаскивать эти элементы на форму. Для создания графического интерфейса в среде GUIDE при помощи Layout Editor необходимо выполнить следующие действия: • В командном окне ввести команду » guide и открыть GUIDE Quick Start Dialog Box. • Выбрать «Blank GUI» шаблон на вкладке «Create New GUI» и нажать OK. • Если необходимо загрузить существующий GUI, то следует ввести команду » guide figl.fig или выбрать требуемый файл на вкладке «Open Existing GUI». • Выбрать требуемые графические элементы управления из Палитры компонентов и поместить их на форму. • Дважды щелкнуть по выбранному компоненту и в открывшемся ин- спекторе свойств Property Inspector установить необходимые свойства выделенного компонента.
160 Т е м a 9. ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ • Для просмотра иерархии установленных объектов выбрать пункт ме- ню View | Object Browser, из которого легко перейти к редакти- рованию свойств нужного объекта. • Для запуска созданного в Layout Editor интерфейса GUI выбрать команду Tools | Run или «Зеленый треугольник» на панели «горя- чих» клавиш. • Сохранить созданный интерфейс GUI в файле с расширением . fig. С помощью контекстного меню создать М-файл с тем же именем, объя- вить соответствующие компонентам callback-функции и отредак- тировать их в редакторе-отладчике М-файлов. Интерактивная разработка интерфейса при помощи среды GUIDE состоит в подготовке графического макета (файл .fig), а процесс за- вершается созданием файла интерфейса (.т). Последний файл можно вызывать и редактировать, как и всякий М-файл. Необходимо помнить, что среда GUIDE только создает заголовки необходимых функций. Сам код callback-функций должен описывать разработчик самостоятельно.
ЛИТЕРАТУРА 1. Ануфриев, И. Е. Самоучитель MatLab 5.3/б.х / И. Е. Ануфриев. СПб.: БХВ-Петербург, 2004. 736 с. 2. Говорухин, В. Компьютер в математическом исследовании. Учеб- ный курс / В. Говорухин, В. Цибулин. СПб.: Питер, 2001. 624 с. 3. Потемкин, В. Г. Система MatLab 5 для студентов / В. Г. Потем- кин. М.: ДИАЛОГ-МИФИ, 1998. 314 с. 4. Потемкин, В. Г. Система инженерных и научных расчетов Mat- Lab 5.x: В 2 т. / В. Г. Потемкин. М.: ДИАЛОГ-МИФИ, 1999. Т. 1. 366 с. 5. Потемкин, В. Г. Система инженерных и научных расчетов Mat- Lab 5.x: В 2 т. / В. Г. Потемкин. М.: ДИАЛОГ-МИФИ, 1999. Т. 2. 304 с.
СОДЕРЖАНИЕ ВВЕДЕНИЕ.............................................................3 Тема 1. НАЗНАЧЕНИЕ И СТРУКТУРА MATLAB................................5 1.1. Структура системы MATLAB.......................................6 1.1.1. Основные части MATLAB....................................6 1.1.2. Сервисные программы MATLAB...............................7 1.2. Интерфейс пользователя........................................10 1.2.1. Командное окно..........................................12 1.2.2. Окно просмотра рабочего пространства..................15 1.2.3. Редактор массивов.......................................19 1.2.4. Текущий каталог.........................................19 1.2.5. История команд..........................................22 1.2.6. Редактор-отладчик М-файлов..............................23 1.2.7. Окна для работы с графикой..............................25 1.2.8. Окно просмотра справочной системы.......................27 1.2.9. Кнопка Start и окно Launch Pad..........................28 1.3. Взаимодействие с другими приложениями.........................28 Тема 2. ДАННЫЕ И ВЫЧИСЛЕНИЯ.........................................29 2.1. Арифметические вычисления.....................................29 2.1.1. Простейшие вычисления...................................30 2.1.2. Форматы представления данных............................30 2.1.3. Комплексные числа.......................................32 2.1.4. Встроенные математические функции.......................32 2.2. Типы данных...................................................33 2.2.1. Переменные в MATLAB.....................................37 2.3. Массивы.......................................................38 2.3.1. Типы массивов...........................................38 2.3.2. Работа с массивами......................................40 2.4. Векторы.......................................................41 2.4.1. Вектор-строки...........................................42 2.4.2. Вектор-столбцы..........................................45 2.4.3. Поэлементные операции с векторами.......................46 2.5. Матрицы.......................................................48 2.5.1. Создание матриц.........................................48 2.5.2. Доступ к элементам матрицы..............................50 2.5.3. Взаимные преобразования векторов и матриц...............52 2.6. Тензоры.......................................................54 2.6.1. Создание тензоров.......................................54 2.6.2. Доступ к элементам тензора..............................56 2.7. Функции для работы с массивами................................56 2.8. Вычисления с массивами........................................58 2.8.1. Арифметические операции.................................58
Содержание 163 2.8.2. Операции отношения и логические операции............61 2.9. Текстовые строки..........................................63 2.9.1. Функции для работы со строками......................64 2.9.2. Массивы строк.......................................65 2.10. Структуры................................................66 2.10.1. Создание структуры.................................66 2.10.2. Функции для работы со структурами..................68 2.11. Массивы ячеек............................................69 2.11.1. Создание массива ячеек.............................69 2.11.2. Функции для работы с массивами ячеек...............72 Тема 3. ЭЛЕМЕНТЫ ПРОГРАММИРОВАНИЯ...............................73 3.1. Управление вычислением....................................73 3.1.1. Операторы ветвления.................................73 3.1.2. Операторы цикла.....................................76 3.2. Обработка исключительных ситуаций.........................78 Тема 4. СЦЕНАРИИ, ФУНКЦИИ И ПЕРЕМЕННЫЕ..........................80 4.1. Типы М-файлов.............................................80 4.1.1. Сценарии............................................80 4.1.2. Функции.............................................81 4.1.3. Типы функций........................................86 4.1.4. Видимость имен функций..............................89 4.1.5. Синтаксис вызова М-функций..........................89 4.2. Переменные и их область действия..........................94 4.2.1. Глобальные переменные...............................94 4.2.2. Устойчивые переменные...............................95 4.3. Отладка М-функций.........................................96 Тема 5. ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ................98 5.1. Основные понятия ООП......................................98 5.2. Правила создания класса..................................100 5.3. Методы класса............................................102 5.3.1. Конструктор класса.................................103 5.4. Перегрузка функций и операторов..........................104 5.4.1. Преобразование объектов к другому классу...........104 5.4.2. Переопределение математических операторов..........105 5.4.3. Переопределение индексных операций.................108 5.5. Идентификация объекта....................................109 Тема 6. ВЫСОКОУРОВНЕВАЯ ГРАФИКА.................................ПО 6.1. Двумерная графика........................................111 6.1.1. Функция plot.......................................Ill 6.2. Оформление графиков функций..............................116 6.2.1. Изменение свойств линии............................116
164 Содержание 6.2.2. Толщина линии..........................................118 6.2.3. Надписи на графиках....................................119 6.2.4. Оформление осей системы координат......................121 6.3. Трехмерная графика...........................................123 6.3.1. Функции для отображения поверхностей...................123 6.3.2. Функция plot3..........................................126 6.3.3. Положение камеры и вращение графиков...................127 6.4. Сохранение графических изображений...........................128 Тема 7. ОСНОВЫ ДЕСКРИПТОРНОЙ ГРАФИКИ...............................129 7.1. Описание графических объектов................................129 7.1.1. Иерархия графических объектов..........................129 7.1.2. Графический объект Root................................131 7.1.3. Графический объект Figure..............................132 7.1.4. Графический объект Axes................................133 7.1.5. Графический объект UI..................................134 7.1.6. Графический объект Image...............................135 7.1.7. Графический объект Light...............................136 7.1.8. Графический объект Line................................137 7.1.9. Графический объект Patch...............................138 7.1.10. Графический объект Rectangle..........................139 7.1.11. Графический объект Surface............................139 7.1.12. Графический объект Text...............................140 7.2. Управление свойствами объектов...............................140 Тема 8. ИМПОРТ И ЭКСПОРТ ДАННЫХ....................................142 8.1. Сохранение данных рабочего пространства......................143 8.2. Низкоуровневый файловый ввод-вывод...........................144 8.2.1. Работа с именем файла..................................144 8.2.2. Работа с бинарными и текстовыми файлами................145 8.3. Работа со стандартными файлами...............................150 8.3.1. Графические файлы......................................150 8.3.2. Другие форматы данных..................................151 Тема 9. ГРАФИЧЕСКИЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ.........................152 9.1. Элементарный интерфейс.......................................153 9.2. GUI и дескрипторная графика..................................153 9.2.1. Объект Uicontrol.......................................155 9.2.2. Объект Uimenu..........................................156 9.2.3. Объект Uicontextmenu...................................157 9.2.4. Callback функции.......................................157 9.3. Среда GUIDE..................................................158 ЛИТЕРАТУРА.........................................................161
Учебное издание Голубева Лариса Леонидовна Малевич Александр Эрнестович Щеглова Наталья Леонидовна КОМПЬЮТЕРНАЯ МАТЕМАТИКА. ЧИСЛОВОЙ ПАКЕТ MATLAB Курс лекций В авторской редакции Технический редактор Г. М. Романчук Корректор Е. И. Бондаренко Ответственный за выпуск Т. М. Турчиняк Подписано в печать 27.01.2006. Формат 60x84/16. Бумага офсетная. Гарнитура Таймс. Печать офсетная. Усл. псч. л. 9,53. Уч.-изд. л. 8,41. Тираж 250 экз Зак. 1104. Белорусский государственный университет. Лицензия на осуществление издательской деятельности № 02330/0056804 от 02.03.2004. 220050, Минск, проспект Независимости. 4. Отпечатано с оригинала-макета заказчика. Республиканское унитарное предприятие «Издательский центр Белорусского государственного университета». Лицензия на осуществление полиграфической деятельности № 02330/0056850 от 30.04.2004. 220030, Минск, ул. Красноармейская, 6.