курсовые,контрольные,дипломы,рефераты
ГОСУДАРСТВЕННЫЙ ИНЖЕНЕРНЫЙ УНИВЕРСИТЕТ АРМЕНИИ
MATLAB
УЧЕБНОЕ ПОСОБИЕ
Гаспарян Олег Николаевич
Д.т.н, с.н.с
2005
СОДЕРЖАНИЕ
Система математических расчетов MATLAB 4
Рабочий стол (desktop) системы MATLAB 5
Получение справок (Getting Help) 7
Рабочее пространство системы MATLAB 13
редактора Array Editor 16
Пути доступа системы MATLAB 18
Действия над матрицами в системе MATLAB 24
Создание Многомерных Массивов 66
Организация и хранение данных 74
Массивы структур 75
Массивы ячеек 86
Програмирование на MATLAB-е 97
Типы данных 108
Команды управления данными (Flow Control) 114
Приложение 1. Тематические направления системы MATLAB 121
Приложение 2. Команды общего назначения
(General purpose commands) 123
(Elementary math functions). 127
(Elementary matrices and matrix manipulation)
Приложение 6. - Матричные функции и линейная алгебра
(Matrix functions - numerical linear algebra) 129
Приложение 7. Полиномы и интерполяция
(Interpolation and polynomials) 132
Приложение 9. Функции обработки символьных строк
(Character strings) 135
Справочник по базовым функциям
системы MATLAB 137
Система математических расчетов MATLAB
Система MATLAB (сокращение от MATrix LABoratory - МАТричная Лаборатория) разработана фирмой The MathWorks, Inc. (США, г.Нейтик, шт. Массачусетс) и является интерактивной системой для выполнения инженерных и научных расчетов, которая ориентирована на работу с массивами данных. Система использует математический сопроцессор и допускает обращения к программам, написанным на языках Fortran, C и C++.
Наиболее известные области применения системы MATLAB:
· математика и вычисления;
· разработка алгоритмов;
· вычислительный эксперимент, имитационное моделирование;
· анализ данных, исследование и визуализация результатов;
· научная и инженерная графика;
· разработка приложений, включая графический интерфейс
пользователя.
MATLAB – это интерактивная система, основным объектом которой является массив, для которого не требуется указывать размерность явно. Это позволяет решать многие вычислительные задачи, связанные с векторно-матричными формулировками, существенно сокращая время, необходимое для программирования на скалярных языках типа Fortran или C. Будучи ориентированной на работу с реальными данными, эта система выполняет все вычисления в арифметике с плавающей точкой, в отличие от систем компьютерной алгебры REDUCE, MACSYMA, DERIVE, Maple, Mathematica, Theorist, где преобладает целочисленное представление и символьная обработка данных.
Система MATLAB – это одновременно и операционная среда и язык программирования. Одна из наиболее сильных сторон системы состоит в том, что на языке MATLAB могут быть написаны программы для многократного использования. Пользователь может сам написать специализированные функции и программы, которые оформляются в виде М-файлов. По мере увеличения количества созданных программ возникают проблемы их классификации и тогда можно попытаться собрать родственные функции в специальные папки. Это приводит к концепции пакетов прикладных программ (Application Toolboxes или просто Toolboxes), которые представляют собой коллекции М-файлов для решения определенной задачи или проблемы.
В действительности Toolboxes – это нечто большое, чем просто набор полезных функ-ций; часто это результат работы многих исследователей по всему миру, которые объеди- няются в группы по самым различным интересам, начиная от нейтронных сетей, дифференциальных уравнений в частных производных, сплайн-аппроксимации, статистики и размытых множеств до проектирования робастных систем управления, теории сигналов, идентификации, а также моделирования линейных и нелинейных динамических систем с помощью исключительно эффективного пакета SIMULINK. Именно поэтому пакеты прикладных программ MATLAB Application Toolboxes, входящие в состав семейства продуктов MATLAB, позволяют находиться на уровне самых современных мировых достижений в разных областях науки и техники.
Вызов и выход из MATLAB
Вызов MATLAB-а. Для вызова системы MATLAB требуется двойное нажатие на иконку в рабочем столе Windows. При инсталляции MATLAB-а стартовой директорией по умол-чанию является $matlabroot\work, где $matlabroot есть директория, где установлены файл-ы системы MATLAB.
При вызове, система MATLAB автоматически выполняет главный М-файл (master M-file) matlabrc.m., и файл startup.m (есди последний существует). Файл matlabrc.m, которые расположен в директории local, зарезервирован фирмой The MathWorks, а в многопользова-тельских системах может быть использован также системным менеджером. Файл startup.m предназначен для задания ряда стартовых опций (возможностей) по усмотрению пользователя. Вы можете изменить исходные пути доступа (см. далее), ввести заранее определенные переменные в рабочее пространство, изменить текущую директорию и т.д. Стартовый файл startup.m следует ввести в директорию $matlabroot\toolbox\local (более подробно с данным вопросом можно ознакомиться в справочных пособиях по MATLAB-у).
Выход из MATLAB-а. Для окончания сеанса работы с MATLAB следует выбрать опцию Exit MATLAB (Выход из MATLAB) в меню File на рабочем столе MATLAB-а, или напеча-тать quit (Выход) в командном окне Command Window.
При выходе, MATLAB выполняет специальный файл finish.m, относящийся к типу сценари-ев (см. далее) , если только данный файл существует в текущей директории или где-либо на пути доступа системы MATLAB. Файл finish.m создается пользователем. Он должен содер-жать функции или операции, которые пользователь желает автоматически выполнить при выходе из системы MATLAB, например, такие как сохранение рабочего пространства или вызов диалогового окна, запрашивающего подтверждения выхода. В указанной выше дирек-тории $matlabroot\toolbox\local имеются два файла, которые пользователь может использо-вать в качества образца при создании своего файла finish.m:
•finishsav.m – Включает функцию save, что приводит к автоматическому запоминанию рабо-чего пространства при выходе из MATLAB-а.
•finishdlg.m – Выводит на экран подтверждающее диалоговое окно, которое позволяет анну-лировать выход.
Рабочий стол (desktop) системы MATLAB
Рабочий стол системы MATLAB содержит следующие инструментальные окна, часть из которых не появляется при начальном запуске:
• Command Window (Командное Окно) – Выполняет все функции и команды системы
MATLAB.
• Command History (История Команд) – Просмотр функций, введенных ранее в
Command Window, их копирование и выполнение.
• Launch Pad (Окно Запуска) – Запускает все инструменты и обеспечивает доступ ко
всем пакетам системы MATLAB .
• Current Directory Browser (Окно Просмотра Текущего Каталога) – Просмотр файлов
MATLAB, а также сопутствующих файлов, а также выполнение таких операций
над файлами, как поиск и открытие файлов.
• Help Browser (Окно Просмотра Помощи) – Поиск и просмотр документации по всем
функциям и средствам системы MATLAB.
• Workspace Browser (Окно Просмотра Рабочего Пространства) – Просмотр и изменение
содержания рабочего пространства (workspace) системы MATLAB.
• Array Editor (Редактор Массивов Данных) – Просмотр содержимого массивов данных,
записанных в виде таблицы и редактирование данных.
• Editor/Debugger (Редактор/Отладчик) – Для создания, редактирования и отладки
М-файлов, т.е. файлов, содержащих функции системы MATLAB.
Общий вид рабочего окна MATLAB представлен ниже (рис.1). Каждое из перечисленных окон может быть выведено из конфигурации рабочего стола нажатием кнопки со стрелкой в верхнем правом углу окна (см. рис. 1). Обратная операция, то есть ввод в общую конфигурацию, осуществляется выбором опции Dock в меню View сответствующего окна. Можно также изменить конфигурацию рабочего стола путем перемещения любого откры-того окна в новое положение. Для этого нужно просто нажать левой клавишей мыши на выбранное название окна (Title Bar) и «перетащить» его в желаемое положение.
Для восстановления стандартной конфигурации рабочего стола MATLAB необходимо выбрать опцию Default (По Умолчанию) в подменю Desktop Layout (План Рабочего Стола) в меню View (Вид) любого открытого окна системы. Все окна MATLAB содержат также контекстное меню (context menu), которое вызывается нажатием правой кнопки мыши и содержит наиболее часто применяемые опции (функции), связанные с данным окном.
Таким образом. в системе MATLAB имеется возможность изменения вида рабочего стола путем открытия, закрытия, перемещения или изменения размеров каждого из индивидуаль-ных окон.
Просмотр продуктов Просмотр или Кнопка для
и демонстрационных Вызов изменение текущей вывода окна из состава
роликов помощи Ввод функций директории рабочего стола Закрытие окна
Просмотр и вызов Переход к рабочему Нажатием левой клавиши мыши и перемещением
введенных ранее команд пространству (Workspace) можно изменять границы окон
и к окну текущего каталога
Рис. 1. Общий вид рабочего стола системы MATLAB
Ниже приводится вид инструментальной панели системы MATLAB и указано назначение основных кнопок.
Создать новый
М-файл Копировать Создать новую модельSimulink
Просмотр или изменение
Открыть файл Undo текущего каталогаю
Выбор использованных ранее
Вырезать Вставить Redo Вызов Помощи (Help) каталогов
Всплывающее окно указателя, Просмотр с целью изменения
описывающее кнопку текущего каталога
Undo – отмена последнего действия; Redo – повторение последнего действия.
Рис. 2. Инструментальная линейка (Toolbar) рабочего стола
Command Window (Командное окно)
1. Выполнение функций и ввод переменных
Приглашение к вводу команды (>>) в Command Window означает, что MATLAB готов к приему. При появлении приглашения >> вы можете ввести переменную или выполнить ко-манду. Например, для создания 3х3 матрицы А следует напечатать
A = [1 2 3; 4 5 6; 7 8 10]
При нажатии клавиш Enter (или Return) после набора строки, MATLAB реагирует выводом следующей записи
A =
1 2 3
4 5 6
7 8 10.
При этом переменная (матрица) запоминается в рабочем пространстве (workspace) MATLAB.
Внимание! Система MATLAB чувствительна к выбору регистра, т.е. MATLAB разли-чает переменные а и А ! При написании команды (функции) также не следует использо- вать заглавные буквы !
Для выполнения функций следует напечатать функцию включая все аргументы и нажать Enter. При этом MATLAB отобразит в командном окне результат. Например, напечатав
magic(2)
получим
ans =
1 3
4 2.
Если вы хотите ввести несколько командных строк без их немедленного выполнения, вос-пользуйтесь комбинациями Shift+Enter после ввода каждой строки. Последующее нажатие Enter приведет к выполнению всех введенных строк.
Приглашение K>> в командном окне означает, что MATLAB находится в режиме отладки (debug mode). Данный режим будет подробно рассмотрен в дальнейшем.
2. Вычисление выделенных функций и выражений (Evaluating a Selection)
Для вычисления выделенных выражений в командном окне следует нажать правую кнопку мыши и выбрать в контекстном меню опцию Evaluate Selection. Данная операция невозмо-жна если система MATLAB занята, например, выполняет М-файл.
3. Открытие выделения (Opening a Selection)
Для открытия М-файла некоторой функции следует выделить эту функцию в командном окне и выбрать в контекстном меню опцию Open Selection. Это приведет к открытию данно- го файла в окне Редактора/Отладчика (Editor/Debugger).
Внимание! Вы можете одновременно выполнять на MATLAB-е только одну функцию. Если MATLAB выполняет некоторую команду, то все последующие введенные команды запоминаются и выполняются только при окончании предыдущей !
4. Ввод нескольких функций в одну строку
Для ввода нескольких функций в одну командную строку, их нужно разделить точкой с запятой ( ; ). Например, запись трех следующих функций в одной командной строке
format short; x = (1:10)'; logs = [x log10(x)]
и нажатие Enter приведет к выполнению этих функций слева направо и к распечатке таблицы десятичных логарифмов в пределах от 1 до 10.
5. Ввод длинных функций
Если запись не помещается на одной строке, следует использовать три точки, (...) для обозначения того, что запись будет продолжена на следующей строке; нажать Enter для перехода к следующей строке, и затем продолжить ввод записи. Например,
s = 1 – 1/2 + 1/3 – 1/4 + 1/5 – 1/6 + 1/7 ...
– 1/8 + 1/9 – 1/10 + 1/11 – 1/12;
Для записей с одинарными кавычками, такими как строки символов, кавычки следует ста-вить на каждой строке. Например, вводя следующую длинную строку
headers = ['Author Last Name, Author First Name, ’ ...
'Author Middle Initial’]
получим
headers =
Author Last Name, Author First Name, Author Middle Initial
Максимальное количество символов в одной строке равно 4096.
6. Окраска и выделение синтаксиса
Некоторые записи появляются в различных цветах с целью облегчить поиск элементов, таких, например, как парных сочетаний if/else. Имеются следующие основные варианты:
Можно изменить приведенную стандартную окраску, введя соответствующие изменения в опции Preferences в меню рабочего стола File. Там же предусмотрена возможность выбора шрифта и размера символов.
7. Редактирование командной строки
Ниже приводятся некоторые свойства системы MATLAB, дающие экономию времени при вводе:
Свойства буффера обмена. При работе в командном окне целесообразно использовать опции Cut (Вырезать), Copy (Копировать), Paste (Вставить), Undo (Отмена последнего действия), Redo (Повторение последнего действия) из меню Edit (Редактирование), или соответствующие кнопки инструментальной панели (см. рис. 2). Некоторые из этих опций доступны также из контекстного меню командного окна.
Свойства клавиши Tab (Табуляция). MATLAB автоматически завершает имя функции, переменной, названия файла или свойства дескриптора графического объекта (handle graphics property), если вы наберете соответствующие первые несколько букв и нажмете кла-вишу Tab. Если это однозначно определяемое имя, то оно будет автоматически завершено. Если же данные буквы входят в название нескольких функций, то повторное нажатие клавиши Tab вызовет список всех возможных функций. Например, напечатайте cos и наж- мите Tab. Система MATLAB не отреагирует, что означает наличие многих имен начинаю-щихся с cos. При повторном нажатии Tab MATLAB отобразит список всех имеющихся в на- личии подходящих функций:
cos cosh costfun
cos_tr cosint costs_march.
Вызов предыдущих строк. Используйте клавиши стрелок, табуляции и управления на кла-виатуре для повторного вызова, редактирования и повторного использования функций, кото-рые вы ввели ранее. Допустим, вы ввели по ошибке
rho = (1+ sqt(5))/2
При нажатии Enter MATLAB ответит:
Undefined function or variable 'sqt'.
(Неизвестная функция или переменная sqt),
поскольку вы неправильно ввели функцию sqrt (квадратный корень). Вместо того чтобы перепечатывать всю строку, можно нажать клавишу . Предыдущая строка будет повторно отображена. Используя клавишу можно привести курсор в требуемое положение и доба-вить недостающую букву r. Повторные нажатия клавиши вызовут раннее введенные стро-ки. Все вводимые вами функции запоминаются в буфере обмена. При этом можно воспользо- ваться свойством «интеллектуального повторного вызова» (smart recall) для повторного вы-зова ранее введенных функций, которое заключается в том, что достаточно набрать только первые несколько символов из названия требуемой функции. Например, напечатав буквы plo и нажав клавишу мы вызовем последнюю функцию, которая начинается с plo. Данное свойство чувствительно к выбору регистра.
Ниже приводится полный список клавиш, которые можно использовать в командном окне
Клавиши |
Клавиши управления |
Результат операции |
|
|
Ctrl+p |
Вызов предыдущей строки | |
|
Ctrl+n |
Вызов следующей строки. |
|
|
Ctrl+b |
Переход на один символ назад. |
|
|
Ctrl+f |
Переход на один символ вперед. | |
Ctrl+ |
Ctrl+r |
Переход на одно слово направо. |
|
Ctrl+ |
Ctrl+l |
Переход на одно слово влево . |
|
Home |
Ctrl+a |
Переход к началу строки. | |
End |
Ctrl+e |
Переход к концу строки. | |
Esc |
Ctrl+u |
Очистить строку. | |
Delete |
Ctrl+d |
Удалить символ после курсора. | |
Backspace |
Ctrl+h |
Удалить символ перед курсором. | |
Ctrl+k |
Удалить от курсора до конца строки. | ||
Shift+home |
Выделить до начала строки. | ||
Shift+end |
Выделить до конца строки. | ||
8. Очистка командного окна
Для очистки командного окна следует выбрать опцию Clear Command Window из меню Edit. Эта операция не приводит к очистке рабочего пространства, а только удаляет все запи-си с экрана монитора. В дальнейшем вы можете использовать все свойства клавиш для пов-торного вызова введенных ранее функций.
Эквивалентная функция ! Для очистки командного окна можно воспользоваться функцией clc . Подобно clc, функция home переносит приглашение к вводу системы MATLAB (>>) к верхнему левому углу командного окна, но при этом содержимое всего окна не очищается и может быть прочитано стандарными приемами просмотра.
9. Подавление вывода результатов на экран
Если вы заканчиваете строку точкой с запятой ( ; ), то при нажатии Enter MATLAB выпол-няет задачу (программу), но не выводит результаты на экран монитора. Это может быть осо-бенно полезным при генерации больших матриц. Например, при вводе
A = magic(100);
и нажатии Enter MATLAB создает в рабочем пространстве матрицу A размера 100х100, но не выводит ее на экран.
10. Разбиение экранного вывода на страницы
Если выводимые результаты очень длинные и не помещаются в пределах экрана, то вывод может быть слишком быстрым для восприятия (то есть строки будут бежать очень быстро). В таких случаях можно воспользоваться функцией more . По умолчанию функция more бло-кирована (выключена). Если вы напечатаете more on, то MATLAB осуществляет вывод на экран постранично (по размеру экрана). После просмотра первой страницы следует нажать на одну из следующих клавиш
Клавиша |
Действие |
Enter |
Переход к следующей строке |
Пробел |
Переход к следующей странице |
q |
Остановка вывода на экран |
Постраничный вывод можно блокировать вводом функции more off.
11. Выбор формата и интервала между строками для числовых данных
Эквивалентная функция ! Для выбора формата выводимых на экран числовых данных можно воспользоваться функцией format. Данная функция имеет силу только в процессе текущего сеанса работы, то есть при выходе из MATLAB-а ее действие аннулируется и вос-станавливается стандартное представление данных.
Примеры форматов данных. Ниже даны несколько примеров различных форматов двумер-ного вектора
x = [4/3 1.2345e–6]
формат short e
1.3333e+000 1.2345e–006
формат short
1.3333 0.0000
формат +
++
Полное описание допустимых форматов дается в справках (Help) по данной функции. Допол-нительные возможности контроля вывода дают функции sprintf и fprintf .
Выбор интервала между строками. Воспользовавшись опцией Preferences в меню File мо-жно также контролировать промежуток между строками. Команда format compact подавля-ет пустые строки, что дает возможность обозрения большего количества информации в ко- мандном окне. Для возврата к пустым строкам, которые облегчают чтение и восприятие ин-формации на экране, нужно воспользоваться командой format loose.
12. Распечатка содержания командного окна
Для распечатки содержания всего командного окна следует выбрать Print из меню File. Для распечатки только части текста нужно сперва выделить эту часть, и затем выбрать Print Selection в том же меню File.
13. Выполнение программ
Выполнение М-файлов. Для выполнения М-файлов, т.е. файлов которые содержат про-граммы на языке MATLAB, следует воспользоваться процедурой, совершенно аналогичной процедуре выполнения любой другой стандартной функции MATLAB-а, т.е. необходимо напечатать имя М-файла в командном окне и нажать Enter. Для вывода на экран каждой функции в М-файле по мере ее исполнения можно использовать команду echo, т.е. при вводе этой команды MATLAB будет последовательно выводить на экран каждую функцию в ис-полняемом М-файле.
Прерывание выполнения программы. Вы можете прервать выполнение программы путем нажатия Ctrl+c или Ctrl+Break в любое время.
Выполнение внешних программ. Восклицательный знак ! означает выход из оболочки MATLAB-а и передачу оставшейся части командной строки операционной системе. Данное свойство может быть полезным для вызова утилит или других программ без выхода из систе-мы MATLAB. После выполнения утилит, операционная система возвращает управление сис- теме MATLAB.
Открытие М-файла в окне Редактора/Отладчика. Для открытия М-файла следует выде-лить имя файла или функции в командном окне и затем, вызвав контекстное меню нажатием правой кнопки мыши, выбрать опцию Open Selection . Соответствующий М-файл будет открыт в окне Редактора/Отладчика (Editor/Debugger).
Анализ ошибок. Если при выполнении М-файла появляется сообщение об ошибке, то нужно подвести курсор к данному сообщению и нажать клавишу Enter. Произойдет открытие «нехорошего» M-файла в окне Редактора (Editor), причем файл будет «прокручен» до стро-ки, содержащей ошибку.
Сохранение сеанса работы. Для сохранения в памяти сеанса работы в системе MATLAB предусмотрена специальная функция diary (Дневник). Эта команда создает копию вашего сеанса работы в специальном файле на диске, включая все команды ввода и отклики системы MATLAB, но исключая графики. Вы можете затем просматривать и редактировать получен-ный текстовой файл используя любой текстовой редактор. Например, для создания на вашем диске файла, названного допустим sept23 («23 сентября»), который содержал бы все введен-ные вами в этот день функции и отклики системы MATLAB, следует ввестив командное окно функцию diary('sept23.out'). Для прекращения записи сеанса вводится : diary('off')
Примечание. В окне Command History (История Команд) содержится запись всех функций, выполненных в текущем и предыдущий сеансах.
Получение справок (Getting Help)
Система MATLAB обеспечивает исключительно широкие возможности для получения справок по всем командам и функциям. Однако, к сожалению, все это доступно только на ан-глийском языке и поэтому их использование может вызвать определенные затруднения у не-подготовленного потребителя. Среди важных и полезных команд, которые обеспечивают быстрый доступ к справкам можно выделить три: help, helpwin и lookfor.
1. HELP. Оперативная справка, отображающая текст в командном окне.
Команда help, сама по себе, выводит на экран (в командную строку) все тематические направления системы MATLAB. Каждое тематическое направление соответствует имени определенного каталога (директории) в MATLAB-е (см. Приложение 1).
Команда help(‘topic’) или help topic , где topic есть определенная директория (например, matlab\polyfun), выводит список всех функций в данном каталоге.
Команда help fun, где fun – имя функции, выводит на экран справку по данной функции, как она записана в соответствующем М-файле.
2. HELPWIN. Обеспечивает те же функции, что и help, но справка выводится в Окно Просмотра Помощи (Help Browser) (см. рис. 1).
3. LOOKFOR. Осуществляет поиск в первой строке комментариев по всем М-файлам по заданному ключевому слову. Так, например, lookfor XYZ осуществляет поиск слова XYZ в первой строке текста справки (HELP text) во всех М-файлах на так называемом пути доступа MATLAB (MATLABPATH). Для всех файлов где встречается это слово, команда lookfor выводит на экран названия файлов и первые строки комментариев.
Рабочее пространство системы MATLAB
Рабочее пространство (workspace) MATLAB-а состоит из множества переменных (назы-ваемых массивами (array), созданных во время сеанса работы системы MATLAB и запом-ненных в памяти. Можно добавлять новые переменные в рабочее пространство путем ис-пользования функций, выполняющих М-файлы, загрузкой запомненных ранее рабочих про-странств, или же путем непосредственного ввода переменных. Так, например, если вы напе-чатаете в командном окне:
t = 0 : pi/4 : 2*pi; y = sin(t); z = 5;
то рабочее пространство будет содержать две переменные y и t, каждая из которых имеет девять значений, и одну скалярную переменную z.
.
Окно Просмотра Рабочего Пространства (Workspace Browser )
Для выполнения операций просмотра и изменения содержимого рабочего пространства удобно использовать Окно Просмотра Рабочего Пространства (ОПРП), хотя многие исполь-зуемые им функции также доступны и из командной строки, путем применения соответ-ствующих команд. Для открытия ОПРП следует проделать одно из следующих действий:
• В Окне Запуска (Launch Pad) нажать дважды на Workspace.
• Ввести команду workspace из командной строки MATLAB-а.
При этом получаем следующее окно (для некоторого конкретного набора переменных):
Просмотр текущего рабочего пространства. ОПРП показывает имя каждой переменной, размерность ее массива, размер в байтах и ее класс. Иконка в поле Name перед именем каж-дой переменной указывает на ее класс (классы переменных будут рассмотрены позднее).
Эквивалентные функции ! Команда who выводит в командное окно список всех перемен-ных текущего рабочего пространства. Команда whos добавляет к списку переменных также информацию об их размерах и классе. Например, при вводе who система MATLAB отвечает:
Your variables are (вашими переменными являются):
а при вводе whos имеем:
Name Size Bytes Class
A 4x4 128 double array
M 8x1 2368 cell array
S 1x1 398 struct array
v 5x9 90 char array
Grand total is 286 elements using 2984 bytes
где в последней строке указано общее число элементов и количество используемых байтов, и присутствуют следующие классы : double array – массив чисел удвоенной точности, cell array – массив ячеек, struct array – массив структур, char array – массив символов.
Сохранение текущего рабочего пространства. Рабочее пространство не сохраняется между отдельными сеансами работы системы MATLAB. Когда вы выходите из MATLAB-а, его рабочее пространство очищается. Вы можете сохранить все или часть переменных текущего рабочего пространства в так называемых MAT-файлах (MAT-file), которые являются специ-альными бинарными (двоичными) файлами данных. В дальнейшем вы можете загрузить запомненные MAT-файлы, как в течении того же сеанса, так и в последующих сеансах, для повторного использования запомненных переменных.
Сохранение всех переменных. Для сохранения всех переменных рабочего простанства с ис-пользованием ОПРП следует:
1. Из меню File или контекстного меню выбрать Save Workspace As, или щелкнуть мышью по кнопке инструментальной линейки ОПРП. Откроется диалоговое окно Save.
2. Задать местоположение и имя файла (File name). MATLAB автоматически добавит расширение .mat .
3. Щелкнуть Save.
Переменные рабочего простанства при этом запомнятся в MAT-файле с выбранным вами именем.
Сохранение части переменных. Для этого надо:
1. Выбрать переменную в ОПРП. Для выбора нескольких переменных следует использо-вать клавиши Shift или Ctrl.
1. Вызвать щелчком правой кнопки контекстное меню и выбрать Save Selection As. Дальнейшие действия описаны выше.
Эквивалентные функции ! Для сохранения переменных рабочего пространства можно ис-пользовать команду save с указанием имени файла куда вы хотите запомнить данные. Напри-мер, команда save('june10') запоминает все переменные рабочего пространства в бинарном файле june10.mat. Если вы не задаете имя файла, рабочее простанство запоминается в специ- альном файле под названием matlab.mat в текущей рабочей директории. Вы можете задать какие переменные сохранять, а также формат запоминания данных, например ascii. Так, ко-манда save 'june10' X Y сохраняет в названном файле только переменные X Y .
Загрузка запомненного рабочего пространства. Для загрузки предварительно запомненно-нго рабочего пространства следует:
1. Щелкнуть на кнопку загрузки данных на инструментальной линейке ОПРП, или щел-кнуть правой кнопкой на ОПРП и выбрать в контекстном меню опцию Import Data. Откро-ется диалоговое окно Open (Открыть).
2. Выбрать MAT-файл, который вы хотите загрузить и щелкнуть Open. Переменные и их значения, запомненные ранее в данном MAT-файле, будут загружены в текущее рабочее пространство системы MATLAB.
Эквивалентные функции ! Функция load предназначена для загрузки запомненного рабо-чего пространства. Например, команда load('june10') загружает в рабочее пространство все переменные из файла june10.mat.
Примечание. Если в сохраненном MAT-файле june10 содержатся переменные обозначен-ные A, B, и C, то загрузка june10 помещает эти переменные в рабочее пространство. Если переменные с этими именами уже существуют в рабочем пространстве, то они заменяются новыми переменными из june10.
Очистка переменных рабочего пространства. С помощью ОПРП вы можете удалить лю-бые переменные из рабочего пространства. Для этого нужно:
1. Выбрать переменную в ОПРП (или несколько перменных с использованием клавиш Shift или Ctrl). Для выбора всех переменых нужно выбрать опцию Select All из меню Edit или контекстного меню.
2. Выполнить любое из перечисленных действий:
- Нажать клавишу Delete.
- Выбрать опцию Delete из меню Edit.
- Щелкнуть по кнопке на инструментальной панели ОПРП.
- Выбрать опцию Delete Selection из контекстного меню.
3. Если появиться диалоговое окно подтверждения, щелкнуть Yes.
Для удаления сразу всех переменных нужно выбрать опцию Clear Workspace из меню Edit или контекстного меню ОПРП.
Эквивалентная функция ! Функция clear выполняет те же функции. Например, команда
clear A M
удаляет переменные A и M из рабочего пространства, а команда clear без обозначения аргу-ментов удаляет все переменные. Наконец, команда clear all удаляет все переменные и функ- ции, т.е. полностью очищает рабочее пространство системы MATLAB
Просмотр основного (Base) рабочего пространства и рабочего пространства функций с использованием стека (Stack). При выполнении М-файлов MATLAB назначает (выделяет) каждому файлу (функции) свое собственное рабочее пространство, которое называется рабо-чим пространством функции и не совпадает с основными рабочим пространством системы MATLAB. При редактировании исполняемых файлов вы можете переходить из основного рабочего пространства в рабочее пространство любой исполняемой функции при помощи поля Stack в ОПРП. Данное поле активизируется только в режиме отладки (более подробно эта возможность будет расмотрена в дальнейшем).
Построение графиков переменных. Вы можете построить график любой переменной из рабочего пространства. Для этого надо щелкнуть правой кнопкой мыши на переменную в ОПРП, которую вы хотите отобразить графически, и из появившегося контекстного меню выбрать опцию Graph Selection и далее выбрать тип графика, который вы хотите построить. Соответствующий график появится в открывшемся специальном окне представления гра-фической информации (figure window). В дальнешем для краткости эти окна буде называть графическими окнами.
редактора Array Editor
Редактор Массива Данных (РМД) Array Editor предназначен для визуального просмотра и редактирования одно- и двумерных числовых массивов, символьных строк и ячеек сим-вольных строк.
Открытие РМД. Для вызова РМД из ОПРП следует:
1. Выделить в ОПРП желаемую переменную или переменные обычным образом.
2. Щелкнуть по кнопке в инструментальной линейке ОПРП или выбрать из контекст-ного меню опцию Open Selection . В случае одной перменной можно также ограничиться двойным щелчком по выбранной переменной.
В результате появится следующее окно:
Изменение значений Изменение формата
элементов массива представления данных Изменение размерностей массива
Выбор различных переменных для просмотра
Рис.4. Общий вид окна Редактора Массива Данных
Повторение перечисленных выше шагов приведет к открытию дополнительных переменных в РМД. Доступ к каждой переменной осуществляется через ярлыки внизу окна РМД (см. рис. 4) или посредством меню Window.
Эквивалнтная функция ! Для просмотра содержания переменной рабочего пространства достаточно напечатать ее имя в командной строке. Так, например, при вводе в командной строке переменной m (см. рис. 4) , MATLAB ответит
m =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
Для открытия РМД с требуемой переменной из командной строки MATLAB-а, можно вос-пользоваться функцией openvar с соответствующей переменной в качестве аргумента. На-пример, при вводе openvar('m') MATLAB откроет РМД с переменной m.
Изменение значений элементов в РМД. Для изменения значений элементов в РМД нужно щелкнуть на ту ячейку таблицы, которую вы хотите изменить. Далее следует ввести новое значение элемента и нажать Enter или щелкнуть по другой ячейке; произойдет соответству-ющее изменение. Для изменения размерностей массива, следует напечатать новые значения для числа строк и столбцов в поле Size. Если вы увеличиваете размер, то новые строки и столбцы добавятся к концу таблицы и будут заполнены нулями. При уменьшении размера вы потеряете данные - MATLAB просто удалит последние строки и столбцы.
Пути доступа системы MATLAB
При поиске М-файлов или других файлов, хранящихся в вашей файловой структуре, MATLAB использует концепцию путей доступа (search path). Любой файл (функция), кото-рый вы хотите исполнить в системе MATLAB должен находится в директории, находящей-ся на путях доступа или в текущей директории. По умолчанию, все файлы поставляемые с MATLAB и соответствующими пакетами прикладных программ фирмы MathWorks вклю-чены в пути доступа. Если вы создаете какой-либо файл, предназначенный для использова-ния системой MATLAB, необходимо включить директорию, содержащую этот файл, в пути доступа системы MATLAB.
Внимание ! Если вы создаете свой собственный М-файл или модифицируете любой имею-щийся М-файл, поставленный с системой MATLAB, сохраняйте их в директории, которая не находится на пути $matlabroot/toolbox/matlab, где $matlabroot – корневая директория системы MATLAB на вашем компьютере. Если вы храните какие-либо свои файлы в дирек-тории $matlabroot/toolbox/matlab, они будут уничтожены при переустановке или установке новой версии MATLAB-а на вашем компьютере.
Суть концепции путей доступа. Все используемые вами файлы рассматриваются как нахо-дящиеся на путях доступа системы MATLAB. Когда вы включаете новую директорию в пути доступа, вы добавляете ее к имеющимся путям. Поддиректории (subdirectories) должны быть добавлены в пути доступа явным образом; они не включаются в пути доступа автоматически, при включении их родительских директорий. Пути доступа системы MATLAB хранятся в файле pathdef.m. Порядок расположения директорий на путях доступа имеет существенное значение. Система MATLAB ищет любой объект (переменную, функцию и т.д.), например, названный foo, следующим образом. Если вы вводите foo в командной строке, то система MATLAB выполняет следующие действия:
1. Ищет foo как переменную.
2. Проверяет, не является ли foo встроенной функцией.
3. Ищет в текущей директории файл названный foo.m.
4. Ищет по очереди во всех директориях на пути доступа MATLAB файл foo.m.
Хотя в действительности схема поиска является более сложной, эта упрощенная схема явля-ется достаточно точной для обычных М-файлов, с которыми имеет дело потребитель.
Порядок расположения директорий на путях доступа важен именно потому, что могут быть несколько файлов, имеющих одинаковое имя. Когда MATLAB ищет такую функцию, он вы-бирает только первую функцию, встретившуюся на путях доступа; остальные функции (фай-лы) оказываются в тени и не могут быть выполнены. Для того чтобы узнать какая функция выполняется, т.е. местоположение данной функции в файловой структуре, можно использо-вать команду which FileName, где FileName – имя выбранной функции.
Просмотр и изменение путей доступа. Для просмотра и изменения путей доступа системы MATLAB предусмотрено диалоговое окно Set Path, а также ряд эквивалентных команд (фу-нкций), которые можно выполнить из командной строки. Для открытия указанного окна ну-жно выбрать опцию Set Path из меню File рабочего стола, или ввести команду pathtool из командной строки MATLAB –а. Откроется следующее диалоговое окно
При нажатии на эти кнопки происходят изменения
в путях доступа текущего сеанса, но эти пути доступа
не сохраняются автоматически дл будущих сеансов
Кнопки для изменения
путей доступа Директории текущих путей доступа системы MATLAB
Нажатие кнопки приводит к сохранению изменений для будущих сеансов работы
Рис. 5. Диалоговой окно Set Path для модификации путей доступа
На рис. 5 имеем следующие кнопки:
Add with Subfolders… - Добавить директорию с поддиректориями.
Move to Top - Перенести директорию в начало пути.
Move Up - Перенести директорию на один шаг вверх.
Remove - Удалить директорию.
Move Down - Перенести директорию на один шаг вниз.
Move to Bottom - Перенести директорию в конец пути.
Default - Восстановить исходные пути доступа (по умолчанию).
Назначение данных кнопок ясно из их названий.
При операциях над файлами система MATLAB использует текущую директорию в качестве отправной точки. Любой файл, который вы хотите исполнить, должен находиться или в теку-щей директории (каталоге) или на пути доступа системы MATLAB. Аналогично, если вы хотите открыть какой-либо файл, начальной точкой диалогового окна Оpen всегда является текущая директория.
Поле текущей директории. Быстрый путь просмотра или изменения текущей директории состоит в использовании поля Current Directory (Текущая Директория) в инструментальной панели рабочего стола
Для изменения текущей директории из этого поля, нужно выполнить одно из следующих действий:
• Впечатать в данное поле путь к новой текущей директории.
• Щелкнуть на правой кнопке со стрелкой, что откроет список ранее использованных рабо-чих директорий, и выбрать из них желаемую.
• Щелкнуть на кнопку (...) (см. рис. 2) для выбора новой директории.
Окно Просмотра Текущего Каталога (Current Directory Browser) . Для поиска, просмот-ра, открывания и ввода изменений в директориях системы MATLAB можно воспользоваться Окном Просмотра Текущего Каталога (ОПТК). Все основные функции данного окна можно также выполнить задавая соответствующие команды из командной строки системы MATLAB. Если ОПТК не присутствует в рабочем столе MATLAB-а, то его можно открыть выбором опции Current Directory в меню View, или же введя команду filebrowser из коман-дного окна (Command Window). При этом появится следующее окно
Данное поле позволяет произвести быстрый
просмотр и изменение директорий
Щелкнув по кнопке «бинокль» можно исследовать содержимое
любого М-файла (операция поиска по заданным символам)
Рис. 6. Окно просмотра текущего каталога
Двойной щелчок по любому выделенному файлу откроет его содержание в соответствующем окне Редактора/Отладчика. В нижней части ОПТК (см. рис. 6) показана часть справки (help) для выделенного файла.
Изменение текущей директории и просмотр ее содержания в ОПТК. Для изменения теку-щей директории из ОПТК можно воспользоваться полем Current Directory этого окна, со-вершенно аналогично тому, как это было описано выше.
Эквивалентные функции ! Команда dir выводит в командное окно все содержимое теку-щей директории или любой другой директории, заданной как аргумент функции dir. Кома-нда what действует аналогично, но выводит только те файлы, которые относятся к системе MATLAB. Команда which FileName, где FileName – имя файла, выводит путь доступа к данному файлу.
ОПТК позволяет также произвести любые добавление директорий к путям доступа системы MATLAB, а также создавать, копировать, переименовывать директории и т.д. (см. Руковод-ство Пользователя).
Поиск и замена содержимого файлов. Из ОПТК можно осуществить поиск любой заданной строки символов в содержании файла. Если же файл открыт в окне Редактора/Отладчика, то можно также и заменить заданную строку на другую.
Поиск заданной строки в пределах файла (файлов). Для поиска заданной строки следует:
1. Щелкнуть по кнопке инструментальной панели ОПТК (рис. 6). Появится следующее диалоговое окно «Найти и Заменить» (Find & Replace):
2. Для нахождения всех случаев наличия требуемой строки в файлах следует:
- Впечатать строку в поле Find what.
- Выбрать директорию поиска в поле Look in, или просто непосредственно напечатать имя директории в данном поле.
- Ограничить поиск выбором опций Match case (Учитывать регистр) и Whole word (Слово целиком).
- Выбрать опцию Subdirectories (Поддиректории), если вы хотите также просматривать и файлы в поддиректориях.
3. Щелкнуть по кнопке Find.
Результат поиска при этом будет отображен в нижней части далогового окна Find & Replace как это показано на следующем рисунке. Этот результат включает название файла, номер со- ответствующей строки и содержимое данной строки.
Двойной щелчок по файлу приведет к
его открытию
Кнопка закрытия окна
Результаты предыдущих операций поиска результатов поиска
доступны через эти ярлыки
4. Для открытия любого из М-файлов в списке результатов поиска нужно выполнить одно из нижеприведенных действий:
- Дважды щелкнуть по файлу.
- Выделить файл и нажать клавишу Enter.
- Щелкнуть правой кнопкой по файлу и выбрать опцию Open из контекстного меню.
Соответсвующий файл будет открыт в Редакторе/Отладчике, причем он будет «прокручен» до той строки, которая содержит результат поиска.
5. Если вы до того проводили другой поиск (поиски), то все результаты предыдущих поисков будут доступны через «ярлыки» внизу текущего списка результатов поиска (см. рис.).
Замена заданной строки в пределах файла. После поиска заданной строки в пределах фай-ла, вы можете автоматически заменить эту строку на любую другую. Для этого надо:
1. Открыть М-файл в окне Редактора/Отладчика системы MATLAB Editor. При этом нужно убедиться, что данный файл является текущим в окне Редактора/Отладчика.
2. Выбрать в поле Look in в диалоговом окне Find & Replace имя того файла, в котором вы хотите заменить строку. Кнопка Replace (Заменить) при этом активизируется.
3. Впечатать в поле Replace with текст, на который вы хотите заменить выбранную строку.
4. Щелкнуть Replace для замены строки символов в выбранной строке файла, или же щелк- нуть по кнопке Replace All, если вы хотите заменить все найденные совпадения в текущем файле.
Текст будет заменен.
5. Для сохранения изменений нужно выбрать опцию Save из меню File в окне Редактора/ От-ладчика.
Команды системы MATLAB это выражения вида load или help. Многие команды допускают модификацию за счет определения операндов, например:
load August17.dat
help magic
type rank.
Альтернативный способ ввода подобных операндов в команды состоит в представлении их в виде символьных строк как аргументы функций.
load('August17.dat')
help('magic')
type('rank')
В этом состоит дуальность команд/функций системы MATLAB. Любая команда в форме
command argument
может также быть записана в функциональной форме
command('argument')
Преимущество функциональной формы записи проявляется когда символьный аргумент формируется машиной программно, из ряда разных кусков. Например, следующий пример загружает в рабочее пространство переменные из 31-го МАТ-файла под названиями August1.dat, August2.dat, и т.д.
for d = 1:31
s = ['August' int2str(d) '.dat']
load(s)
end
Здесь использована функция int2str, которая преобразует целые числа в строку символов, что помогает сконструировать название файла, а также используются квадратные скобки для объединение трех символьных переменных в одно.
Действия над матрицами в системе MATLAB
Матрица является двумерным массивом действительных или комплексных чисел. Линейная алгебра и теория матриц определяют множество операций над матрицами, которые непо-средственно поддерживаются (т.е. выполняются как стандартные операции) в MATLAB-е. В частности, сюда входят все элементарные действия над матрицами, решение систем линей-ных уравнений, нахождение собственных значений и векторов, а также сингулярных чисел и т.д. Ниже кратко рассмотрены действия над матрицами в системе MATLAB.
Формирование матриц в системе MATLAB
В дальнейшем для удобства будем считать термины матрица и массив эквивалентными. Бо-лее точно, матрица есть двумерный прямоугольный массив из действительных или комплек-сных чисел, который характеризует некоторое линейное преобразование. В MATLAB-е име-ется множество встроенных функций, которые формируют (генерируют) различные типы ма-триц. Воспользуемся двумя из них для формирования пары матриц размера 3-by-3, которые будут использоваться в дальнейшем в качестве примеров. Первый пример представляет симметричную матрицу Паскаля. Если ввести команду
A = pascal (3)
то система ответит
A =
1 1 1
1 2 3
1 3 6
Второй пример представляет несимметричную матрицу, известную под названием «волшеб-ный квадрат» (magic square):
B = magic(3)
B =
8 1 6
3 5 7
4 9 2
Еще один пример использования стандартной матрицы представляет собой прямоугольную 3х2 матрицу случайных целых чисел:
C = fix(10*rand(3,2))
C =
9 4
2 8
6 7.
Здесь функция rand(3,2) генерирует 3х2 матрицу равномерно распределенных случайных чисел в диапазоне от 0 до 1, а функция fix осуществляет округление путем отбрасывания дробной части.
Вектор-столбец есть матрица размера mх1 matrix, вектор-строка – матрица размера 1х n , а скаляр есть матрица размера 1х1. Объединение отдельных чисел в массивы осуществляется при помощи квадратных скобок, причем отдельные строки разделяются точкой с запятой, а переменные в каждой строке – запятой или пробелом (число пробелов может быть любым). Выражения
u = [3; 1; 4]
v = [2 0 -1]
s = 7
дают вектор-столбец u , вектор-строку v и скаляр s (эти векторы также будут использоваться в дальнейшем при решении примеров):
u =
3
1
4
v =
2 0 –1
s =
7
Сложение и вычитание матриц определяется как и для массивов, то есть поэлементно. Эти операции требуют чтобы обе матрицы имели одинаковую размерность, или одна из них была скаляром (в последнем случае MATLAB прибавляет (или вычитывает) данный скаляр из всех элементов матрицы). Если размерности матриц не совпадают, в командное окно выдается со-общение об ошибке (красным цветом)
Error using ==> +
Matrix dimensions must agree.
Вектор-строка и вектор-столбец могут быть перемножены в любом порядке (оператор умно-жения * расположен на верхнем регистре клавиши с цифрой 8). Результатом будет или ска-ляр (внутреннее произведение) или матрица (внешнее произведение). Для приведенных выше векторов v и u имеем :
x = v*u
x =
2
X = u*v
6 0 -3
2 0 -1
8 0 -4
Для действительных матриц, операция транспонирования меняет взаимное местоположение элементов aij aji, симметричных относительно главной диагонали. Для обозначения транс-понирования MATLAB использует одиночную кавычку (апостроф) (‘). Для нашей симметри-чной матрицы Паскаля A’ = A. Однако матрица В не является симметричной и поэтому:
X =
8 3 4
1 5 9
6 7 2
Транспонирование превращает вектор-строку в вектор-столбец и наоборот. Если x и y оба яв-ляются действительными векторами, то произведение x*y не определено, но оба произве-дения x'*y и y'*x дают один и тот же скаляр. Это соотношение используется так часто, что имеет три различных имени: скалярное произведение, внутреннее произведение и точечное произведение.
Для комплексного вектора или матрицы, z, величина z' обозначет комплексно-сопряженное транспонирование. В MATLAB-е предусмотрены также поэлементные операции над элеме-нтами массивов. Признаком поэлементных операций служит точка после обозначения пере-менной. Так, транспонирование элементов матрицы z как массива чисел обозначается z.', по аналогии с другими операциями на массивами чисел. Например, если
z = [1+2i 3+4i]
то
z' =
1-2i
3-4i
тогда как z.' есть
z.' =
1+2i
3+4i
Для комплексных векторов, два скалярных произведения x'*y и y'*x комплексно сопряжены, а скалярное произведение x'*x комплексного вектора с самим собой есть действительное число.
Для произведения двух совместимых А и В матриц в MATLAB–е достаточно записать в ко-мандной строке С = А*В . MATLAB самостоятельно проверит совместимость размерностей матриц и выдаст результат. Если матрицы несовместимы, выдается сообщение об ошибке:
Error using ==> *
Inner matrix dimensions must agree.
Индексирование (Subscripts)
Для краткого рассмотрения некоторых основных понятий, связанных с индексированием дву-мерных массивов (матриц), введем «волшебную» матрицу 4-го порядка:
F = magic(4)
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
Элемент в i-ой строке и j-ом столбце матрицы F обозначается через F (i,j). Например, F (4,2) есть число в четвертой строке и втором столбце. Для нашего волшебного квадрата, F(4,2) есть 14. Таким образом, можно вычислить сумму элементов четвертого столбца матрицы F, напечатав
F (1,4) + F (2,4) + F (3,4) + F (4,4)
Это дает ответ
ans =
34
но, как мы увидим в дальнейшем, не является самым элегантным способом суммирования элементов одного столбца.
Имеется также возможность обращения к элементам матрицы при помощи одного индекса, F(k). Это обычный способ обращения к элементам векторов (строк или столбцов). Но в MATLAB-е такой способ индексирования можно применить и к двумерным (в общем случае – многомерным) матрицам, так как система MATLAB хранит все многомерные массивы чи-сел в виде одного длинного вектора-столбца, сформированного из столбцов исходной матри-цы. Так, для нашего волшебного квадрата, F (8) есть другой способ обращения к начени 14 хранящемуся в F (4,2).
Если вы попытаетесь использовать элемент, находящийся вне размеров матрицы, это приве-дет к сообщению об ошибке
t = F (4,5)
(Индекс превышает размерность матрицы)
С другой стороны, если вы попытаетесь запомнить какое-либо число вне размеров матрицы, размер будет соответствующим образом увеличен увеличен, чтобы принять новое значение.
X = A;
X(4,5) = 17
X =
16 3 2 13 0
5 0 11 8 0
9 6 7 12 0
4 15 14 1 17
Двоеточие, : , является одним из наиболее важных операторов MATLAB-а. Оно встречается в нескольких разных формах. Выражение 1:10 есть вектор-строка, содержащий целвые числа от 1 до 10:
1 2 3 4 5 6 7 8 9 10
Чтобы получить неединичное приращение, нужно задать приращение. Например,
100 : -7 : 50
есть
100 93 86 79 72 65 58 51
а
0 : pi/4 : pi
есть
0 0.7854 1.5708 2.3562 3.1416
Индексы, содержащие двоеточия, допускают обращение к частям матриц. Так, выражение
F (1:k, j)
дает первые k элементов j-го столбца матрицы F. То есть,
sum(F (1:4, 4))
вычисляет, как и в примере выше, сумму элементов 4-го столбца. Но есть еще лучший путь. Двоеточие само по себе означает обращение ко всем элементам строки или столбца матрицы, а зарезервированное слово end есть обращение к последним строке или столбцу матрицы (в случае векторов-строк или столбцов слово end есть обращение к последнему элементу векто-ра). Значит,
sum(F (:, end))
вычисляет сумму элементов последнего столбца матрицы F . Ответ: ans = 34. Почему маги-ческая сумма для волшебного квадрата 4 х 4 равна 34 ? Дело в том, что если целые числа от 1 до 16 (число элементов матрицы размера 4 х 4) упорядочены в четыре группы с равными сум-мами элементов, эта сумма должна быть равна
sum(1:16)/4
что, конечно, дает ans = 34.
Единичная матрица, нулевая матрицы и матрица из единиц.
Двумерные массивы случайных чисел
Единичная матрица, то есть матрица имеющая единицы на главной диагонали и нулевые ос-тальные элементы, в MATLAB-е обозначается eye, причем eye(n) есть единичная квадратная матрица размера nxn, eye(m,n) - прямоугольная единичная матрица размера mxn, а eye(size(A)) есть единичная матрица, имеющая размерность матрицы A. Например,
I = eye(3)
I =
1 0 0
0 1 0
0 0 1
I = eye (3,5)
I =
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
I = eye (4,2)
1 0
0 1
0 0
0 0
Нулевая матрица, то есть матрица состоящая из нулей (массив нулей), в MATLAB-е обоз-начается zeros, причем zeros (n) есть нулевая квадратная матрица размера nxn, zeros (m,n) - прямоугольная нулевая матрица размера mxn, а zeros (size(A)) есть нулевая матрица имею-щая размерность матрицы A.
Z = zeros(2,4)
Z =
0 0 0 0
0 0 0 0
Наконец, матрица состоящая из единиц (массив единиц), в MATLAB-е обозначается ones, причем ones (n) есть квадратный массив единиц размера nxn, ones (m,n) – прямоугольный массив единиц размера mxn, а ones (size(A)) есть массив единиц, имеющий размерность матрицы A.
S = 5*ones(3, 3)
S =
5 5 5
5 5 5
5 5 5
Аналогично, функция rand дает возможность сформировать соответствующие массивы слу-чайных чисел в диапазоне от 0 до 1, распределенных по равномерному закону, а функция randn – по нормальному закону.
N = fix(10*rand(1,10))
4 9 4 4 8 5 2 6 8 0
R = randn(4,4)
R =
1.0668 0.2944 -0.6918 -1.4410
0.0593 -1.3362 0.8580 0.5711
-0.0956 0.7143 1.2540 -0.3999
-0.8323 1.6236 -1.5937 0.6900
Одной из важнейших задач в технических приложениях и расчетах является задача решения систем линейных уравнений. В матричных обозначениях, данная задача может быть сформу-лирована следующим образом. При заданных двух матрицах A and B, существует ли такая единственная матрица X, что AX = B или XA = B?
Для наглядности рассмотрим одномерный пример. Имеет ли уравнение
7x = 21
единственное решение? Ответ, разумеется, да. Это уравнение имеет единственное решение x = 3. Решение может быть легко получено обычным делением.
x = 21/7 = 3
Решение при этом обычно не состоит в определении обратной величины от числа 7 (т.е. ве-личины 7-1 = 0.142857…), и последующим умножением числа 7-1 на число 21. Это было бы более трудоемко и, если число 7-1 представлено конечным числом цифр (разрядов), менее точно. Аналогичные рассуждения применимы и к системам линейных алгебраических уравнений с более чем одной неизвестной; MATLAB решает такие уравнения без вычисле-ния обратной матрицы. Хотя это и не является стандартным математическим обозначением, система MATLAB использует терминологию, связанную с обычным делением в одномерном случае, для описания общего случая решения совместной системы нескольких линейных уравнений. Два символа деления / (косая черта (по английски - slash)) и \ (обратная косая че-рта (backslash)) используются в двух случаях, когда неизвестная матрица появляется слева или справа от матрицы коэффициентов:
X = A\B обозначает решение матричного уравнения AX = B
X = B/A обозначает решение матричного уравнения XA = B.
Вы можете представлять себе это как процесс «деления» обеих частей уравнения AX = B или XA = B на A. Матрица коэффициентов A всегда находится в «знаменателе».Условие сов-местимости размерностей для X = A\B требует чтобы две матрицы A и B имели одинаковое число строк. Решение X тогда имеет такое же число столбцов как и B, а число ее строк будет равно числу столбцов A. Для X = B/A, строки и столбцы меняются ролями. На практике, ли-нейные уравнения в виде AX = B встречаются более часто, чем в виде XA = B. Следователь-но, обратная наклонная черта \ используется более часто, чем прямая / . Поэтому, в остав-шейся части данного раздела мы ограничимся рассмотрением оператора \ ; соответствующие свойства оператора / можно вывести из тождества
(B/A)' = (A'\B')
В общем случае не требуется, чтобы матрица коэффициентов A была бы квадратной. Если A имеет размер mхn, то возможны три случая:
числом m ненулевых компонент.
Оператор \ использует различные алгоритмы для решения систем линейных уравнений с раз-ными типами матриц коэффициентов. Различные случаи, которые диагностируются автома-тически по типу матрицы коэффициентов, включают:
• Перестановки треугольных матриц
• Симметричные, положительно определенные матрицы
• Квадратные невырожденные матрицы
• Прямоугольные, переопределенные системы
• Прямоугольные, недоопределенные системы
Наиболее часто встречающейся ситуацией является квадратная матрица коэффициентов A и одномерный вектор-столбец b справа, т.е. Ax = b. Решение x = A\b имеет при этом тот же ра-змер, что и вектор b. Например,
x = A\u
x =
10
-12
5
где матрица А есть приведенная выше матрица Паскаля. Легко удостовериться, что A*x в точности равно вектору u (численные значения этого вектора даны выше).
Если A и B являются квадратными и имеют одинаковый размер, то X = A\B имеет тот же ра-змер, например
X =
19 -3 -1
-17 4 13
6 0 -6
Легко убедиться, что A*X в точности равно B.
Оба этих примера имеют точное решение в виде целых чисел. Это связано с тем, что в каче-стве матрицы коэффициентов была выбрана матрица Паскаля pascal(3), чей детерминант равен единице. Далее будут рассмотрены примеры влияния ошибок округления, возникаю-щих в более реальных системах.
Квадратная матрица A является сингулярной, если ее столбцы не являются линейно незави-симыми. Если A – сингулярна, то решение AX = B или не существует, или не является един-ственным. Оператор \ , A\B, выдает предупреждающее сообщение, если матрица A близка к сингулярной и сообщение об ошибке, если определено равенство нулю детерминанта матри-цы А.
Переопределенные системы совместных линейных уравнений часто встречаются в задачах аппроксимации экспериментальных данных при помощи различных эмпирических кривых. Рассмотрим следующий гипотетический пример. Величина y измеряется при различных зна-чениях времени t, что дает следующие результаты
t y
0.0 0.82
0.3 0.72
0.8 0.63
1.1 0.60
1.6 0.55
2.3 0.50
Эти данные могут быть введены в MATLAB при помощи выражений:
t = [0 .3 .8 1.1 1.6 2.3]';
y = [0.82 0.72 0.63 0.60 0.55 0.50]';
Данные могут быть аппроксимированы при помощи убывающей экспоненциальной функ-ции.
y(t) = c1 + c2 e-t
Это уравнение показывает, что вектор y может быть представлен в виде линейной комбина-ции двух векторов, один из которых является постоянным вектором, содержащим все едини-цы, а второй вектор имеет компоненты e-t. Неизвестные коэффициенты c1 и c2 могут быть найдены подгонкой кривых по методу наименьших квадратов, которая основана на миними-зации суммы квадратов отклонений экспериментальных данных от модели. Мы имеем шесть уравнений с двумя неизвестными, представленными 6х2 матрицей
E = [ones(size(t)) exp(-t)]
E =
1.0000 1.0000
1.0000 0.7408
1.0000 0.4493
1.0000 0.3329
1.0000 0.2019
1.0000 0.1003
Решение методом наименьших квадратов находится при помощи оператора \ :
c = E\y
c =
0.4760
0.3413
Иными словами, подгонка методом наименьших квадратов дает
y(t) = 0.476 + 0.3413 e-t
Следующие выражения оценивают модель при равномерно распределенных моментах време-ни (с шагом 0.1), а затем строят график вместе с результатами экспериментальных данных.
T = (0 : 0.1 : 2.5)';
Y = [ones(size(T)) exp(-T)]*c;
plot(T, Y, '-', t, y, 'o')
Можно видеть, что значения E*c не совсем точно совпадают со значениями эксперименталь-ных данных y, но эти отклонения могут быть сравнимы с ошибками измерений.
Прямоугольная матрица A называется матрицей неполного ранга, если ее столбцы линейно-независимы. Если матрица A имеет неполный ранг, то решение AX = B не является единст-венным. Оператор \ при этом выдает предупреждающее сообщение и определяет основное решение, которое дает минимально возможное число ненулевых решений.
Недоопределенные системы линейных уравнений содержат больше неизвестных чем урав-нений. Когда они сопровождаются дополнительными ограничениями, то становятся сферой изучения линейного программирования. Сам по себе, оператор \ работает только с системой без ограничений. При этом решение никогда не бывает единственным. MATLAB находит ос-новное решение, которое содержит по меньшей мере m ненулевых компонент (где m - число уравнений), но даже это решение может быть не единственным. Ниже приводится пример, где исходные данные генерируются случайным образом.
R = fix (10*rand(2,4))
R =
6 8 7 3
3 5 4 1
b = fix (10*rand(2,1))
b =
1
2
Система уравнений Rx = b содержит два уравнения с четырьмя неизвестными. Поскольку матрица коэффициентов R содержит небольшие по величине целые числа, целесообразно представить решение в формате rational (в виде отношения двух целых чисел). Частное ре-шение представленное в указанном формате есть:
p = R\b
p =
0
5/7
0
-11/7
Одно из ненулевых решений есть p(2), потому что второй столбец матрицы R имеет наи-большую норму. Вторая ненулевая компонента есть p(4) поскольку четвертый столбец матрицы R становится доминирующим после исключение второго столбца (решение нахо-дится методом QR-факторизации с выбором опорного столбца).
Если матрица А является квадратной и невырожденной, уравнения AX = I и XA = I имеют одинаковое решение X. Это решение называется матрицей обратной к A, обозначается через A-1 и вычисляется при помощи функции inv. Понятие детерминанта (определителя) матрицы полезно при теоретических выкладках и некоторых типах символьных вычислений, но его масштабирование и неизбежные ошибки округления делают его не столь привлекательным при числовых вычислениях. Тем не менее, если это требуется, функция det вычисляет определитель квадратной матрицы. Например,
A = pascal (3)
A =
1 1 1
1 2 3
1 3 6
d = det (A)
X = inv (A)
d =
1
X =
3 -3 1
-3 5 -2
1 -2 1
Опять таки, поскольку A является симметричной матрицей целых чисел и имеет единичный определитель, то же самое справедливо и для обратной матрицы. С другой стороны, для
B = magic(3)
B =
8 1 6
3 5 7
4 9 2
d = det(B)
X = inv(B)
d =
-360
X =
0.1472 -0.1444 0.0639
-0.0611 0.0222 0.1056
-0.0194 0.1889 -0.1028
Внимательное изучение элементов матрицы X, или использование формата rational , показы-вает, что они являются целыми числами, разделенными на 360.
Если матрица A является квадратной и несингулярной, то, пренебрегая ошибками округле-ния, выражение X = inv(A)*B теоретически означает то же, что и X = A\B , а Y = B*inv(A) теоретически есть то же, что и Y = B/A. Однако вычисления включающие операторы \ и / более предпочтительны, поскольку требуют меньше рабочего времени, меньшей памяти и имеют лучшие свойства с точки зрения определения ошибок.
Прямоугольные матрицы не имеют детерминантов и обратных матриц. Для таких матриц по крайней мере одно из уравнений AX = I или XA = I не имеет решения. Частично данный про-бел восполняется так называемой псевдообратной матрицей Мура-Пенроуза, или просто псевдообратной матрицей, которая вычисляется при помощи функции pinv. На практике необходимость в этой операции встречается довольно редко. Желающие могут всегда обра-титься к соответствующим справочным пособиям.
Если А есть некоторая квадратная матрица, а р – положительное целое число, то A^p эквива-лентно умножению A на себя р раз.
X =
3 6 10
6 14 25
10 25 46
Отрицательные и дробные степени
Если А является квадратной и невырожденной, то A^(-p) эквивалентно умножению inv(A) на себя p раз.
Y = B^(-3)
Y =
0.0053 -0.0068 0.0018
-0.0034 0.0001 0.0036
-0.0016 0.0070 -0.0051
Дробные степени, например A^(2/3), также допускаются; результаты при этом зависят от ра-спределения собственных значений матрицы А.
Оператор .^ (с точкой !) осуществляет поэлементное возведение в степень. Например,
A =
1 1 1
1 4 9
1 9 36
Для невырожденных квадратных матриц А функция sqrtm вычисляет главное значение квад-ратного корня , т.е. если X = sqrtm(A) , то X*X = A . Буква m в sqrtm означает, что выпол-няется матричная операция. Это отличает данную функцию от sqrt(A), которая, подобно A.^(1/2) (обратите внимание на точку !), выполняет операцию извленчения корня поэлемен-тно.
Система обыкновенных линейных дифференциальных уравнений первого порядка может быть записана в виде
dx/dt = Ax
где x = x(t) есть векторная функция от t, а A есть постоянная матрица не зависящая от t.
Решение данной системы может быть выражено в виде матричной экспоненты.
x(t) = ℮Atx(0)
Функция expm(A) вычисляет матричную экспоненту. Рассмотрим пример системы диффере-нциальных уравнений со следующей 3х3 матрицей коэффициентов
A =
0 -6 -1
6 2 -16
-5 20 -10
и начальными условиями x(0)
x0 = [ 1 1 1]’.
Использование матричной экспоненты для вычисления решения дифференциального уравне-ния в 101 точке с шагом 0.01 на интервале 0 ≤ t ≤ 1 записывается в виде
X = [ ];
for t = 0 : 0.01 : 1
X = [X expm(t*A)*x0];
end
Трехмерный график решения в фазовом пространстве может быть получен при помощи спе-циальной функции
plot3(X(1,:), X(2,:), X(3,:), '-o')
Решение имеет вид спиральной функции сходящейся к началу координат (см. рис. ниже). Та-кое решение обусловлено комплексными собственными значениями матрицы коэффициен-тов А.
Собственным значением и собственным вектором квадратной матрицы А называются ска-ляр λ и вектор v, удовлетворяющие условию
Av = λv
Имея диагональную матрицу Λ, составленную из собственных значений λ матрицы А и мат-рицу V , составленную из соответствующих собственных векторов v, можно записать
Если матрица V несингулярная, на основании данного выражения получаем спектральное разложение матрицы А
А = VΛV-1
Неплохой пример использования спектрального разложения дает рассмотренная выше мат-рица коэффициентов линейного дифференциального уравнения. Ввод выражения
lambda = eig(A)
дает следующий вектор-столбец собственных значений (два из них являются комплексно-сопряженными)
lambda =
-3.0710
-2.4645 + 17.6008i
-2.4645 - 17.6008i
Действительные части всех собственных значения являются отрицательными, что обеспечи-вает устойчивость процессов в системе. Ненулевые мнимые части комплексно-сопряженных собственных значений обуславливают колебательный характер переходных процессов.
При двух выходных аргументах, функция eig вычисляет также собственные векторы и выда-ет собственные значения в виде диагональной матрицы
.
[V,D] = eig(A)
V =
-0.8326 0.2003 - 0.1394i 0.2003 + 0.1394i
-0.3553 -0.2110 - 0.6447i -0.2110 + 0.6447i
-0.4248 -0.6930 -0.6930
D =
-3.0710 0 0
0 -2.4645+17.6008i 0
0 0 -2.4645-17.6008i
Первый собственный вектор (первый столбец матрицы V) является действительным, а два других являются комплексно-сопряженными. Все три вектора являются нормализованными по длине, т.е. их Евклидова норма norm(v,2), равна единице.
Матрица V*D*inv(V), которая в более сжатой форме может быть записана как V*D/V, равна, в пределах погрешностей округления, матрице А. Аналогично, inv(V)*A*V, или V\A*V, рав-на, в пределах погрешностей округления, матрице D.
Некоторые матрицы не имеют спектрального разложения. Такие матрицы называются дефек-тными или не диагонализируемыми. Например, пусть матрица А имеет вид
A =
6 12 19
-9 -20 -33
4 9 15
Для этой матрицы ввод [V, D] = eig(A) дает
V =
-0.4741 -0.4082 -0.4082
0.8127 0.8165 0.8165
-0.3386 -0.4082 -0.4082
D =
-1.0000 0 0
0 1.0000 0
0 0 1.0000
Здесь имеются два положительных единичных кратных собственных значений. Второй и третий столбцы матрицы V являются одинаковыми и поэтому полного набора линейно-неза-висимых собственных векторов не существует (и поэтому не существует обратная матрица V-1).
Сингулярным значением и соответствующими сингулярными векторами прямоугольной ма-трицы A называются скаляр σ и пара векторов u и v такие, что удовлетворяются соотноше-ния
Av = σu
ATu = σv
Имея диагональную матрицу сингулярных чисел Σ и две ортогональные матрицы U и V, сформированные из соответствующих собственных векторов, можно записать
AV = U Σ
ATU = V Σ
Поскольку U и V являются ортогональными матрицами, это можно записать в виде сингуляр-ного разложения
A = U ΣVT
Полное сингулярное разложение матрицы А размера mхn включает mхm матрицу U, mхn матрицу Σ, и nхn матрицу V. Другими словами, обе матрицы U и V являются квадратными , а матрица Σ имеет тот же размер, что и A. Если A имеет намного больше строк чем столб-цов, результирующая матрица U может быть достаточно большой, но большинство ее столб-цов умножаются на нули в Σ . В таких ситуациях может быть использована так называемая экономичная декомпозиция, которая сберегает как время так и память, за счет вывода матри-цы U размера mхn, матрицы Σ размера nхn и той же матрицы V.
Спектральное разложение является подходящим инструментом анализа матрицы, когда пос-ледняя осуществляет преобразование векторного пространства в себя, как это было в рас-смотренном выше примере дифференциальных уравнений. С другой стороны, сингулярное разложение матриц удобно при отображении одного векторного пространства в другое, возможно с иной размерностью. Большинство систем совместных линейных уравнений отно-сятся ко второй категории. Если матрица А является квадратной, симметричной и поло-жительно-определенной, то ее спектральное и сингулярное разложения совпадают. Но при отклонении A от симметричной и положительно-определенной матрицы, разница между двумя разложениями возрастает. В частности, сингулярное разложение действительной мат-рицы всегда действительно, но спектральное разложение действительной несимметричной матрицы может быть и комплексным.
9 4
6 8
2 7
полное сингулярное разложение задается в форме
[U,S,V] = svd(A)
и приводит к следующим результатам
U =
-0.6105 0.7174 0.3355
-0.6646 -0.2336 -0.7098
-0.4308 -0.6563 0.6194
S =
14.9359 0
0 5.1883
0 0
V =
-0.6925 0.7214
-0.7214 -0.6925
Вы можете убедиться, что матрица U*S*V' равна А с точностью до ошибок округления. Для этого примера экономичная декомпозиция дает незначительный эффект.
[U,S,V] = svd(A,0)
U =
-0.6105 0.7174
-0.6646 -0.2336
-0.4308 -0.6563
S =
14.9359 0
0 5.1883
V =
-0.6925 0.7214
-0.7214 -0.6925
Как и в первом случае, матрица U*S*V' равна A с точностью до ошибок округления.
В этом разделе мы ознакомимся с основными функциями MATLAB-а, которые дают возмож-ность осуществлять математические действия с полиномами и производить интерполяцию одно-, двух-, и многомерных данных.
Обзор полиномиальных функций |
|
Функция |
Описание |
conv |
Умножение полиномов. |
deconv |
Деление полиномов. |
poly |
Вычисление характеристического полинома матрицы или определение полинома с заданными корнями. |
polyder |
Вычисление производных от полиномов. |
polyfit |
Аппроксимация данных полиномом. |
polyval |
Вычисление значений полиномов в заданных точках. |
polyvalm |
Вычисление значений матричного полинома. |
residue |
Разложение на простые дроби (вычисление вычетов). |
roots |
Вычисление корней полинома. |
MATLAB представляет полиномы как векторы-строки, содержащие коэффициенты полино-мов по убывающим степеням. Например, рассмотрим следующее уравнение
p(x) = x3 – 2x – 5
Это известный пример Валлиса (Wallis), использованный при первом представлении метода Ньютона во Французкой Академии. Мы будем использовать его в дальнейшем при рассмот-рении примеров использования различных функций. Для ввода данного полинома в MATLAB, следует записать
p = [1 0 -2 -5].
Корни полинома вычисляются при помощи функци roots :
r = roots(p)
r =
2.0946
-1.0473 + 1.1359i
-1.0473 - 1.1359i
MATLAB запоминает вычисленные корни как вектор-столбец. Функция poly выполняет об-ратную роль, то есть по заданным корням полинома вычисляет значения его коэффициентов (обратите внимание на значение второго коэффициента, который в идеале равен нулю).
p2 = poly(r)
p2 =
1 8.8818e-16 -2 -5
Функции poly и roots являются взаимно-обратными функциями, с точностью до упорядоче- ния коэффициентов, масштабирования и ошибок округления.
Характеристические полиномы
Функция poly вычисляет также коэффициенты характеристического полинома матрицы:
A = [1.2 3 -0.9; 5 1.75 6; 9 0 1];
poly(A)
ans =
1.0000 -3.9500 -1.8500 -163.2750
Корни данного полинома, вычисленные при помощи функции roots, являются собственными значениями (характеристическими числами) матрицы А. (При практических расчетах, для вычисления собственных значений матриц целесообразно вычислять их посредством функ-ции eig.)
Функция polyval вычисляет значение полинома в заданных точках. Для вычисления p в точ-ке s = 5, следует записать
polyval(p,5)
ans =
110
Можно также вычислить значение матричного полинома. Так, вместо полинома Валлиса мо-жно записать:
p(X) = X3 - 2X – 5I
где X является квадратной матрицей, а I - единичной матрицей. Например, сформируем сле-дующую квадратную матрицу X
X = [2 4 5; -1 0 3; 7 1 5];
и вычислим значение заданного выше полинома p(X) на данной матрице.
Y = polyvalm(p, X)
377 179 439
111 81 136
490 253 639
Для умножения и деления полиномов предназначены соответственно функции conv и deconv. Рассмотрим полиномы a(s) = s2 + 2s + 3 и b(s) = 4s2 + 5s + 6. Для вычисления их произведения следует ввести
a = [1 2 3]; b = [4 5 6];
c = conv(a,b)
MATLAB возвращает
c =
4 13 28 27 18
Для получения из с полинома b воспользуемся функцией deconv:
[q, r] = deconv(c, a)
q =
4 5 6
r =
0 0 0 0 0
где r – остаток после деления (в данном случае нулевой вектор). В общем случае для поли-номов q, r , c, a в функции deconv справедливо соотношение
c = conv(q, a) + r
Функция polyder вычисляет производную любого полинома. Для получения производной от нашего полинома p = [1 0 -2 -5], введем
q = polyder(p)
q =
3 0 - 2
Функция polyder вычисляет также производные от произведения или частного двух полино-мов. Например, создадим два полинома a и b:
a = [1 3 5]; b = [2 4 6];
Вычислим производную произведения a*b вводом функции polyder с двумя входными аргу-ментами a и b и одним выходным:
c = polyder(a, b)
c =
8 30 56 38
Вычислим производную от частного a/b путем ввода функции polyder с двумя выходными аргументами:
[q, d] = polyder(a, b)
q =
-2 -8 -2
d =
4 16 40 48 36
где отношение двух полиномов q/d является результатом операции дифференцирования.
Функция polyfit находит коэффициенты полинома заданной степени n , который аппрокси-мирует данные (или функцию y(x)) в смысле метода наименьших квадратов:
p = polyfit(x, y, n)
где x и y есть векторы, содержащие данные x и y, которые нужно аппроксимировать полино-мом. Например, рассмотрим совокупность данных x-y, полученную экспериментальным пу-тем
x = [1 2 3 4 5]; y = [5.5 43.1 128 290.7 498.4].
Аппроксимация функциональной зависимости y(x) в виде полинома третьего порядка
p = polyfit(x,y,3)
дает коэффициенты полинома
p =
-0.1917 31.5821 -60.3262 35.3400
Рассчитаем теперь значения полинома, полученного при помощи функции polyfit, на более мелкой шкале (с шагом 0.1) и построим для сравнения графики (это делает функция plot) реальных данных и аппроксимирующей кривой.
x2 = 1 : 0.1 : 5;
y2 = polyval(p, x2);
plot(x, y, 'o', x2, y2); grid on
где функция grid on служит для нанесения координатной сетки, а экспериментальные дан-ные на графике отмечены маркерами о.
.
Как видно из рисунка, полином третьего порядка достаточно хорошо аппроксимирует наши данные.
Функция residue вычисляет вычеты, полюса и многочлен целой части отношения двух поли-номов. Это особенно полезно при представлении систем управления в виде передаточных функций. Для полиномов a(s) и b(s), при отсутствии кратных корней имеем
где r есть вектор-столбец вычетов, p есть вектор-столбец полюсов, а k есть вектор-строка це-лой части дробно-рациональной функции. Рассмотрим передаточную функцию
Для полиномов числителя и знаменателя этой функции имеем:
b = [-4 8]; a = [1 6 8].
Введя
[r, p, k] = residue(b, a)
получим
r =
-12
8
p =
-4
-2
k =
[ ]
Функция residue с тремя входными (r, p, и k) и двумя выходными (b2, a2) аргументами вы-полняет обратную функцию свертки имеющегося разложения на простые дроби, в дробно-рациональную функцию отношения двух полиномов.
[b2, a2] = residue(r, p, k)
b2 =
-4 8
a2 =
1 6 8
т.е. из данных предыдущего примера мы восстановили исходную передаточную функцию.
В случае кратных корней процедура несколько усложняется, но остается разрешимой.
Интерполяция является процессом вычисления (оценки) промежуточных значений функций, которые находятся между известными или заданными точками. Она имеет важное приме-нение в таких областях как теория сигналов, обработка изображений и других. MATLAB обеспечивает ряд интерполяционных методик, которые позволяют находить компромисс ме-жду точностью представления интерполируемых данных и скоростью вычислений и исполь-зуемой памятью.
Обзор функций интерполяции |
|
Функции |
Описание |
griddata |
Двумерная интерполяция на неравномерной сетке. |
griddata3 |
Трехмерная интерполяция на неравномерной сетке. |
griddatan |
Многомерная интерполяция (n >= 3). |
interp1 |
Одномерная табличная интерполяция. |
interp2 |
Двухмерная табличная интерполяция. |
interp3 |
Трехмерная табличная интерполяция. |
interpft |
Одномерная интерполяция с использованием быстрого преобразования Фурье. |
interpn |
Многомерная табличная интерполяция. |
pchip |
Кубическая интерполяция при помощи полинома Эрмита. |
spline |
Интерполяция кубическим сплайном. |
Одномерная интерполяция
Двумя основными типами одномерной интерполяции в MATLAB-е являются полиномиаль-ная интерполяция и интерполяция на основе быстрого преобразования Фурье.
1. Полиномиальная интерполяция
Функция interp1 осуществляет одномерную интерполяцию – важную операцию в области анализа данных и аппроксимации кривых. Эта функция использует полиномиальные методы, аппроксимируя имеющийся массив данных полиномиальными функциями и вычисляя соот-ветствующие функции на заданных (желаемых) точках. В наиболее общей форме эта функ-ция имеет вид
yi = interp1(x, y, xi, method)
где y есть вектор, содержащий значения функции; x – вектор такой же длины, содержащий те точки (значения аргумента), в которых заданы значения y; вектор xi содержит те точки, в ко-торых мы хотим найти значения вектора y путем интерполяции; method – дополнительная строка, задающая метод интерполяции. Имеются следующие возможности для выбора мето-да:
• Ступенчатая интерполяция (method = 'nearest'). Этот метод приравнивает значение функ-ции в интерполируемой точке к ее значению в ближайшей существующей точке имеющихся данных.
• Линейная интерполяция (method = 'linear'). Этот метод аппроксимирует функцию между любыми двумя существующими соседними значениями как линейную функцию, и возвр-ащает соответствующее значение для точки в xi (метод используется по умолчанию).
• Интерполяция кубическими сплайнами (method = 'spline'). Этот метод аппроксимирует ин-терполируемую функцию между любыми двумя соседними значениями при помощи куби-ческих функций, и использует сплайны для осуществления интерполяции.
• Кубическая интерполяция (method = 'pchip' или 'cubic'). Эти методы идентичны. Они ис-пользуют кусочную кубическую Эрмитову аппроксимацию и сохраняют монотонность и форму данных.
Если какой-либо из элементов вектора xi находится вне интервала, заданного вектором x, то выбранный метод интерполяции используется также и для экстраполяции. Как альтернатива,
функция yi = interp1(x, y, xi, method, extrapval) заменяет экстраполированные значения теми, которые заданы вектором extrapval. Для последнего часто используется нечисловое значение NaN.
Все методы работают на неравномерной сетке значений вектора x .
Рассмотрение скорости, требуемой памяти и гладкости методов. При выборе метода ин-терполяции всегда нужно помнить, что некоторые из них требуют большего объема памяти или выполняются быстрее, чем другие. Однако, вам может потребоваться использование лю-бого из этих методов, чтобы достичь нужной степени точности интерполяции (гладкости результатов). При этом нужно исходить из следующих критериев.
• Метод ступенчатой аппроксимации является самым быстрым, однако он дает наихудшие результаты с точки зрения гладкости.
• Линейная интерполяция использует больше памяти чем ступенчатая и требует несколько большего времени исполнения. В отличие от ступенчатой аппроксимации, результирующая функция является непрерывной, но ее наклон меняется в значениях исходной сетки (исход-ных данных).
• Кубическая интерполяция сплайнами требует наибольшего времени исполнения, хотя тре-бует меньших объемов памяти чем кубическая интерполяция. Она дает самый гладкий ре-зультат из всех других методов, однако вы можете получить неожиданные результаты, если входные данные распределены неравномерно и некоторые точки слишком близки.
• Кубическая интерполяция требует большей памяти и времени исполнения чем ступенчатая или линейная. Однако в данном случае как интерполируемые данные, так и их производные являются непрерывными.
Относительные качественные характеристики всех перечисленных методов сохраняются и в случае двух- или многомерной интерполяции.
Функция interpft осуществляет одномерную интерполяцию с использованием быстрого пре-образование Фурье (FFT). Этот метод вычисляет преобразование Фурье от вектора, который содержит значения периодической функции. Затем вычисляется обратное преобразование Фурье с использованием большего числа точек. Функция записывается в форме
y = interpft(x, n)
где x есть вектор, содержащий дискретные значения периодической функции, заданной на равномерной сетке, а n - число равномерно распределенных точек, в которых нужно оценить значения интерполируемой функции.
Двумерная интерполяция
Функция interp2 осуществляет двумерную интерполяцию - важную операцию при обработке изображений и графического представления данных. В наиболее общей форме эта команда имеет вид
ZI = interp2(X, Y, Z, XI, YI, method)
где Z есть прямоугольный массив, содержащий значения двумерной функции; X и Y являют-ся массивами одинаковых размеров, содержащие точки в которых заданы значения двумер-ной функции; XI и YI есть матрицы, содержащие точки интерполяции (то есть промежуточ-ные точки, в которых нужно вычислить значения функции); method – строка, определяющая метод интерполяции. В случае двумерной интерполяции возможны три различных метода:
• Ступенчатая интерполяция (method = 'nearest'). Этот метод дает кусочно-постоянную поверхность на области значений. Значение функции в интерполируемой точке равно значе-нию функции в ближайшей заданной точке.
• Билинейная интерполяция (method = 'linear'). Метод обеспечивает аппроксимацию данных при помощи билинейной поверхности (плоскости) на множестве заданных значений двумер-ной функции. Значение в точке интерполяции является комбинацией значений четырех бли-жайших точек. Данный метод можно считать «кусочно-билинейным»; он быстрее и требует меньше памяти, чем бикубическая интерполяция.
• Бикубическая интерполяция (method = 'cubic'). Данный метод аппроксимирует поверх-ность при помощи бикубических поверхностей. Значение в точке интерполяции является комбинацией значений в шестнадцати ближайших точках. Метод обеспечивает значительно более гладкую поверхность по сравнению с билинейной интерполяцией. Это может быть ключевым преимуществом в приложениях типа обработки изображений. Особенно эффек-тивным данный метод является в ситуациях, когда требуется непрерывность как интерполи-руемых данных, так и их производных.
Все эти методы требуют, чтобы X и Y были монотонными, то есть или всегда возрастающи-ми или всегда убывающими от точки к точке. Эти матрицы следует сформировать с исполь-зованием функции meshgrid, или же, в противном случае, нужно убедиться, что «схема» то-чек имитирует сетку, полученную функцией meshgrid. Перед интерполяцией, каждый из указанных методов автоматически отображает входные данные в равномерно распреде-ленную сетку. Если X и Y уже распределены равномерно, вы можете ускорить вычисления добавляя звездочку к строке метода, например, '*cubic'.
Сравнение методов интерполяции
Приведенный ниже пример сравнивает методы двумерной интерполяции в случае матрицы данных размера 7х7.
[x, y] = meshgrid(-3 : 1 : 3);
z = peaks(x,y);
surf(x,y,z)
где функция meshgrid(-3:1:3) задает сетку на плоскости x и y в виде двумерных массивов размера 7х7; функция peaks(x,y) является двумерной функцией, используемой в MATLAB-е в качестве стандартных примеров, а surf(x,y,z) строит окрашенную параметрическую повер-хность. Соответствующий график показан ниже.
[xi,yi] = meshgrid(-3:0.25:3);
zi1 = interp2(x,y,z,xi,yi,'nearest');
zi2 = interp2(x,y,z,xi,yi,'bilinear');
zi3 = interp2(x,y,z,xi,yi,'bicubic');
Сравним графики поверхностей для различных методов интерполяции.
surf(xi,yi,zi1) surf(xi,yi,zi2) surf(xi,yi,zi3)
Метод ‘nearest’ Метод ‘bilinear’ Метод ‘bicubic’
Интересно также сравнить линии уровней данных поверхностей, построенных при помощи специальной функции contour.
contour(xi,yi,zi1) contour(xi,yi,zi2) contour(xi,yi,zi3)
Метод ‘nearest’ Метод ‘bilinear’ Метод ‘bicubic’
Отметим, что бикубический метод производит обычно более гладкие контуры. Это, однако, не всегда является основной заботой. Для некоторых приложений, таких, например, как об-работка изображений в медицине, метод типа ступенчатой интерполяции может быть более предпочтительным, так как он не «производит» никаких «новых» результатов наблюдений.
В данном разделе будут рассмотрены некоторые основные возможности системы MATLAB в области анализа данных и статистической обработки информации. Помимо базовых функ-ций, в системе MATLAB имеется также ряд специализированных пакетов, предназначенных для решения соответствующих задач в различных приложениях (на английском языке даны названия пакетов) :
регрессия.
Внимание ! MATLAB выполняет обработку данных, записанных в виде двумерных массивов по столбцам ! Одномерные статистические данные обычно хранятся в отдельных векорах, причем n-мерные векторы могут иметь размерность 1х n или nх1. Для многомерных данных матрица является естественным представлением, но здесь имеются две возможности для ориентации данных. По принятому в системе MATLAB соглашению, различные пере-менные должны образовывать столбцы, а соответствующие наблюдения - строки. Поэтому, например, набор данных, состоящий из 24 выборок 3 переменных записывается в виде мат-рицы размера 24х3.
Перечень функций обработки данных, расположенных в директории MATLAB-а datafun приведен в Приложении 8 .
Рассмотрим гипотетический числовой пример, который основан на ежечасном подсчете чис-ла машин, проходящих через три различные пункта в течении 24 часов. Допустим, результа-ты наблюдений дают следующую матрицу count
count =
11 11 9
7 13 11
14 17 20
11 13 9
43 51 69
38 46 76
61 132 186
75 135 180
38 88 115
28 36 55
12 12 14
18 27 30
18 19 29
17 15 18
19 36 48
32 47 10
42 65 92
57 66 151
44 55 90
114 145 257
35 58 68
11 12 15
13 9 15
10 9 7
Таким образом, мы имеем 24 наблюдения трех переменных. Создадим вектор времени, t, со-стоящий из целых чисел от 1 до 24: t = 1 : 24. Построим теперь зависимости столбцов матри-цы counts от времени и надпишем график:
plot(t, count)
legend('Location 1','Location 2','Location 3',0)
xlabel('Time')
ylabel('Vehicle Count')
grid on
где функция plot(t, count) строит зависимости трех векторов-столбцов от времени; функция
legend('Location 1','Location 2','Location 3',0) показывает тип кривых; функции xlabel и ylabel надписывают координатные оси, а grid on выводит координатную сетку. Соответству-ющий график показан ниже.
Применим к матрице count функции max (максимальное значение), mean (среднее значение) и std (стандартное, или среднеквадратическое отклонение).
mx = max(count)
mu = mean(count)
sigma = std(count)
В результате получим
mx =
114 145 257
mu =
32.00 46.5417 65.5833
sigma =
25.3703 41.4057 68.0281
где каждое число в строке ответов есть результат операции вдоль соответствующего столбца матрицы count. Для определения индекса максимального или минимального элемента нужно в соответствующей функции задать второй выходной параметр. Например, ввод
[mx,indx] = min(count)
mx =
7 9 7
indx =
2 23 24
показывает, что наименьшее число машин за час было зарегестрировано в 2 часа для первого пункта наблюдения (первый столбец) и в 23 и 24 чч. для остальных пунктов наблюдения.
Вы можете вычесть среднее значение из каждого столбца данных, используя внешнее произ-ведение вектора, составленного из единиц и вектора mu (вектора средних значений)
e = ones(24, 1)
x = count - e*mu
Перегруппировка данных может помочь вам в оценке всего набора данных. Так, использование в системе MATLAB в качестве единственного индекса матрицы двоеточия, приводит к представлению этой матрицы как одного длинного вектора, составленного из ее столбцов. Поэтому, для нахождения минимального значения всего множества данных можно ввести
min(count(:))
что приводит к результату
ans =
7
Запись count(:) в данном случае привела к перегруппировке матрицы размера 24х3 в вектор-столбец размера 72х1.
Для статистической обработки в MATLAB-е имеются две основные функции для вычисле-ния ковариации и коэффициентов корреляции:
ления (отклонения) наблюдаемой переменной от ее среднего значения. В случае
матриц это также мера линейной зависимости между отдельными переменными,
определяемая недиагональными элементами.
Применим функцию cov к первому столбцу матрицы count
cov(count(:,1))
Результатом будет дисперсия числа машин на первом пункте наблюдения
ans =
643.6522
Для массива данных, функция cov вычисляет матрицу ковариаций. Дисперсии столбцов мас-сива данных при этом расположены на главной диагонали матрицы ковариаций. Остальные элементы матрицы характеризуют ковариацию между столбцами исходного массива. Для матрицы размера mхn, матрица ковариаций имеет размер n-by-n и является симметричной, то есть совпадает с транспонированной.
Функция corrcoef вычисляет матрицу коэффициентов корреляции для массива данных, где каждая строка есть наблюдение, а каждый столбец – переменная. Коэффициент корреляции – это нормализованная мера линейной зависимости между двумя переменными. Для некор-релированных (линейно-независимых) данных коэффициент корреляции равен нулю; экива-лентные данные имеют единичный коэффициент корреляции. Для матрицы mхn, соответст-вующая матрица коэффициентов корреляции имеет размер nхn. Расположение элементов в матрице коэффициентов корреляции аналогично расположению элементов в рассмотренной выше матрице ковариаций. Для нашего примера подсчета количества машин, при вводе
corrcoef(count)
получим
ans =
1.0000 0.9331 0.9599
0.9331 1.0000 0.9553
0.9599 0.9553 1.0000
Очевидно, здесь имеется сильная линейная корреляция между наблюдениями числа машин в трех различных точках, так как результаты довольно близки к единице.
MATLAB предоставляет три функции для вычисления конечных разностей.
Функция |
Описание |
diff |
Разность между двумя последовательными элементами вектора. Приближенное дифференцирование. |
gradient |
Приближенное вычисление градиента функции. |
del2 |
Пятиточечная аппроксимация Лапласиана. |
Функция diff вычисляет разность между последовательными элементами числового вектора, то есть diff(X) есть [X(2) -X(1) X(3) -X(2) ... X(n) -X(n-1)]. Так, для вектора A,
A = [9 -2 3 0 1 5 4];
diff(A)
MATLAB возвращает
ans =
Помимо вычисления первой разности, функция diff является полезной для определения опре-деленных характеристик вектора. Например, вы можете использовать diff для определения, является ли вектор монотонным (значения элементов или всегда возрастают или убывают), или имеет ли он равные приращения и т.д. Следующая таблица описывает несколько различ-ных путей использования функции diff с одномерным вектором x.
Применение (тест) |
Описание |
diff(x) == 0 |
Тест на определение повторяющихся элементов |
all(diff(x) > 0) |
Тест на монотонность |
all(diff(diff(x)) == 0) |
Тест на опредедление равных приращений |
Обработка данных
В данном разделе рассматривается как поступать с:
Специальное обозначение NaN, соответствует в MATLAB-е нечисловое значение. В соответ-ствие с принятыми соглашениями NaN является результатом неопределенных выражений та-ких как 0/0. Надлежащее обращение с отсутствующими данными является сложной пробле-мой и зачастую меняется в различных ситуациях. Для целей анализа данных, часто удобно использовать NaN для представления отсутствующих значений или данных которые недос-тупны. MATLAB обращается со значениями NaN единообразным и строгим образом. Эти значения сохраняются в процессе вычислений вплоть до конечных результатов. Любое мате-матическое действие, производимое над значением NaN, в результате также производит NaN. Например, рассмотрим матрицу, содержащую волшебный квадрат размера 3х3, где це-нтральный элемент установлен равным NaN.
a = magic(3); a(2,2) = NaN;
a =
8 1 6
3 NaN 7
4 9 2
Вычислим сумму элементов всех столбцов матрицы:
sum(a)
ans =
15 NaN 15
Любые математические действия над NaN распространяют NaN вплоть до конечного резуль-тата. Перед проведением любых статистических вычислений вам следует удалить все NaN-ы из имеющихся данных. Вот некоторые возможные пути выполнения данной операции.
Программа |
Описание |
i = find( ~ isnan(x)); x = x(i) |
Найти индексы всех эементов вектора, не равных NaN, и затем сохранить только эти элементы |
x = x (find( ~ isnan(x))) |
Удалить все NaN-ы из вектора |
x = x ( ~ isnan(x)); |
Удалить все NaN-ы из вектора (быстрее). |
x (isnan(x)) = [ ]; |
Удалить все NaN-ы из вектора |
X (any(isnan(X’)), :) = [ ]; |
Удалить все строки матрицы X содержащие NaN-ы |
Внимание. Для нахождения нечисловых значений NaN вам следует использовать специаль-ную функцию isnan, поскольку при принятом в MATLAB-е соглашении, логическое сравне-ние NaN == NaN всегда выдает 0. Вы не можете использовать запись x(x==NaN) = [ ] для удаления NaN-ов из ваших данных.
Если вам часто приходится удалять NaN-ы, воспользуйтесь короткой программой, записан-ной в виде М-файла.
function X = excise(X)
X(any(isnan(X')),:) = [ ];
Тогда. напечатав
X = excise(X);
вы выполните требуемое действие (excise по английски означает вырезать)
Вы можете удалить выбросы значений или несовместимые данные при помощи процедур, весьма схожих с удалением NaN-ов. Для нашей транспортной задачи, с матрицей данных count, средние значения и стандартные (среднеквадратические) отклонения каждого столбца матрицы count равны
mu = mean(count)
sigma = std(count)
mu =
32.0000 46.5417 65.5833
sigma =
25.3703 41.4057 68.0281
Число строк с выбросами значений, превышающими утроенное среднеквадратическое откло-нение от среднего значения можно получить следующим образом:
[n, p] = size(count)
outliers = abs(count - mu(ones(n, 1),:)) > 3*sigma(ones(n, 1),:);
nout = sum(outliers)
nout =
1 0 0
Имеется только один выброс в первом столбце. Удалим все наблюдение при помощи выра-жения
count(any(outliers'),:) = [ ];
Регрессия и подгонка кривых
Часто бывает полезным или необходимым найти функцию, которая описывает взаимосвязь между некоторыми наблюдаемыми (или найденными экспериментально) переменными. Оп-ределение коэффициентов такой функции ведет к решению задачи переопределенной систе-мы линейных уравнений, то есть системы, у которой число уравнений превышает число не-известных. Указанные коэффициенты можно легко найти с использованием оператора обрат-ного деления \ (backslash). Допустим, вы производили измерения переменной y при разных значениях времени t.
t = [0 0.3 0.8 1.1 1.6 2.3]';
y = [0.5 0.82 1.14 1.25 1.35 1.40]';
plot(t,y,'o'); grid on
В следующих разделах мы рассмотрим три способа моделирования (аппроксимации) этих данных:
Основываясь на виде графика, можно допустить, что данные могут быть аппроксимированы полиномиальной функцией второго порядка:
y = a0 + a1t + a2t2
Неизвестные коэффициенты a0 , a1 и a2 могут быть найдены методом среднеквадратичес-кой подгонки (аппроксимации), которая основана на минимизации суммы квадратов отклоне-ний данных от модели. Мы имеем шесть уравнений относительно трех неизвестных,
представляемых следующей матрицей 6х3:
X = [ones(size(t)) t t.^2]
X = 1.0000 0 0
1.0000 0.3000 0.0900
1.0000 0.8000 0.6400
1.0000 1.1000 1.2100
1.0000 1.6000 2.5600
1.0000 2.3000 5.2900
Решение находится при помощи оператора \ :
a = X\y
a =
0.5318
0.9191
- 0.2387
Следовательно, полиномиальная модель второго порядка наших данных будет иметь вид
y = 0.5318 + 0.9191t – 0.2387 t2
Оценим теперь значения модели на равноотстоящих точках (с шагом 0.1) и нанесем кривую на график с исходными данными.
T = (0 : 0.1 : 2.5)';
Y = [ones(size(T)) T T.^2]*a;
plot(T,Y,'-',t,y,'o'); grid on
Очевидно, полиномиальная аппроксимация оказалась не столь удачной. Здесь можно или по-высить порядок аппроксимирующего полинома, или попытаться найти какую-либо другую функциональную зависимость для получения лучшей подгонки.
Линейно-параметрическая регрессия[1]
Вместо полиномиальной функции, можно было-бы попробовать так называемую линейно-параметрическую функцию. В данном случае, рассмотрим экспоненциальную функцию
y = a0 + a1℮-t + a2t℮-t
Здесь также, неизвестные коэффициенты a0 , a1 и a2 могут быть найдены методом наимень-ших квадратов. Составим и решим систему совместных уравнений, сформировав регресси-онную матрицу X, и применив для определения коэффициентов оператор \ :
X = [ones(size(t)) exp(- t) t.*exp(- t)];
a = X\y
a =
1.3974
- 0.8988
0.4097
Значит, наша модель данных имеет вид
y = 1.3974 – 0.8988℮-t + 0.4097t℮-t
Оценим теперь, как и раньше, значения модели на равноотстоящих точках (с шагом 0.1) и на-несем эту кривую на график с исходными данными.
Как видно из данного графика, подгонка здесь намного лучше чем в случае полиномиальной функции второго порядка.
Рассмотренные выше методы аппроксимации данных можно распространить и на случай бо-лее чем одной независимой переменной, за счет перехода к расширенной форме записи. До-пустим, мы измерили величину y для некоторых значений двух параметров x1 и x2 и полу-чили следующие результаты
x1 = [0.2 0.5 0.6 0.8 1.0 1.1]' ;
x2 = [0.1 0.3 0.4 0.9 1.1 1.4]' ;
y = [0.17 0.26 0.28 0.23 0.27 0.24]' ;
Множественную модель данных будем искать в виде
y = a0 + a1x1 + a2x2
Методы множественной регрессии решают задачу определения неизвестных коэффициентов a0 , a1 и a2 путем минимизации среднеквадратической ошибки приближения. Составим сов-местную систему уравнений, сформировав матрицу регрессии X и решив уравнения отно-сительно неизвестных коэффициентов, применяя оператор \ .
X = [ones(size(x1)) x1 x2];
a = X\y
a =
0.1018
0.4844
-0.2847
Следовательно, модель дающая минимальную среднеквадратическую ошибку аппроксима-ции имеет вид
y = 0.1018 + 0.4844x1 – 0.2847x2
Для проверки точности подгонки найдем максимальное значение абсолютного значения от-клонений экспериментальных и расчетных данных.
Y = X*a;
MaxErr = max(abs(Y - y))
MaxErr =
0.0038
Эта ошибка дает основание утверждать, что наша модель достаточно адекватно отражает ре-зультаты наблюдений.
MATLAB дает возможность осуществлять аппроксимацию данных наблюдений при помощи специального графического Интерфейса Подгонки Кривых (ИПК) (в английском оригинале - Basic Fitting interface). Используя данный интерфейс, вы можете легко и быстро решить множество задач подгонки кривых, получая при этом самую разнообразную информацию о результатах вашей подгонки. ИПК предоставляет следующие возможности:
Основываясь на ваших конкретных задачах и приложениях, вы можете использовать ИПК, возможности, предоставляемыми командным окном, или же комбинировать эти две возмож-ности. Отметим, что ИПК предназначен только для работы с одномерными и двумерными данными.
Рассмотрение основных свойств ИПК
Общий вид ИПК показан ниже.
Для его вызова в подобном виде, нужно выполнить следующие три шага:
Рассмотрим основные опции ИПК.
Select data (Выбор данных) – В данном окне расположен список всех переменных, построен-ных на активном графике, с которым связан ИПК (на графике может быть построено неско-лько кривых). Используйте данный список для выбора требуемого (текущего) набора дан-ных. Под текущим подразумевается тот набор данных, для которого вы хотите осуществить подгонку. За один раз вы можете осуществлять действия только с одним набором данных. С другой стороны, вы можете произвести различные подгонки для текущего набора данных за счет изменения названия этих данных. С этой целью можно воспользоваться так называемым Редактором Графиков (Plot Editor), который будет рассмотрен в дальнейшем.
Center and scale X data (Центрирование и масштабирование данных X) – Если данная опция выбрана, то данные центрируются (нуль переносится в среднее значение данных) и масшта-бируются к единичному стандартному отклонению (делятся на исходное стандартное откло-нение). Это может потребоваться для повышения точности последующих математических вычислений. Если подгонка приводит к результатам, которые могут быть неточными, соот-ветствующее предупреждение выводится на экран.
Plot fits (Подгонка кривых) – Эта панель позволяет визуально просмотреть результаты одной или более подгонок текущего набора данных.
Numerical results (Численные результаты) – Данная панель позволяет изучать численные характеристики каждой отдельной подгонки для текущего набора данных, без построения графиков.
Find Y = f(X) – Данная панель дает возможность произвести интерполяцию или экстраполя-цию текущей подгонки.
· Enter value(s) (Введите данные) – Введите любое выражение, совместимое с систе-мой MATLAB для оценки вашей текущей подгонки в промежуточных или выходя-щих за пределы заданных аргументов точек. Выражение будет вычислено после на-жатия кнопки Evaluate (Вычислить), а результаты в табличной форме будут выве-дены в соответствующее окно ниже. Метод текущей подгонки при этом указан в ме-ню Fit.
· Save to workspace (Запомнить в рабочем пространстве) – Вызывает диалоговое окно, которое позволяет запомнить в рабочем пространстве результаты вашей интерполя-ции.
· Plot results (Построить графики) – При выборе данной опции, результаты интерполя-выводятся в графической форме на график данных.
MATLAB имеет спциальные функции для работы с уравнениями в конечных разностях и фи-льтрами. Эти функции работают главным образом с векторами. Векторы используются для хранения дискретных сигналов или последовательностей, а также для обработки сигналов и анализа данных. Для систем со многими входами, каждая строка матрицы соответствует од-ной временной точки выборки сигналов, где каждый вход описывается как один вектор-стол-бец.
Функция
y = filter(b, a, x)
обрабатывает данные в векторе x посредством фильтра, описываемого векторами a и b, вы-давая фильтрованные данные y. Функция filter может рассматриваться как эффективная реа-лизация уравнения в конечных разностях. Структура функции filter является обобщенной структурой фильтра, образованного при помощи линий задержки, который описывается приведенными ниже уравнениями в конечных разностях, где n есть индекс (номер) текущей выборки, na есть порядок полинома, описываемого вектором a , а nb есть порядок полино-ма,описываемого вектором b. Выход y(n) является линейной комбинацией текущего и пре-дыдущих входов, то есть x(n) x(n-1) ..., и предыдущих выходов y(n-1) y(n-2) ...
a(1) y(n) = b(1) x(n) + b(2) x(n-1) + … + b(nb) x(n-nb+1) –
- a(2) y(n-1) - … - a(na) y(n-na+1)
Допустим, например, что мы хотим сгладить данные нашей задачи по движению автомоби-лей при помощи усредняющего фильтра, который выдает среднее количество машин за каж-дые 4 часа. Данный процесс можно выразить при помощи следующего уравнения в конеч-ных разностях:
y(n) = (1/4) x(n) + (1/4) x(n-1) + (1/4) x(n-2) + (1/4) x(n-3)
Соответствующие векторы равны:
a = 1; b = [1/4 1/4 1/4 1/4];
x = count(:, 1);
Усредненные за 4 часа данные могут быть легко вычислены при помощи приведенной выше функции y = filter(b, a, x). Сравним исходные и сглаженные данные, построив их на одном графике.
t = 1:length(x) ;
plot(t, x, '-.', t, y, '-'); grid on
legend('Original Data','Smoothed Data',2)
Исходные данные наблюдения представлены здесь штрих-пунктирной линией, а сглаженные за 4 часа данные – сплошной линией.
Для различных практических приложений, в специальном пакете Signal Processing Toolbox предусмотрены многочисленные функции для анализа сигналов и проектирования дискрет-ных фильтров.
Многомерные массивы в системе MATLAB являются распространением обычных двумерных матриц. Как известно, матрицы имеют две размерности – строки (row) и столбцы (column).
Вы можете выделить любой элемент двумерной матрицы при помощи двух индексов, где первый является индексом (номером) строки, а второй – индексом столбца. Многомерные массивы имеют дополнительную индексацию. Например, трехмерные массивы имеют три индекса:
Для обращения, например, к элементу второй строки и третьего столбца на странице 2 нужно воспользоваться индексацией (2,3,2) (см. рисунок ниже).
Если вы добавляете размерности к массиву, вы также добавляете индексы. Четырехмерный массив, например, имеет 4 индекса. Первые два из них указывают на пару строка-столбец, а следующие два характеризуют третью и четвертую размерности.
Отметиим, что общие функции обращения с многомерными массивами находятся в директории datatypes.
Создание Многомерных Массивов
При создании многомерных массивов можно воспользоваться теми же приемами, которые используются для двумерных матриц.
Создание массивов с использованием индексации
Один из способов формирования многомерного массива состоит в создании двумерного массива и соответствующего его расширения. Например, начнем с простого двумерного массива А.
A = [5 7 8; 0 1 9; 4 3 6];
А является массивом 3х3, то есть его размерности строк и столбцов равны трем. Для добавления третьей размерности к А запишем
A(:,:,2) = [1 0 4; 3 5 6; 9 8 7].
MATLAB выдаст
A(:, : ,1) =
5 7 8
0 1 9
4 3 6
A(:, :, 2) =
1 0 4
3 5 6
9 8 7
Вы можете продолжить добавление строк, столбцов или страниц аналогичным образом.
Расширение Многомерных Массивов. Для расширения любой размерности массива А нужно:
Вы можете воспользоваться свойством скалярного распространения системы MATLAB, совместно с оператором двоеточия, для заполнения всей размерности единственным числом:
A(:, :, 3) = 5;
A(:, :, 3)
ans =
5 5 5
5 5 5
5 5 5
Для превращения А в четырехмерный массив размерности 3х3х3х2 введите
A(:, :, 1, 2) = [1 2 3; 4 5 6; 7 8 9];
A(:, :, 2, 2) = [9 8 7; 6 5 4; 3 2 1];
A(:, :, 3, 2) = [1 0 1; 1 1 0; 0 1 1];
Отметим, что после первых двух вводов MATLAB добавляет в A требуемое количество нулей, чтобы поддержать соответствующие размеры размерностей (речь идет о первом элементе по четвертой размерности, то есть при четвертом индексе равном единице, массив А будет содержать три нулевые матрицы размера 3х3).
Создание масивом с применением функций MATLAB-а.
Вы можете использовать для создания многомерных массивов такие функции MATLAB-а как randn, ones, и zeros, совершенно аналогично способу используемому для двумерных матриц. Каждый вводимый аргумент представляет размер соответствующей размерности в результирующем массиве. Например, для создания массива нормально распределенных случайных чисел размера 4х3х2 следует записать:
B = randn(4,3,2).
Для создания массива, заполненного единственным постоянным значением можно восполь-зоваться функцией repmat. Эта функция копирует массив (в нашем случае массив размера 1х1) вдоль вектора размерностей массива.
B = repmat(5,[3 4 2])
B(:, :, 1) =
5 5 5 5
5 5 5 5
5 5 5 5
B(:, :, 2) =
5 5 5 5
5 5 5 5
5 5 5 5
Внимание! Любая размерность массива может иметь размер 0, что просто дает пустой массив (empty array) . Так, размер 10х0х20 является допустимым размером многомерного массива.
Создание многомерного массива при помощи функции cat.
Функция cat дает простой путь построения многомерных массивов; она объединяет набор массивов вдоль заданной размерности.
B = cat (dim,A1,A2...)
где А1, А2 и т.д. являются объединяемыми массивами. а dim есть размерность, вдоль которой они объединяются. Например, для создания нового массива из двух двумерных матриц при помощи функции cat запишем
B = cat (3, [2 8; 0 5], [1 3; 7 9])
что дает трехмерный массив с двумя страницами
B(:, :, 1) =
2 8
0 5
B(:, :, 2) =
1 3
7 9
Функция cat принимает любые комбинации существующих и новых данных. Более того, вы можете осуществлять вложение данных функций. Приведенные ниже строки, к примеру, формируют четырехмерный массив:
A = cat (3, [9 2; 6 5], [7 1; 8 4])
B = cat (3, [3 5; 0 1], [5 6; 2 1])
D = cat (4, A, B, cat (3, [1 2; 3 4], [4 3; 2 1])).
Функция cat автоматически добавляет, при необходимости, единичные индексы между размерностями. Например, для создания массива размера 2х2х1х2 можно ввести
C = cat (4, [1 2; 4 5], [7 8; 3 2])
В данном случае функция cat вводит нужное число единичных размерностей для создания четырехмерного массива, чья последняя размерность не является единичной. Если бы аргумент dim был бы равен 5, последняя запись привела бы к массиву размера 2х2х1х1х2. Это добавляет еще одну единицу в индексации массива. Для обращения к значению 8 в четырехмерном случае нужно применить следующую индексацию
Индекс единичной размерности
Определение характеристик многомерных массивов.
Для получения информации об имеющихся многомерных массивах можно воспользоваться стандартными командами size (дает размер массива), ndims (дает количество размерностей) и whos (последняя команда дает подробную информацию о всех переменных рабочего пространства системы MATLAB). Для вышеприведенного примера мы получим
size(C)
ans =
2 2 1 2
ndims(C)
ans =
4
Индексация
Многие концепции, используемые в двумерном случае, распространяются также на много-мерные массивы. Для выделения (обращения) к какому-либо одному элементу многомерного массива следует воспользоваться целочисленной индексацией. Каждый индекс указывает на соответствующую размерность: первый индекс на размерность строк, второй индекс на раз-мерность столбцов, третий на первую размерность страниц и так далее. Рассмотрим массив случайных целых чисел nddata размера 10х5х3:
nddata = fix (8*randn (10, 5, 3));
Для обращения к элементу (3,2) на странице 2 массива nddata нужно записать nddata(3,2,2).
Вы можете также использовать векторы как массив индексов. В этом случае каждый элемент вектора должен быть допустимым индексом, то есть должен быть в пределах границ, опре-деленных для размерностей массива. Так, для обращения к элементам (2,1), (2,3), и (2,4) на странице 3 массива nddata, можно записать
nddata (2, [1 3 4], 3).
Оператор двоеточия и индексирование многомерных массивов.
Стандартная индексация MATLAB-а при помощи оператора двоеточия (colon) применима и в случае многомерных массивов. Например, для выбора всего третьего столбца страницы 2 массива nddata используется запись nddata(:, 3, 2). Оператор двоеточия также полезен и для выделения определенных подмножеств данных. Так, ввод nddata(2:3,2:3,1) дает массив (мат-рицу) размера 2х2, который является подмножеством данных на странице 1 массива nddata. Эта матрица состоит из данных второй и третьей строки и сторого и третьего столбца первой стриницы многомерного массива. Оператор двоеточия может использоваться для индексации с обеих сторон записи. Например, для создания массива нулей размера 4х4 записываем:
C = zeros (4,4)
Теперь, чтобы присвоить значения подмножества 2х2 массива nddata четырем элементам в центре массива С запишем
C(2:3,2:3) = nddata (2:3,1:2,2)
Устранение неопределенностей в многомерной индексации
Некоторые выражения, такие как
A(:, :, 2) = 1:10
Являются неоднозначными, поскольку они не обеспечивают достаточного объема информа-ции относительно структуры размерности, в которую вводятся данные. В представленном выше случае, делается попытка задать одномерный вектор в двумерном объекте. В таких ситуациях MATLAB выдает сообщение об ошибке. Для устранения неопреденности, нужно убедиться, что обеспечена достаточная информация о месе записи данных, и что как данные так и место назначения имеют одинаковую форму. Например,
A(1,:,2) = 1:10.
Изменение формы (Reshaping)
Если вы не меняете форму или размер, массивы в системе MATLAB сохраняют размернос-ти, заданные при их создании. Вы можете изменить размер массива путем добавления или удаления элементов. Вы можете также изменить форму массива изменяя размерности строк, столбцов и страниц, при условии сохранения тех же элементов. Функция reshape выполняет указанную операцию. Для многомерных массивов эта функция имеет вид
B = reshape (A, [s1 s2 s3 ...] )
где s1, s2, и так далее характеризуют желаемый размер для каждой размерности преобразо-ванной матрицы. Отметим, что преобразованный массив должен иметь то же число элемен-тов, что и исходный массив (иными словами, произведение размеров массивов должно быть неизменным).
Функция reshape «действует» вдоль столбцов. Она создает преобразованную матрицу путем взятия последовательных элементов вдоль каждого столбца исходной матрицы.
Ниже в качестве примеров приведены несколько примеров массивов, которые могут быть получены из массива nddata (обратите внимание на размерности).
B = reshape(nddata,[6 25])
C = reshape(nddata,[5 3 10])
D = reshape(nddata,[5 3 2 5])
Удаление единичных размерностей.
Система MATLAB создает единичные размерности, когда вы задаете их при создании или преобразовании массива, или же в результате вычислений приводящих к появлению указан-ных размерностей.
B = repmat (5, [2 3 1 4] ) ;
size(B)
ans =
2 3 1 4
Функция squeeze удаляет единичные размерности из массива.
C = squeeze(B);
size(C)
ans =
2 3 4
Функция squeeze не оказывает воздействия на двумерные массивы – векторы-строки оста-ются строками.
Вычисления с многомерными массивами
Многие вычислительные и математические функции MATLAB-а принимают в качестве аргументов многомерные массивы. Эти функции действуют на определенные размерности многомерных массивов, в частности, на отдельные элементы, векторы или матрицы.
Действия над векторами
Функции которые действуют над векторами, такие как sum, mean, и т.д., по умолчанию обы-чно действуют вдоль первой неединичной размерности многомерного массива. Многие из этих функций дают возможность задать размерность вдоль которой они действуют. Однако, есть и исключения. Например, функция cross, которая определяет векторное произведение двух векторов, действует вдоль первой неединичной размерности, имеющей размер 3.
Внимание! Во многих случаях эти функции имеют другие ограничения на входные аргумен-ты – например, некоторые функции, допускающие многомерные входные массивы, требуют чтобы массивы имели одинаковый размер.
Поэлементное воздействие
Те функции MATLAB-а, которые действуют поэлементно на двумерные массивы, такие как тригонометрические и экспоненциальные функции, работают совершенно аналогично и в многомерном случае. Например, функция sin возвращает массив того же размера, что и вход-ной массив. Каждый элемент выходного массива является синусом соответствующего эле-мента входного массива. Аналогично, все арифметические, логические операторы и операторы отношения действуют с соответствующими элементами многомерных массивов (которые должны иметь одинаковые размеры каждой размерности). Если один из операндов является скаляром, а второй – скаляром, то операторы применяют скаляр ко всем элементам массива.
Действия над плоскостями и матрицами
Функции, действующие над плоскостями или матрицами, такие как функции линейной алге-бры или матричные функции в директории matfun , не принимают в качестве аргументов многомерные массивы. Иными словами, вы не можете использовать функции в директории matfun, или операторы *, ^, \, или /, с многомерными массивами. Попытка использования многомерных массивов или операндов в таких случаях приводит к сообщению об ошибке.
Вы можете, тем не менее, применить матричные функции или операторы к матрицам внутри многомерных массивов. Например, сооздадим трехмерный массив А
A = cat (3 , [1 2 3; 9 8 7; 4 6 5], [0 3 2; 8 8 4; 5 3 5], [6 4 7; 6 8 5; 5 4 3]);
Применение функции eig ко всему многомерному массиву дает сообщение об ошибке:
eig(A)
??? Error using è eig
Input arguments must be 2-D.
Вы можете, однако, приментиь функцию eig к отдельным плоскостям в пределах массива. Например, воспользуемся оператором двоеточия для выделения одной страницы (допустим, второй):
eig(A(:, :, 2))
ans =
–2.6260
12.9129
2.7131
Внимание! В первом случае, где не используется оператор двоеточия, для избежания ошиб-ки нужно использовать функцию squeeze. Например, ввод eig (A(2,:,:)) приводит к ошибке так как размер входа есть [1 3 3]. Выражение eig(squeeze(A(2, :, :))), однако, передает функции eig допустимую двумерную матрицу.
Организация данных в многомерных массивах
Вы можете использовать два возможных варианта представления данных при помощи многомерных массивов:
В качестве конкретного примера рассмотрим представление какого-либо изображения в формате RGB. Напомним, что в формате RGB изображение хранится в виде трех двумерных матриц одинакового размера, каждая из которых характеризует интенсивность одного цвета – красного (Red), зеленого (Green) и синего (Blue) - в соответствующей точке. Общая карти-на при этом получается в результате наложения трех указанных матриц. Для отдельного изображения, использование многомерных массивов является, вероятно, наиболее легким путем для запоминания данных и доступа к ним.
Пусть все изображение хранится в файле RGB. Для доступа к полной плоскости изображе-ния в одном цвете, допустим – красном, следует записать
red_plane = RGB (:,:,1);
Для доступа к части всего изображения можно использовать запись
subimage = RGB (20:40, 50:85, :)
Изображение в формате RGB является хорошим примером данных, для которых может пот-ребоваться доступ к отдельным плоскостям, для операций типа фильтрации или просто де-монстрации. В других задачах, однако, сами данные могут быть многомерными. Рассмотри, например, набор температур, измеренных на равномерной пространственной сетке какого-либо помещения.
В данном случае пространственное положение каждого значения температуры является составной частью набора данных , то есть физическое расположение в трехмерном прос-транстве является частью информации. Такие данные также весьма прспособлены для представления при помощи многомерных массивов (см.рисунок выше).
Здесь, чтобы найти среднее значение всех измерений, то есть среднюю температуру воздуха в комнате, можно записать
mean (mean (mean (TEMP)))
где через TEMP обозначен массив четырехмерных данных.
Дл получения вектора «серединных» температур (элемента (2,2)) комнаты на каждой странице, то есть в каждом сечении, запишем
B = TEMP (2, 2, :).
ОРГАНИЗАЦИЯ И ХРАНЕНИЕ ДАННЫХ
Для хранения различных типов данных в системе MATLAB используются так называемые структуры (structure) и ячейки (cell). Структуры (иногда их называют массивами структур) служат для хранения массивов различных типов данных, организаванных по принципу пои-менованных полей. Ячейки (или массивы ячеек) являются специальным классом массивов системы MATLAB, чьи элементы состоят из ячеек, в которых могут храниться любые другие массивы данных, применяемые в MATLAB-е. Как структуры, так и ячейки обеспечивают иерархический механизм для хранения самых различных типов данных. Они отличаются друг от друга прежде всего способом организации базы данных. При использовании струк-тур доступ к данным осуществляется при помощи наименований полей, тогда как в массивах ячеек доступ осуществляется при помощи матричной индексации.
В приведенных ниже таблицах дается краткое описание функций MATLAB-а, предназначен-ных для работы с массивами структур и ячеек
Структуры
Функция |
Описание |
fieldnames |
Получить имена полей |
getfield |
Получить содержание поля |
isfield |
Истинно, если поле есть в структуре |
isstruct |
Истинно, если структура |
rmfield |
Удалить поле |
setfield |
Установить содержимое поля |
struct |
Создать массив структур |
struct2cell |
Преобразовать структуру в массив ячеек |
Ячейки
Функция |
Описание |
cell |
Создать массив ячеек |
cell2struct |
Преобразовать массив ячеек в структуру |
celldisp |
Показать содержимое массива ячеек |
cellfun |
Применить функцию к массиву ячеек |
cellplot |
Показать графическую структуру массива ячеек |
deal |
Обмен данными между любыми классами массивов |
iscell |
Истинно для массивов ячеек |
num2cell |
Преобразовать числовой масси в массив ячеек |
МАССИВЫ СТРУКТУР
Структуры это массивы данных с поименованными «хранилищами» данных, называемыми полями. Поля структуры могут содержать данные любого типа. Например, одно поле может содержать текстовую строку, представляющую имя (name), второе поле может содержать скалярную переменную, являющуюся счетом за лечение (billing), третье может содержать матрицу результатов медицинских анализов (test) и так далее.
Как и обычным масивам данных, структурам присущи основные свойства массивов. Одна структура является структурой размера 1х1, точно так же как число 5 является числовым массивом размера 1х1. Вы можете строить структуры с лбой допустимой размерностью или формы, включая многомерные массивы структур.
Создание массивов структур
Имеется два следующих способа создания структур:
Создание массивов структур с применением операторов присваивания.
Вы можете построить простую структуру размера 1х1 путем прямого присваивания значений индивидуальным полям. MATLAB при этом автоматически конструирует соответствующую структуру. Например, создадим 1х1 структуру данных пациента лечебницы, показанную в начале данного раздела. Для этого следует ввести следующие записи:
patient.name = 'John Doe';
patient.billing = 127.00;
patient.test = [79 75 73; 180 178 177.5; 220 210 205];
Если ввести теперь в командной строке запись
patient
то MATLAB ответит
name: 'John Doe'
billing: 127
test: [3x3 double]
patient является массивом, представляющим собой структуру с тремя полями. Для расшире-ния данного массива нужно просто добавить соответствующие индексы после имени струк-туры:
patient(2).name = 'Ann Lane';
patient(2).billing = 28.50;
patient(2).test = [68 70 68; 118 118 119; 172 170 169];
Структура patient имеет теперь размер [1 2]. Отметим, что если массив структур содержит более одного элемента, то MATLAB уже не выводит на экран содержание отдельных полей при вводе имени структуры. Взамен, на дисплей выдаются общая информация о содержимом структуры, то есть имена полей:
Patient
patient =
1x2 struct array with fields:
name
billing
test
Для получения данной информации вы можете также использовать функцию fieldnames. Данная функция выдает массив ячеек содержащих названия полей в форме строки. Если вы расширяете структуру, MATLAB запалняет те поля, в которые вы не ввели данные, пустыми матрицами так, что:
Например, при вводе
patient(3).name = 'Alan Johnson'
структура patient принимает размер 1х3. При это оба поля patient(3).billing и patient(3).test содержат пустые матрицы.
Внимание! Размеры данных в одноименных полях могут быть различными. В нашем при-мере со структурой patient поля name могут иметь различную длину, поля test могут содер-жать массивы числовых данных различных размеров и так далее.
Создание массива структур с использованием функции struct.
Вы можете заранее создать массив структур применив функцию struct. Ее основная форма имеет вид
str_array = struct ('поле1',знач1,'поле2',знач2, ...)
где аргументами являются имена полей и их соответствующие значения. Значением поля мо-жет быть или одно значение, представленное любой допустимой конструкцией в MATLAB-е, или массив ячеек данных (массивы ячеек рассмотрены в следующем разделе). Все значения полей в списке аргументов должны иметь одинаковый вид (единственное значение или мас-сив ячеек).
Вы можете использовать различные методы для задания массива структур. Эти методы отличаются способом инициализации полей структуры. В качестве примера расмотрим зада-ние структуры размера 1х3 с именем weather (погода), имеющую поля temp (температура)
и rainfall (дождевые осадки). Три различные способа задания такой структуры даны в приведенной ниже таблице.
Метод |
Синтаксис |
Задание |
Функция struct |
weather(3) = struct('temp',72,'rainfall',0.0);
|
Структура weather(3) инициализируется с указан-ными значениями полей. По-ля остальных двух структур в массиве, weather(1) и weather(2), содержат в качес-тве данных пустые матрицы. |
Сочетание функций struct и repmat |
weather = repmat (struct ('temp', 72, 'rainfall', 0.0), 1, 3); |
Все структуры в массиве weather инициализируются с использованием одинаковых значений одноименных полей. |
Функция struct с использованием синтаксиса ячеек |
weather = struct ('temp',{68, 80, 72}, 'rainfall', {0.2,0.4,0.0} ); |
Структуры в массиве weather инициализируются с разными значениями полей, заданных массивом ячеек. |
Обращение к данным в массивах структур.
Используя индексацию массива структур, можно осуществить обращение к данным любого поля или любого элемента поля в массиве структуры. Аналогичным образом, вы можете за-дать значение любого поля или элемента поля структуры. В качестве примера, используемо-го в данном разделе, рассмотрим структуру, представленную на приведенном ниже рисунке.
Вы можете обратиться к подмассивам путем дабавления стандартной индексации к имени массива структур. Например, следующая запись приводит к структуре размера 1х2
mypatients = patient(1:2)
1x2 struct array with fields:
name
billing
test
Первая структура в массиве mypatients совпадает с первой структурой в массиве patient:
mypatients(1)
ans =
name: 'John Doe'
billing: 127
test: [3x3 double].
Для обращения к полю определенной структуры, нужно добавить точку (.) после имени стру-ктуры, с указанием далее имени поля:
str = patient(2) . name
str =
Ann Lane
Для обращения к элементам внутри полей, следует добавить требуемые индексы к имени поля. Если поле содержит числовой массив, нужно использовать индексация цифровых массивов. Если поле содержит массив ячеек, используйте соответствующую индексацию ячеек и так далее. Например,
test2b = patient(3).test(2,2)
test2b =
153
Аналогичную форму записи следует использовать и для задания значений переменных внутри поля, например,
patient(3).test(2,2) = 7
Вы можете также одновременно извлечь данные одноименных полей многомерной структу-ры. Например, запись ниже создает вектор 1х3, содержащий все значения счетов полей billing fields.
bills = [patient.billing]
bills =
127.0000 28.5000 504.7000
Аналогично, вы можете создать массив ячеек, содержащий данные температур test для пер-вых двух структур.
tests = {patient(1:2).test}
tests =
[3x3 double] [3x3 double]
Обращение к полям структуры с применением функций setfield и getfield
Прямая индексация обычно является наиболее эффективным способом задания или получе-ния значений полей структуры. Если, однако, вы знаете только название поля в виде строки, например, если вы использовали функцию fieldnames для получения имени поля в пределах M-файла – то для указанных операций с данными этих полей можно также применить функ-ции setfield и getfield.
Функция getfield позволяет получить значение или значения поля или элемента поля и име-ет следующий синтаксис
f = getfield(array,{array_index},'field',{field_index})
где индекс field_index является необязательным , а array_index является необязательным для массива структур размера 1х1. Данный синтаксис соответствует записи
f = array(array_index).field(field_index)
Например, для обращения к полю name во второй структуре массива patient запишем
str = getfield(patient,{2},'name')
Аналогично, функция setfield дает возможность задать значения полей используя синтаксис
f = setfield (array,{array_index},'field',{field_index},value)
Определение размера массива структур
Для получения размера массива структур или размера любого поля структуры. можно вос-пользоваться функцией size. При вводе в качестве аргумента функции size имени структуры, данная функция возвращает вектор размерностей массива. Если задать аргумент в форме массив(n).поле, функция size возвращает размер содержимого поля. Например, для нашей структуры patient размера 1х3, запись size(patient) возвращает вектор [1 3]. Выражение size(patient(1,2).name) возвращает длину строки имени элемента (1,2) структуры patient.
Добавление полей к структуре
Вы можете добавить поле ко всем структурам в массиве добавлением поле к любой одной структуре. Например, для добавления поля номера социальной страховки к массиву patient можно воспользоваться записью вида
patient(2).ssn = '000–00–0000'
При этом поле patient(2).ssn второго пациекта имеет заданное значение. Все другие структу-ры в массиве структур также имеют поле ssn, но эти поля содержат пустые матрицы до тех пор, пока вы не зададите в явном виде соответствующие значения.
Удаление поля из структуры
Вы можете удалить любое поле заданной структуры при помощи функции rmfield. Ее наиболее общая форма имеет вид
struc2 = rmfield(array,'field')
где array это массив структур, а 'field' является именем поля, которое вы хотите удалить. Например, чтобы удалить поле name из массива patient, нужно ввести:
patient = rmfield(patient,'name')
Применение функций и операторов
Вы можете осуществлять операции над полями и над элементами полей точно так же, как над любыми другими массивами системы MATLAB. Для выбора данных, над которыми нужно произвести действия нужно использовать индексацию. Например, следующее выра-жение вычисляет среднее значение вдоль строк массива test в patient(2):
mean((patient(2).test)')
Зачастую бывают различные возможности для применеия функций или операторов к полям массива структур. Один из путей суммирования всех полей billing в структуре patient выг-лядит следующим образом:
total = 0;
for j = 1:length(patient)
total = total + patient(j).billing;
end
Для упрощения подобных операций, MATLAB предоставляет возможность производить дей-ствия одновременно со всеми одноименными полями массива структур. Для этого нужно просто заключить выражение (допустим, array.field) в квадратные скобки внутри применяе-мой функции. Например, вы можете решить приведенную выше задачу, записав
total = sum ([patient.billing])
Подобная запись эквивалентна использованию так называемого списка, разделенного запятой (comma-separated list)
total = sum ([patient(1).billing , patient(2).billing ,...])
Такой синтаксис наиболее полезен в случаях, когда поле является скалярным операндом.
Создание функций для операций над массивами структур
Вы можете записать свои функции в виде М-файлов для работы со структурами любой нес-тандартной формы. При этом вам придется осуществить собственный контроль ошибок. Иными словами, вам следует убедиться, что осуществляется проверка действий над выбран-ными полями.
В качестве примера, рассмотрим набор данных, который описывает измерения в различных моментах времени различных токсинов в источнике питьевой воды. Данные состоят из 15 различных наблюдений, где каждое наблюдение содержит три независимых замера. Вы мо-жете организовать эти данные в виде набора 15 структур, где каждая структура имеет три поля, по одному для каждого проведенного измерения.
Приведенная ниже функция concen, действует над массивом структур со специфичными ха-рактеристиками. Их характеристики должны содержать поля lead (свинец), mercury (ртуть),
и chromium (хром).
function [r1, r2] = concen(toxtest);
% Create two vectors. r1 contains the ratio of mercury to lead
% at each observation. r2 contains the ratio of lead to chromium.
r1 = [toxtest.mercury]./[toxtest.lead];
r2 = [toxtest.lead]./[toxtest.chromium];
% Plot the concentrations of lead, mercury, and chromium
% on the same plot, using different colors for each.
lead = [toxtest.lead];
mercury = [toxtest.mercury];
chromium = [toxtest.chromium];
plot(lead,'r'); hold on
plot(mercury,'b')
plot(chromium,'y'); hold off
Данная функция создает два вектора. r1 содержит отношение ртути к свинцу в каждом наб-людении, а r2 содержит отношение свинца к хрому. Далее эта функция строит кривые кон-центрации свинца, ртути и хрома на одном графике, используя разные цвета (красный – сви-нец, синий – ртуть, желтый – хром).
Попробуйте применить данную функцию на примеры структуры test со следующими данны-ми
test(1).lead = .007; test(2).lead = .031; test(3).lead = .019;
test(1).mercury = .0021; test(2).mercury = .0009;
test(3).mercury = .0013;
test(1).chromium = .025; test(2).chromium = .017;
test(3).chromium = .10;
Организация данных в массиве структур
Ключ к организации массива структур состоит в выборе способа, которым вы хотите обра-щаться к подмассивам данных или отдельным данным структуры. Это, в свою очередь, оп-ределяет как вы дольжны построить массив, содержащий структуры и как выбирать поля структуры. Например, рассмотрим RGB изображение размера 128х128, запомненное в трех различных массивах : RED, GREEN и BLUE.
Имеются по меньшей мере две возможности для организации таких данных в массив струк-
тур.
Плоская организация Поэлементная организация
Плоская организация
В этом варианте, каждое поле структуры представляет полную плоскость изображения в красном, зеленом или синем цветах. Вы можете создать такую структуру используя запись
A.r = RED;
A.g = GREEN;
A.b = BLUE;
Подобный подход позволяет вам легко извлекать полное изображение в отдельных состав-ляющих цветов, для решения таких задач как фильтрация. Например, для обращения ко всей красной плоскости нужно просто записать
red_plane = A.r;
Плоская организация имеет то дополнительное преимущество, что массив структур можно без труда дополнить другими изображениями. Если у вас есть набор изображений, вы може-те запомнить их как A(2), A(3), и так далее, где каждая структура содержит полное изобра-жение.
Недостаток плоской организации становится очевичным, когда вам нужно обратиться к от-дельным частям изображения. В этом случае вы должны оперировать с каждым полем в от-дельности:
red_sub = A.r (2:12, 13:30);
grn_sub = A.g (2:12, 13:30);
blue_sub = A.b (2:12, 13:30);
Поэлементная организация
Данный вариант имеет то преимущество, что обеспечивает простой доступ к подмножествам данных. Для организации данных в данной форме нужно использовать команды
for i = 1:size(RED,1)
for j = 1:size(RED,2)
B(i,j) .r = RED(i,j);
B(i,j) .g = GREEN(i,j);
B(i,j) .b = BLUE(i,j);
end
end
При поэлементной организации, вы можете осуществить обращение к подмножествам дан-ных при помощи единственного выражения:
Bsub = B(1:10, 1:10);
Однако, обращение к полной плоскости изображения при поэлементом методе требуется цикл :
red_plane = zeros(128,128);
for i = 1 : (128*128)
red_plane(i) = B(i).r;
end
Поэлементая организация не является лучшим выбором для большинства приложений, свя-занных с обработкой изображений. Однако, она может быть лучшей для других приложений, когда вам требуется часто обращаться к отдельным подмножествам полей структуры. Пример в следующем разделе демонстрирует данный тип приложен
Пример - Простая база данных
Рассмотрим организацию простой базы данных.
А Плоская организация В Поэлементная организация
Оба возможных способов организации базы данных имеет определенные проимущества, зависящие от того как вы хотите осуществить доступ к данным:
а) При плоской организации
avg = mean(A.amount);
б) При поэлементной организации
avg = mean([B.amount]);
Поэлементная организация дает более легкий доступ ко всей информации, связанной с одним клиентом. Рассмотрим М-файл, названный client.m, который осуществляет вывод на экран имени и адреса любого клиента. При использовании плоской организации, следует вводить в качестве аргументов индивидуальные поля:
function client(name,address, amount)
disp(name)
disp(address)
disp(amount)
Для вызова функции client для второго клиента записываем,
client(A.name(2,:),A.address(2,:), A. amount (2,:))
При использовании поэлементой организации вводится вся структура
function client(B)
disp(B)
Для вызова функции client для второго клиента при этом просто записываем,
client(B(2))
Обычно данные не диктуют выбора организации базы данных. Скорее, вы сами должны решить, как вы хотите осуществлять доступ и операции над данными.
Вложенные структуры
Поле структуры может содержать другую структуру, и даже массив структур.Если вы уже имеете некоторую структуру, то для вложения новых структур в любое поле данной струк-туры вы можете воспользоваться как функцией struct, так и применить непосредственно оператор присваивания
Создание вложенных структур при помощи функции struct
Для создания вложенных структур вы можете применить функцию struct . Например, создадим массив структур размера 1х1 со вложенной в поле nest структурой:
A = struct('data',[3 4 7; 8 0 1],'nest',struct('testnum','Test 1', 'xdata',[4 2 8],'ydata',[7 1 6]));
Применим теперь операторы присваивания для добавления сторого элемента к массиву А:
A(2).data = [9 3 2; 7 6 5];
A(2).nest.testnum = 'Test 2';
A(2).nest.xdata = [3 4 2];
A(2).nest.ydata = [5 0 9];
Индексация вложенных структур
Для обращения к вложенным структурам, нужно просто добавить имена вложенных полей с использование точечных разделителей. Первая текстовая строка в индексированном выраже-нии определяет массив структур, а последующие выражения дают доступ к полям, содержа-щим другие структуры. Например, массив А, созданный ранее, имеет три уровня вложения:
МАССИВЫ ЯЧЕЕК
Массивы ячеек это массивы данных системы MATLAB элементы которых являются ячейка-ми и могут служить «хранилищами» для других массивов данных. Например, одна ячейка массива ячеек может содержать матрицу действительных чисел, другая ячейка – массив тек-стовых строк, а третья – вектор комплексных значений.
Вы можете конструировать массивы ячеек любых допустимых размерностей и форм, вклю-чая многомерные массивы ячеек.
Создание массивов ячеек
Вы можете создавать массивы ячеек двумя способами:
Применение операторов присваивания
Вы можете создать массив ячеек путем присваивания данных индивидуальным ячейкам, по одной ячейке за один раз. MATLAB при этом автоматически создает требуемый массив яче-ек. Существуют два способа индексации данных ячеек:
Заключите индексы ячейки в обычные скобки с использованием стандартной индексации массивов. Заключите содержимое ячейки в правой стороне оператора присваивания в фигур-ные скобки “{}”. Например, создадим массив ячеек А размера 2х2.
A(1,1) = {[1 4 3; 0 5 8; 7 2 9]};
A(1,2) = {'Anne Smith'};
A(2,1) = {3+7i};
A(2,2) = {–pi:pi/10:pi};
Внимание! Запись “{}” обозначает пустой массив ячеек, точно так же как “[ ]” обозначает пустую матрицу для числовых массивов. Вы можете использовать пустой массив ячеек в лю-бых выражениях с массивами ячеек.
Заключите индексы ячейки в фигурные скобки, применяя стандартные обозначения масси-вов. Задайте содержимое ячейки в правой части оператора присваивания в обычном виде.
A{1,1} = [1 4 3; 0 5 8; 7 2 9];
A{1,2} = 'Anne Smith';
A{2,1} = 3+7i;
A{2,2} = –pi:pi/10:pi;
Различные примеры, приведенные ниже, используют оба приведенных синтаксиса. Обе фор-мы записи являются вполне взаимозаменяемыми.
Внимание! Если вы уже имеете числовой массив с заданным именем, не пытайтесь создать массив ячеек с помощью операторов присваивания, не уничтожив предаврительно числовой массив. Если вы не очистите числовой массив, MATLAB примет, что вы пытаетесь «сме-шать» синтаксисы ячеек и числовых массивов и выдаст сообщение об ошибке.
MATLAB выводит содержимое массива ячеек на дисплей в сжатой форме. Для нашего мас-сива А мы получим.
A =
[3x3 double] 'Anne Smith'
[3.0000+ 7.0000i] [1x21 double]
Для вывода полного содержания ячеек, нужно воспользоваться функцией celldisp. Для гра-фического вывода на дисплей архитектуры ячейки служит функция cellplot. Если вы назна-чаете данные ячейке, которая находится вне размерности имеющегося массива ячеек, MATLAB автоматически расширяет массив, чтобы включить заданный вами элемент. При этом промежуточные ячейки заполняются пустыми матрицами. Например, приведенный ни-же оператор присваивания превращает массив ячеек А размера 2х2 в массив размера 3х3.
A(3,3) = {5};
Все остальные ячейки третьего столбца и третьей строки при этом будут содержать пустые матрицы.
Использование фигурных скобок для построения массивов ячеек
Фигурные скобки, “{}”, являются такими же конструктурами массивов ячеек, как квадрат-ные скобки являются конструкторами числовых массивов. Фигурные скобки используются совершенно аналогично квадратным скобкам, за тем исключением, что их можно использо-вать для вложения массивов ячеек (см. ниже).
При конструировании массивов с использованием фигурных скобок нужно использовать пробелы или запятые для разделения столбцов, и точки с запятой для разделения строк. На-пример, ввод
C = {[1 2], [3 4]; [5 6], [7 8]};
приводит к следующему массиву ячеек размера 2х2
Для объединения отдельных массивов ячеек в новые массивы, вы можете использовать квадратные скобки, как и при объединении числовых массивов.
Задание массивов ячеек при помощи функции cell
Функция cell позволяет создавать пустые массивы ячеек заданного размера. Например, сле-дующее выражение создает пустоймассив ячеек размера 2х2.
B = cell(2, 3);
Для заполнения ячеек массива В нужно прменить операторы присваивания:
B(1,3) = {1:3};
Доступ к данным массивов ячеек
Вы можете извлекать данные из массивов ячеек или же запоминать данные в имеющемся или вновь созданном массиве ячеек двумя способами:
Доступ к данным массивов ячеек с использованием фигурных скобок
Вы можете использовать индексирование содержимого в правой части выражения для обра-щения ко всем данным в какой-либо отдельной ячейке. Для этого в левой части выражения следует задать переменную для записи содержимого ячейки. Заключите индексы ячеек в фигурные скобки. Это означает, что вы обращаетесь к содержимому ячейки. Рассмотрим следующий массив N размера 2х2:
N{1,1} = [1 2; 4 5];
N{1,2} = 'Name';
N{2,1} = 2 – 4i;
N{2,2} = 7;
Вы можете получить строку в N{1,2} записав
c = N{1,2}
При вводе данной строки MATLAB выдаст
c =
Name
Внимание! В операторах присваивания вы можете использовать индексацию содержимого только для обращения к одной ячейке, а не к подмножеству ячеек. Например, оба выражения
A{1, :} = value и B = A{1, :} являются неправильными.
Для обращения к подмножествам содержимого одной ячейки нужно объединить индексиро-вание. Например, чтобы получить элемент (2,2) массива в ячейке N{1,1}, следует записать:
d = N{1,1} (2,2)
что даст
d =
5
Обращение к подмножествам массива ячеек
Для присваивания любого множества ячеек некоторой переменной, нужно воспользоваться индексацией содержимого ячеек. При этом оператор двоеточия служит для доступа к под-множествам ячеек в пределах иассива ячеек.
Удаление ячеек
Вы можете удалить полностью любую размерность массива ячеек с использованием одного выражения. Как и в стандартном случае удаления массивов, нужно использовать векторное индексирование при удалении строк или столбцов массива ячеек, с приравниванием данной размерности пустой мастрице, например
.
A(:, 2) = [ ]
При удаленни ячеек, фигурные скобки вообще не используются в соответствующих выра-жениях.
Изменение формы (размерностей) массива ячеек
Ка и в случае любых других массивов, для изменения формы массива ячеек можно приме-нить функцию reshape. При этом общее число ячеек должно остаться тем же, то есть вы не можете использовать данную функцию для добавления или удаления ячеек.
A = cell(3, 4);
size(A)
ans =
3 4
B = reshape(A,6,2);
size(B)
ans =
6 2
Замена списка переменных массивами ячеек
Массивы ячеек могут быть ипользованы для замены списка переменных MATLAB-а в сле-дующих случаях:
Если вы используете оператор двоеточия для индексации набора ячеек в сочетании с фигур-ными скобками, то MATLAB обращается с каждой ячейкой как с отдельной переменной. Например, допустим вы имеете массив ячеек T, где каждая ячейка содержит отдельный век-тор. Выражение T{1:5} эквивалентно списку векторов в первых пяти ячейках массива T, то есть оно равносильно записи
[ T{1} , T{2} , T{3} , T{4} , T{5} ]
Рассмотрим массив ячеек C:
C(1) = {[1 2 3]};
C(2) = {[1 0 1]};
C(3) = {1:10};
C(4) = {[9 8 7]};
C(5) = {3};
Для свертки векторов в C(1) и C(2) с использованием функции conv, нужно записать
d = conv(C{1:2})
d =
1 2 4 2 3
Для вывода на дисплей векторов со второго по четвертый введем
C{2:4}
Это даст
ans =
1 0 1
ans =
1 2 3 4 5 6 7 8 9 10
ans =
9 8 7
Аналогично, вы можете создать новый числовой массив используя выражение
B = [ C{1}; C{2}; C{4} ]
что приводит к
B =
1 2 3
1 0 1
9 8 7
Вы можете также использовать соответствующую индексацию в левой части оператора при-сваивания для создания нового массива ячеек, где каждая ячейка содержит один выходной аргумент
[D{1:2}] = eig (B)
D =
[3x3 double] [3x3 double]
Напомним, что при задании двух выходных аргументов, выходом функции eig(B) является модальная матрица, составленная из нормированных собственных векторов матрицы B и ди-агональная матрица собственных значений. Вы можете вывести в командное окно действи-тельные значения собственных векторов и значений вводя D{1} и D{2}.
Применение функций и операторов
Для применения функций или операторов к содержимому ячеек нужно воспользоваться со-ответствующей индексацией. Например, зададим массив ячеек А
A{1, 1} = [1 2; 3 4];
A{1, 2} = randn (3,3);
A{1, 3} = 1 : 5;
Тогда, для применения функции sum к содержимому первой ячейки массива запишем
B = sum (A{1,1})
Что приводит к следующему результату
B =
4 6
Для применения той же функции к нескольким ячейкам не вложенных массивов ячеек, нуж-но применить цикл:
for i = 1:length(A)
M{i} = sum(A{1,i});
end
Организация данных в массивах ячеек
Массивы ячеек являются полезными для создания базы данных, состоящих из массивов раз-личных значений и типов. Массивы ячеек являются предпочтительнее структур в приложе-ниях, где:
Как пример обращения к набору множества полей при помощи одного выражения допустим, что ваши данные состоят из:
Для многих приложений, наилучшим способом создания базы данных являются структуры. Однако, если вы постоянно имеете дело только с первыми двумя полями данных, то массив ячеек может быть более удобным для целей индексации.
Приведенный ниже пример показывает как можно обратиться к первым двум элементам мас-сива ячеек TEST.
[newdata, name] = deal (TEST{1:2})
а следующий пример демонстрирует то же при организации данных в виде структуры с тем же именем TEST:
newdata = TEST.measure
name = TEST.name
Вложение массивов ячеек
Массив ячеек может содержать другой массив ячеек и даже масси массивов ячеек (Массивы, не содержащие другие массивы ячеек называются листовыми ячейками (leaf cells).) Для соз-дания вложенных массивов ячеек вы можете использовать вложенные фигурные скобки, фу-нкцию cell, или непосредственное применение операторов присваивания.
Создание вложенных массивов при помощи вложенных фигурных скобок
Для указанной в заголовке цели достаточно вложить в требуемую ячейке пару фигурных ско-бок. Например, введем следующие команды
clear A
A(1,1) = {magic(5)};
A(1,2) = { { [ 5 2 8; 7 3 0; 6 7 3] 'Test 1'; [2 – 4i 5 + 7i] {17 [ ] } } }
что даст
A =
[5x5 double] {2x2 cell}
Отметим, что правая часть второго оператора присваивания заключена в две пары фигурных скобок. Первая пара характеризует ячейку cell (1,2) массива ячеек A. Второй “набор” скобок представляет массив ячеек размера 2х2 внутри внешней ячейки.
Создание вложенных массивов при помощи функции cell
Для вложения массива ячеек при помощи функции cell, нужно назначить выход функции cell сушествующей ячейке. Например,
1. Создадим пустой массив размера 1х2
A = cell (1, 2);
2. Создадим массив ячеек размера 2х2 внутри A(1,2).
A(1,2) = {cell(2,2)};
3. Заполним массив А, используя выражения
A(1,1) = {magic(5)};
A{1,2}(1,1) = {[5 2 8; 7 3 0; 6 7 3]};
A{1,2}(1,2) = {'Test 1'};
A{1,2}(2,1) = {[2–4i 5+7i]};
A{1,2}(2,2) = {cell(1,2)}
A{1,2}{2,2}(1) = {17};
Отметим использование фигурных скобок до последнего уровня вложенных индексов.
Вы также можете конструировать вложенные массивы ячеек непосредственно с использова-нием операторов присваивания, как это показано в шаге 3 выше.
Индексация вложенных массивов ячеек
Для индексации вложенных ячеек нужно объединить выражения индексов. Первый набор индексов обеспечивает доступ к верхнему уровню ячеек, а последующие наборы скобок обеспечивают последовательный доступ к последующим уровням. Например, следующий массив имеет три уровня вложения
Преобразования между массивами ячеек и числовыми массивами
Для перехода от формата массива ячеек к числовому массиву следует воспользоваться прог-раммой, включающей цикл. Например, создадим массив ячеек F:
F{1,1} = [1 2; 3 4];
F{1,2} = [–1 0; 0 1];
F{2,1} = [7 8; 4 1];
F{2,2} = [4i 3+2i; 1 – 8i 5];
Используем теперь три вложенных цикла для копирования содержимого массива F в число-вой массив NUM.
for k = 1:4
for i = 1:2
for j = 1:2
NUM(i,j,k) = F{k}(i,j);
end
end
end
Аналогично, вы должны использовать петли for для присваивания каждого значения число-вого массива одной ячейке массива ячеек:
G = cell(1,16);
for m = 1:16
G{m} = NUM(m);
end
Массивы ячеек, содержащие структуры
Для хранения групп структур с различной архитектурой полей можно использовать массивы ячеек
c_str = cell(1,2);
c_str{1}.label = '12/2/94 – 12/5/94';
c_str{1}.obs = [47 52 55 48; 17 22 35 11];
c_str{2}.xdata = [–0.03 0.41 1.98 2.12 17.11];
c_str{2}.ydata = [–3 5 18 0 9];
c_str{2}.zdata = [0.6 0.8 1 2.2 3.4];
Ячейка l массива c_str содержит структуру с двумя полями, где в одном поле хранится стро-ка символов, а во втором - вектор. Ячейка 2 содержит структуру с тремя полями векторов.
При создании массивов ячеек, содержащих структуры, вы должны применить индексирова-ние фигурными скобками. Аналогично, вы должны применить фигурные скобки для получе-ния структур, содержащихся внутри ячеек. Общий синтаксис при этом имеет вид:
cell_array{index}.field
Например, чтобы получить содержимое поля label структуры в ячейке 1 нужно записать
c_str{1}.label
Многомерные массивы ячеек
Как и в случае числовых массивов, общие принципы создания многомерных массивов ячеек основаны на распространении понятия двумерных массивов ячеек. Для создания многомер-ных массивов ячеек вы можете применить функцию cat, совершенно аналогично ее примен-ению в случае числовых массивов.
Например, создадим простой трехмерный массив ячеек С из двух массивов А и В:
A{1,1} = [1 2; 4 5];
A{1,2} = 'Name';
A{2,1} = 2 – 4i;
A{2,2} = 7;
B{1,1} = 'Name2';
B{1,2} = 3;
B{2,1} = 0:1:3;
B{2,2} = [4 5]';
C = cat(3,A,B);
Общая структура индексации массива ячеек С имеет вид
Многомерные массивы структур
Многомерные массивы структур явлеются распространением обычных двумерных, то есть плоских структур. Подобно другим типам многомерных массивов, вы можете строить их как прямым присваиванием, так и применением функции cat.
patient(1,1,1).name = 'John Doe';
patient(1,1,1).billing = 127.00;
patient(1,1,1).test = [79 75 73; 180 178 177.5; 220 210 205];
patient(1,2,1).name = 'Ann Lane';
patient(1,2,1).billing = 28.50;
patient(1,2,1).test = [68 70 68; 118 118 119; 172 170 169];
patient(1,1,2).name = 'Al Smith';
patient(1,1,2).billing = 504.70;
patient(1,1,2).test = [80 80 80; 153 153 154; 181 190 182];
patient(1,2,2).name = 'Dora Jones';
patient(1,2,2).billing = 1173.90;
patient(1,2,2).test = [73 73 75; 103 103 102; 201 198 200];
Геометрически данную структуру можно отобразить следующим образом
Применение функций к многомерным массивам структур
Для применения функций к многомерным массивам структур. нужно использовать индекси-рование полей. Например, найдем сумму столбцов структуры test в patient(1,1,2):
sum((patient(1,1,2).test));
Аналогично, просуммируем все поля billing в многомерном массиве patient:
total = sum([patient.billing]);
ПРОГРАММИРОВАНИЕ НА MATLAB-е
Программирование на языке MATLAB : Быстрый старт
М-файлы языка MATLAB могут быть или сценариями (scripts), которые просто выполняют серию операторов (выражений), или же они могут быть функциями (functions), допускающи-ми также входные аргументы и выходные переменные. Вы можете создать М-файлы исполь-зуя текстовой редактор и затем использовать их как любую другую функцию или команду системы MATLAB.
В простейшем случае процесс выглядит так:
Схематически это можно отобразить следующим образом:
Типы М-файлов
Как указывалось выше, имеется два типа М-файлов, общие свойства которых приведены в таблице
М-сценарии |
М-функции |
|
|
|
|
|
|
Что такое М-файл ?
В данном разделе мы рассмотрим основные части, из которых состоит М-функция. Допус-тим, мы имеем следующую функцию fact, вычисляющую факториал целого числа:
function f = fact (n) % Строка определения функции
% FACT Factorial. % Первая строка помощи (H1 line)
% FACT(N) returns the factorial of N, H! % Текст помощи (Help text)
% usually denoted by N!
% Put simply, FACT(N) is PROD(1:N).
f = prod(1:n); % Тело функции
Эта функция имеет некоторые элементы, которые являются общими для всех функций систе-мы MATLAB:
• Строка определения функции. Эта строка задает имя функции , а также число и порядок входных и выходных аргументов.
• Строка H1 (H1 line). H1 обозначает «первую строку» помощи. MATLAB выводит эту стро-ку в командное окно, когда вы пользуетесь функцией lookfor или запрашиваете помощь по всей директории.
• Текст помощи (Help text). MATLAB выводит в командное окно данный текст вместе со строкой H1, когда вы запрашиваете помощь по конкретной функции, то есть вводите help Имя_Функции.
• Тело функции. Эта часть функции содержит коды (команды), которые выполняют вычисле-ния и определяют значения всех выходных переменных.
Обеспечение помощи для вашей программы
Вы можете снабдить пользователя информацией (помощью) о вашей программе, путем включения раздела текста помощи в начало М-файла. Этот раздел начинается со строки, сле-дующей непосредственно за строкой опеределения функции и заканчивается на первой пус-той строке, или строке тела функции. Каждая строка текста (эти строки окрашены в зеленый цвет) помощи должна начинаться символом процента (%). MATLAB выводит в командное окно данный текст каждый раз когда вы вводите
help Имя_Функции
Вы можете также написать текст помощи для всей директории, путем создания файла со специальным именем Contents.m, который находится в вашей директории. Этот файл долже содержать только строки комментариев, то есть каждая строка должна начинаться со знака процента. MATLAB выводит на дисплей строки файла Contents.m всякий раз, когда вы вводите в командное окно строку
help Имя_Директории
Если данная директория не содержит файл Contents.m, то при вводе help Имя_Директории в командное окно выводится первая строка помощи (H1 line) для каждого файла директории.
Создание М-файлов: Использование текстовых редакторов
М-файлы представляют собой обычные текстовые файлы, которые вы создаете с использо-ванием текстового редактора. MATLAB содержит встроенный редактор, хотя в принципе мо-жно воспользоваться любым другим текстовым редактором.
Внимание! Для вызова редактора нужно в меню File выбрать New и затем M-File.
Другой способ вызова редактира М-файла из командной строки состоит в использовании фу-нкции edit. For example, при вводе
edit foo
MATLAB открывает встроенный текстовой редактор на файле foo.m. Если не указать имени файла, то будет вызван редактор с новым, неозаглавленным файлом. Вы можете создать фун-кцию fact, приведенную выше, путем открытия вашего текстового редактора, ввода показан-ных строк, и запоминанием текста в файле под названием fact.m в вашей текущей директо-рии.
После того как вы создали этот файл, его можно найти в списке файлов вашей текущей директории, для чего надо ввести команду
what
Можно также распечатать в командном окне файл командой
type fact
Наконец, вы можете вычислить факториал любого целого числа, например, 5-и
fact(5)
ans =
120
Внимание! Сохраняйте все созданные или измененные вами М-файлы в директории (ката-логе), который не находится в дереве каталогов MATLAB-а. Если вы сохраните ваши М-файлы в дереве каталогов MATLAB-а, они могут быть уничтожены при установке новой версии MATLAB-а.
Сценарии
Сценарии являются простейшим типом М-файлов, поскольку они не имеют входных или выходных аргументов. Они полезны для автоматизации последовательности команд, таких как обычные вычисления, которые приходится часто выполнять в командном окне. Сценарии работают над существующими данными в рабочем пространстве; вы также можете создавать новые данные при помощи сценариев. Все переменные, созданные в результате выполнения сценариев, остаются в главном рабочем простанстве MATLAB-а, так что вы можете исполь-зовать их для дальнейших вычислений.
Простой пример сценария
Приведенные ниже выражения вычисляют функцию rho для нескольких тригонометричес-ких функций угла theta, и строят серию графиков в полярной системе координат
% An M–file script to produce % Линия комментариев
% "flower petal" plots
theta = –pi:0.01:pi; % Вычисления
rho(1,:) = 2*sin(5*theta).^2;
rho(2,:) = cos(10*theta).^3;
rho(3,:) = sin(theta).^2;
rho(4,:) = 5*cos(3.5*theta).^3;
for i = 1:4
polar(theta,rho(i,:)) % Вывод на графики
pause
end
Попробуйте ввести эти команды в М-файл, названный petals.m. Этот файл является теперь сценарием MATLAB-а. Ввод команды petals (лепестки) в командной строке MATLAB –а приводит к выполнению команд сценария. Команда pause приостанавливает выполнение цикла до нажатия какой-либо клавиши (например, Return). Таким образом, после того как сценарий отображает один график из четырех, нажатие клавиши Return приводит к появле-нию следующего. Здесь мы не имеем входных или выходных переменных; сценарий petals создает требуемые ему переменные в основном рабочем пространстве MATLAB-а. Когда вы-полнение сценария завершено, все созданные переменные (i, theta, и rho) остаются в рабо-чем пространстве. Вы можете убедиться в этом, вводя команду whos в командной строке.
Функции
Функции представляют собой М-файлы, которые принимают входные аргументы и выдают выходные. Они работают над переменными в своем собственном рабочем пространстве, ко-торое не совпадает с основным рабочим пространством, доступном из командной строки MATLAB-а.
Простой пример функции
Функция average является простым М-файлом, который вычисляет среднее значение элемен-тов вектора.
function y = average(x)
% AVERAGE Mean of vector elements.
% AVERAGE(X), where X is a vector, is the mean of vector elements.
% Non-vector input results in an error.
[m,n] = size(x);
if (~((m == 1) | (n == 1)) | (m == 1 & n == 1))
error('Input must be a vector')
end
y = sum(x) / length(x) ; % Фактические вычисления
При вводе не векторной величины, данная функция выдает сообщение об ошибке (более точ-но, на дисплей выводится фраза «Вход должен быть вектором»). Вы можете ввести эти ко-манды в М-файл, названный average.m. Функция average допускает единственный вход и возвращает единственный выходной аргумент. Для обращения к данной функции, введите
z = 1:99;
average(z)
что даст следующий результат
ans =
50
Основные части синтаксиса М-функций
Функции в общем случае состоят из следующий частей:
Строка определения функции
Строка определения функции информирует систему MATLAB , что М-файл содержит функ-цию, и задает последовательность входных и выходных переменных. Для функции average эта строк имеет следующий вид:
где input argument – входной аргумент;
function name – имя функции;
output argument – выходной аргумент;
keyword – зарезервированное слово;
Все функции MATLAB-а имеют линию определения функции, соответствующую данной схеме. Если функции имеют несколько выходных переменных, нужно заключить список этих переменных в квадратные скобки. Входные переменные, даже если их несколько, всегда заключаются в обычные скобки. Вот пример более сложной функции
function [x,y,z] = sphere(theta, phi, rho)
Если функция не имеет выходных переменных, оставьте выход пустым, например,
function printresults(x)
или используйте пустые квадратные скобки
function [ ] = printresults(x)
Переменные, которые вы передаете функции не обязательно должны иметь то же имя, что и в линии определения функции.
Строка помощи H1
Строка H1, названная так потому что она является первой строкой текста помощи (Help text), является линией комментария, которая следует непосредственно за строкой определения фу-нкции. Поскольку она состоит из текста комментария, строка H1начинается с символа про-цента (%). Для функции average эта строка имеет вид
% AVERAGE Mean of vector elements.
(СРЕДНЕЕ ЗНАЧЕНИЕ Вычисление среднего значения векторов)
Эта строка является первой строкой текста, который появляется при вводе пользователем в командной строке команды
help function_name
(help имя_функции)
Далее, функция lookfor производит поиск и выводит в командное окно тольку строку H1. Так как данная строка обеспечивает важную обобщающую информацию о М-файле, очень важно сделать ее по возможности более описательной.
Текст помощи
Вы можете создать возможность оперативной помощи (справки) для вашей М-функции , пу-тем ввода одной или большего числа строк комментария, начинающихся непосредственно за строкой H1. Текст помощи для функции average имеет вид
% AVERAGE(X), where X is a vector, is the mean of vector elements.
% Nonvector input results in an error.
(% СРЕДНЕЕ(Х), где Х является вектором, вычисляет среднее значение
%элементов вектора. Не векторный вход приводит к ошибке).
Когда вы вводите help function_name, MATLAB выводит линии комментариев, которые на-ходятся между строкой определения функции и первой строкой не комментариев (выполня-емой или пустой строкой). MATLAB игнорирует любые линии комментариев, которые появ-ляются за данным блоком текста помощи. Например, напечатав help sin получим
SIN Sine.
SIN(X) is the sine of the elements of X.
(SIN(X) является синусом элементов массива Х)
Тело функции
Тело функции содержит все коды системы MATLAB, которые осуществляют вычисления и определяют значения выходных переменных. Выражения в теле функции состоят из обраще-ний к другим функциям, программных конструкций типа команд циклов, ввода и вывода, вычислений, операторов присваивания, комментариев и пустых строк. Например, тело функ-
ции average содержит нескольких простых программных выражений:
[m,n] = size(x);
if (~((m == 1) | (n == 1)) | (m == 1 & n == 1)) % Flow control
error('Input must be a vector') % Error message display
end
y = sum(x)/length(x); % Computation and assignment
Комментарии
Как было указано ранее, строки комментариев начинаются с символа процента (%). Строки комментариев могут быть в любом месте М-файла, а также вы можете добавить коммента-рии к концу строки кодов программы. Например,
% Add up all the vector elements.
y = sum(x) % Use the sum function.
( % Суммирование всех элементов вектора.
y = sum(x) % Используйте функцию sum)
Первая строка комментариев, следующая непосредственно за строкой определения функции рассматривается как строка H1 данной функции. Строка H1 и любые строки комментариев, непосредственно следующие за Н1, составляют запись оперативной помощи для данного файла. В дополнение к строкам комментариев, вы можете вводить пустые строки в любом месте М-файла. Пустые строки игнорируются. С другой стороны, пустая строка может обозначать конец текста помощи.
Имена функций
Имена функций в MATLAB-е имеют те же ограничения, что и имена переменных. MATLAB использует первые 32 символа имени. Имена функций должны начинаться с буквы; осталь-ные знаки могут быть любой комбинацией букв, цифр и символов подчеркивания. Некото-рые операционные системы могут вводить свои ограничения на длину имен функций.
Название текстового файла, который содержит функцию MATLAB-а, состоит из имени фун-кции с добавленны расширением .m . Например, average.m. Если имя файла и имя функции в ее строке определения отличаются, то внутреннее имя игнорируется.
Однако, несмотря на то что имя функции, заданное в ее строке определения, не обязательно должно совпадать с именем файла, настаятельно рекомендуется чтобы вы использовали одно и то же имя для файла и функции.
Как работает функция
Вы можете вызвать М-функцию как из командной строки MATLAB-а, так и из другого М-файла. Убедитесь, что вы включили все необходимые аргументы, заключив входные аргу-менты в обычные скобки, а выходные – в квадратные.
Определение имени функции
Когда MATLAB сталкивается с новым именем, он осуществляет следующую последователь-ность шагов:
Что происходит при вызове функцию
Когда вы вызываете М-файл из командной строки или же из пределов другой М-функции, MATLAB осуществляет синтаксический анализ функции и преобразует ее в псевдокод, ко-торый запоминается в памяти. Это исключает необходимость повторного анализа функции при каждом последующем ее вызове в пределах данного сеанса работы. Псевдокод сохраня-ется в памяти до тех пор пока вы не удалите его с помощью команды clear, или пока вы не выйдете из MATLAB-а.
В приведенной ниже таблице даны основные варианты применения комнды clear для удаления любых функций из рабочего пространства MATLAB-а.
Синтаксис |
Описание |
clear function_name |
Удаляет заданную функцию из рабочего пространства |
clear functions |
Удаляет все скомпилированные М-функции |
clear all |
Удаляет все переменные и функции |
Создание P-кодов файлов
Вы можете запомнить предварительно скомпилированные функции или сценарии, называе-мые псевдокодами (P-code) файлов, для использования их в последующих сеансах работы. Например, команда
pcode average
компилирует функцию average.m и запоминает полученный псевдокод в файле называемом average.p. Это позволяет MATLAB-и исключить операцию компилирования при первом вы-зове функции в каждом сеансе работы. В принципе, MATLAB осуществляет компиляцию ве-сьма быстро, так что запоминание функции в виде псевдокода редко дает большой выигрыш в быстродействии. Единственная ситуация где псевдокод действительно дает ощутимый вы-игрыш во времени, связана с применением сложных Графических Интерфейсов Пользова-теля (GUI) в различных приложениях. В этом случае множество М-файлов должны быть скомпилировано прежде чем GUI станет видимым. Другая ситуация, где использование псе-вдокода является оправданным, имеет место при необходимости сохранить права собствен-ности, то есть когда вы хотите исключить возможность применения вашего алгоритма другими лицами.
Как MATLAB передает аргументы функции
С точки зрения программиста создается впечатление, чтоMATLAB передает функции все ар-гументы в виде их значений. В действительности, однако, MATLAB передает значения толь-ко тех аргументов, которые изменяются данной функцией. Если функция не изменяет соот-ветствующий аргумент, а просто использует его при вычислениях, MATLAB передает аргу-мент в виде ссылки на него (на его расположение в памяти) с целью оптимизации использо-вания памяти.
Рабочие пространства функций
Каждая М-функция имеет в памяти свое рабочее пространство, отдельное от основного рабо-чего пространства MATLAB-а, в котором она работает. Это пространство называется рабо-чим пространством функции, причем разные функции имеют разные рабочие пространства.
При использовании MATLAB-а, вы имеете доступ только к тем переменным, которые нахо-дятся в вызывемом контексте, будь это основное рабочее пространство или рабочее прост-ранство какой-то функции. Переменные, которые вы передаете функции, должны быть рас-положены в пространстве вызова, и , в свою очередь, функция возвращает выходные аргу-менты в то же самое рабочее пространство вызова. Вы можете, однако, определить перемен-ные как глобальные, что дает возможность доступа к ним из разных рабочих пространств.
Проверка числа аргументов функции
Функции nargin и nargout позволяют вам определить число входных и выходных аргумен-тов функции. Вы можете использовать эти функции с условными операторами для выполне-ния различных задач в зависимости от числа аргументов. Например,
function c = testarg1(a,b)
if (nargin == 1)
c = a.^2;
elseif (nargin == 2)
c = a + b;
end
При одном входном аргументе, данная функция вычисляет квадрат входной величины. Если заданы два входных аргумента, функция осуществляет их сложение.
Передача переменного числа аргументов
Функции varargin и varargout дают возможность передачи функции любого переменного числа аргументов или возвращать переменное число выходные аргументов. При использова-нии функци varargin MATLAB объединяет все заданные входные аргументы в массив яче-ек. Если вы используете функцию varargout, то ваша программа должна обеспечить объе-динение выходных переменных в массив ячеек, с тем чтобы MATLAB имел возможность вернуть их в пространство вызова. Ниже дан пример функции, которая принимает любое число двумерных векторов, и наносит на графике линию, соединяющую соответствующие точки.
function testvar (varargin)
for i = 1:length (varargin)
x(i) = varargin{i}(1);
y(i) = varargin{i}(2);
end
xmin = min(0,min(x));
ymin = min(0,min(y));
axis([xmin fix(max(x)) + 3 ymin fix(max(y)) + 3])
plot(x,y)
Функция testvar рабоает с различным числом входных переменных; например, вы можете ввести два различных набора данных
testvar ([2 3], [1 5], [4 8], [6 5], [4 2], [2 3])
testvar ([–1 0], [3 –5], [4 2], [1 1])
Распаковка содержимого функции varargin
Поскольку функция varargin содержит все входные аргументы в виде массива ячеек, для из-влечения данных необходимо использовать соответствующую индексацию. Например,
y(i) = varargin{i} (2);
Индексация ячеек имеет два набора компонент – первый набор указывает ячейку и заключен в фигурные скобки, а второй набор относится к содержимому ячейки и заключен в обычные скобки. В приведенном выше операторе выражение {i} обозначает обращение к i-ой ячейке в varargin, а выражение (2) представляет второй элемент содержимого выбранной ячейки.
Упаковка выходных переменных в функцию varargout
Когда вы хотите использовать произвольное число выходных аргументов, вы должны преду-смотреть процедуру упаковки выходных переменных в массив ячеек varargout. При этом, для определения конкретного числа вызываемых выходных аргументов используйте функ-цию nargout. Например, приведенный ниже пример принимает входной массив в виде двух столбцов, где первый столбец характеризует набор данных по оси x, а второй столбец – соот-ветствующий набор данных по оси y . Данные наборы разбиваются на отдельные пары век-торов [xi yi], которые вы можете передать описанной выше функции testvar.
function [varargout] = testvar2 (arrayin)
for i = 1:nargout
varargout {i} = arrayin (i, :)
end
Оператор присваивания в цикле for использует синтаксис индексации массивов ячеек. Вот пример применения функции testvar2:
a = {1 2; 3 4 ; 5 6 ; 7 8; 9 0};
[p1, p2, p3, p4, p5] = testvar2 (a);
Место функций varargin и varargout в списке аргументов
Функции varargin или varargout должны быть последними в списке аргументов, при этом они могут быть расположены после любого числа входных или выходных переменных. Это значит, что в строке определения функции следует сперва указать требуемые входные или выходные аргументы. Например, следующие строки определения функций показывают правильное применение varargin и varargout.
function [out1,out2] = example1(a,b,varargin)
function [i,j,varargout] = example2(x1,y1,x2,y2,flag)
Локальные и глобальные переменные
Каждая исполняемая функция MATLAB-а, определенная некоторым М-файлом, имеет свои собственные локальные переменные расположенные в своем рабочем пространстве, которые отделены от локальных переменных других функций и переменных в основном рабочем про-странстве. Однако, если несколько функций и, возможно, основное рабочее пространство, объявляют некоторую конкретную переменную глобальной, то все эти функции и основное рабочее пространство будут иметь доступ к данной переменной. Любое изменение глобаль-ной переменной, произведенное в пространстве какой-либо одной функции, немедленно воспринимается всеми остальными функциями, где эта переменная объявлена глобальной. Допустим, вы хотите изучить эффект изменения коэффициентов взаимосвязей a и b, в диф-ференциальном уравнении Лотки-Вольтера (Lotka-Volterra), известного как модель хищника-жертвы.
dy1/dt = y1 - ay1y2
dy2/dt = y2 - by1y2
Создадим М-файл lotka.m.
function yp = lotka(t,y)
global ALPHA BETA
yp = [y(1) – ALPHA*y(1)*y(2); –y(2) + BETA*y(1)*y(2)];
Затем введем последовательно в командное окно следующие выражения
global ALPHA BETA
ALPHA = 0.01
BETA = 0.02
[t,y] = ode23('lotka',0,10,[1; 1]);
plot(t,y)
Объявление переменных ALPHA и BETA глобальными в командной строке позволяет ме-нять соответствующие значения внутри функции заданной файлом lotka.m. Интерактивное изменение данных переменных в командном окне приводит к получению новых решений без каких-либо редактирований текста файла.
Для работы в ваших приложениях с глобальными переменными следует:
q Объявить соответствующую переменную глобальной в каждой функции, где пре-дусмотрено ее использование. Для обеспечения доступа к глобальной переменной из командного окна нужно объявить данную переменную глобальной также и в командной строке.
q В каждой функции объявите переменную глобальной до первого появления ее имени в тексте файла. Обычно рекомендуется объявлять переменные глобальными в начале М-файла.
Глобальные переменные в MATLAB-е обычно имеет более длинные имена и иногда записы-ваются заглавными буквами.Это не является настоятельным требованием, но упрощает чте-ние файлов и уменьшает риск случайного изменения глобальной переменной.
Перманентные переменные (Persistent Variables)
Переменная может быть объявлена перманентной (постоянной) – при этом она не меняет своего значения между ее последовательными вызовами. Перманентные переменные могут быть использованы только в пределах определенной функции. Эти переменные остаются в памяти до удаления М-файла из памяти или его изменения. Во многих отношениях перма-нентные переменные аналогичны глобальным, за тем исключением, что их имя не находится в глобальном рабочем пространстве, а их значение сбрасывается при изменении М-файла или удаления из памяти.
Для работы с перманентными переменными в MATLAB-е предусмотрены три функции:
Функция |
Описание |
mlock |
Исключает возможность удаления М-файла из памяти |
munlock |
Возвращает М-файлу возможность его удаления из памяти |
mislocked |
Указывает, может ли М-файл быть удален из памяти |
Специальные переменные
Несколько функций возвращают важные специальные значения, которые вы можете исполь-зовать в ваших М-файлах.
Функция |
Возвращаемое значение |
ans |
Последний ответ (переменная). Если вы не присваиваете выходной переменной или вычисляемому выражению какое-либо имя, MATLAB автоматически запоминает результат в переменной ans. |
eps |
Относительная точность вычислений с плавающей запятой. Это допуск, который MATLAB использует при вычислениях. |
realmax |
Наибольшее число с плавающей запятой. |
realmin |
Наименьшее число с плавающей запятой. |
pi |
3.1415926535897... |
i, j |
Мнимая единица. |
inf |
Бесконечность. Вычисления вида n/0 где n – любое ненулевое реально число, дает в результате inf. |
NaN |
Не численное значение (Not-a-Number). Выражения вида 0/0 и inf/inf дают в результате NaN, так же как и арифметические операции содержащие NaN. Выражения типа n/0, где n явля- ется комплексным числом, также возвращают NaN. |
computer |
Тип компьютера. |
version |
Строка, содержащая версию MATLAB-а. |
Вот несколько примеров, где используются эти переменные.
x = 2*pi;
A = [3 + 2i 7 – 8i];
tol = 3*eps;
Типы данных
Всего в MATLAB –е имеется 14 базовых типов (или классов) даных. Каждый из этих типов данных является формой массива. Этот массив может иметь минимальный размер 0х0 и мо-жет иметь произвольную размерность по любой координате. Двумерные варианты таких массивов называются матрицами.Все 14 базовых класса типов данных показаны на приве-денной ниже диаграмме. Дополнительно, тип данных, определенных пользователем, пока-занный ниже как user class (класс пользователя), является подмножеством данных типа структуры.
Тип данных char содержит символы данные в коде Unicode. Строка символов является про-сто массивом символов размера 1хn. array of characters. Вы можете использовать тип данных char для хранения массивов строк, при условии, что все строки массива имеют одинаковую длину (это является следствием того, что все массивы MATLAB-а должны быть прямоуголь-ными). Для хранения массива строк разной длины нужно использовать массив ячеек.
Числовые типы данных включают целые числа со знаком и без знака, числа в формате пла-вающей запятой одинарной и двойной точности, и разреженные массивы (sparse arrays) двойной точности.
Сказанное ниже сохраняется в силе для всех типов числовых данных в MATLAB-е:
q Все вычисления в MATLAB-е выполняются с двойной точностью.
q Целые числа и числа одинарной точности обеспечивают более эффективное использование памяти по сравнению с числами двойной точности.
q Все типы данных поддерживают базовые операции над массивами, такие как исполь-зование индексов и измерение размеров массива.
q Для выполнения математических операций над целыми числами или массивами с оди-нарной точностью представления, вы должны первратить их в массивы с двойной точ-ностью при помощи функции double.
Операторы
Операторы системы MATLAB делятся на три категории:
q Арифметические опреаторы, осуществляющие численные вычисления.
q Операции отношения, которые осуществляют численное сравнение операндов.
q Логические операторы, включающие AND (логическое И), OR (логическое ИЛИ), и NOT (логическое отрицание НЕ).
Арифметческие операторы
MATLAB обеспечивает следующие арифметические операторы
Операторы | Описание |
+ |
Сложение |
- | Вычитание |
.* | Умножение |
./ | Правое деление |
.\ | Левое деление |
+ | Унарный плюс (изменение знака объекта) |
- | Унарный минус |
: | Оператор двоеточия |
.^ | Степень |
.’ | Транспонирование |
‘ | Комплексно-сопряженное транспонирование |
* | Матричное умнжение |
/ | Матричное правое деление |
\ | Матричное левое деление |
^ | Степень матрицы |
Арифметические операторы и массивы
За исключением некоторых матричных операторов, арифметические операторы MATLAB-а работают с соответствующими элементами массивов одинаковой размерности. Для векторов и прямоугольных массивов, оба операнда должны иметь одинаковый размер, или же один из них должен быть скаляром. Если один операнд является скаляром, а второй - нет, MATLAB применяет данный скаляр ко всем элементам второго операнда; данное свойство известно как скалярное расширение (scalar expansion).
Следующий пример иллюстрирует свойство скалярного расширения при вычислении произ-ведения скалярного опренда и матрицы
A = magic(3)
A =
8 1 6
3 5 7
4 9 2
Введем
3 * A
что дает
ans =
24 3 18
9 15 21
12 27 6
Операторы отношения
MATLAB обеспечивает следующие операторы отношения
Операторы | Описание |
< | Меньше чем |
<= | Меньше чем или равно |
> | Больше чем |
>= | Больше чем или равно |
== | Равно |
~= | Не равно |
Операторы отношения и массивы
Операторы отношения в MATLAB-е сравнивают соответствующие элементы двух массивов с одинаковыми размерностями. Эти операторы всегда действуют поэлементно. В приведен-ном ниже примере, результирующая матрица показывает, где элемент матрицы A равен со-ответствующему элементу матрицы B.
A = [2 7 6; 9 0 5; 3 0.5 6];
B = [8 7 0; 3 2 5; 4 –1 7];
A == B
ans =
0 1 0
0 0 1
0 0 0
Для векторов и прямоугольных массивов, оба операнда должны иметь одинаковый размер или один из них должен быть скаляром. В случае когда один операнд является скаляром, а второй – нет , MATLAB проверяет данный скаляр с каждым элементом другого операнда. Те положение, где заданное отношение является истинным, принимают значение 1. Положение, где отношение является ложным, принимают значение 0.
Операторы отношения и пустые массивы
Операторы отношения работают и с массивами, у которых какая-либо размерность равна ну-лю (что приводит к пустому массиву), если оба массива имеют одинаковый размер или же один из них является скаляром. Однако, выражения вида
A == [ ]
приводят к ошибке, если только массив А не имеет размеры 0х0 или 1х1. Для проверки явля-ется ли данный массив пустым, следует использовать специальную функцию isempty(A).
Логические операторы
MATLAB обеспечивает следующие логические операторы
Оператор | Описание |
& | AND (логическое И) |
| | OR (логическое ИЛИ) |
~ | NOT (логическое НЕ) |
Внимание ! В дополнение к этим логическим операторам, в директории ops имеются нес-колько функций, предназначенных для побитовых (поразрядных) логических операций.
Каждый логический оператор имеет специфичный набор правил, которые определяют резу-льтат логического выражения:
q Выражения использующие оператор И (&), истинны, если истинны оба операнда. При численных элементах, выражение является истинным, если оба операнда ненулевые. Следующий пример показывает операцию логического И для двух векторов
u = [1 0 2 3 0 5];
v = [5 6 1 0 0 7];
u & v
ans =
0 0 1 0 0 1
q Выражения, использующие оператор ИЛИ ( | ), являются истинными если один из операндов является истинным. Выражения с ИЛИ являются ложными только если ло-жными являются оба операнда. При численных элементах, выражение является лож-ным, елси только оба операнда равны нулю. Для приведенных выше векторов u и v имеем
u | v
ans =
1 1 1 1 0 1
q Выражения, использующие оператор ~ выполняют логическое отрицание. Это дает ложный результат, если операнд является истинным и истинный, если операнд явля-ется ложным. При численных элементах, любой ненулевой операнд становится нулев-ым (логическим нулем), а любой нулевой элемент становится равным (логической) единице. Рассмотри операцию логического отрицания вектора u
~u
ans =
0 1 0 0 1 0
Использованием логических операторов с массивами
Логические операторы MATLAB-а сравнивают соответствующие элементы массивов одина-ковой размернсти. Для векторов или прямоугольных массивов, оба операнда должны иметь одинаковый размер, или один из них должен быть скаляром. Если один из элементов являе-тся скаляром, а второй – нет, то здесь также имеет место описанное выше свойство скалярно-го расширения.
Логические функции
В дополнение к логическим операторам, MATLAB имеет ряд логических функций.
Функция | Описание | Примеры |
xor |
Выполняет операцию исключающего ИЛИ над своими операндами. При числовых элементах, функция возвращает 1 если один из операндов ненулевой, а второй - нулевой |
a = 1; b = 1; xor(a,b) ans = 0 |
all |
Возвращает 1, если все элементы ее аргумента являются истинными или не равны нулю; в противном случае результат равен логическому нулю. Над матрицами функция all работает вдоль столбцов |
A = [0 1 2; 3 5 0] A = 0 1 2 3 5 0 all(A) ans = 0 1 0 |
any |
Возвращает единицу, если любой из аргументов является истинным или ненулевым; в против-ном случае вовращает 0. Как и all , any работает вдоль столбцов матриц. |
v = [5 0 8]; any(v) ans = 1 |
Ряд других функций MATLAB-а выполняет логические операции. Например, функция isnan возвращает 1 для NaN; функция isinf возвращает 1 для Inf. Более подробный список можно найти в директории ops.
Логические выражения использующие функцию find
Функция find определяет индексы числового массива, удовлетворяющие заданному логичес-кому условию. Эта функция удобна для создания логических масок (шаблонов) и матриц ин-дексов. В наиболее общей форме, функция find возвращает единственный вектор индексов. Этот вектор может быть использован для индексации массивов любого размера или формы. Например, в приведенном ниже примере функция find позволяет легко заменить все элемен-ты матрицы А больше 8 на число 100:
A = magic(4)
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
i = find (A > 8);
A(i) = 100
A =
100 2 3 100
5 100 100 8
100 7 6 100
4 100 100 1
Вы можете также использовать функцию find для получения обеих индексов строк и стол-бцов прямоугольных матриц, удовлетворяющих заданному логическому условию (более под-робно эта функция описана в справочниках).
Приоритеты операторов
Вы можете строить выражения, использующие любую комбинацию арифметических и логи-ческих операторов, а также операторов отношения. Уровни приоритетов этих операторов определяют порядок, в котором MATLAB обрабатывает выражение. В пределах каждого уровня приоритета, операторы имеют одинаковый приоритет и оцениваются (обрабатыва-ются) слева направо. Последовательность приоритетов для операторов MATLAB-а приве-дены ниже, упорядоченные в порядке убывания приоритетов, то есть от высшего приоритета к низшему.
Изменение приоритетов операторов
Имеющаяся последовательность приоритетов может быть изменена путем использования обычных скобок, как это показано в следующем примере.
A = [3 9 5];
B = [2 1 5];
C = A ./ B.^2
C =
0.7500 9.0000 0.2000
C = (A. / B) .^2
C =
2.2500 81.0000 1.0000
Выражения могут также содержать переменные, заданные посредством индексов
b = sqrt (A(2)) + 2*B(1)
b =
7
Команды управления данными (Flow Control)
В MATLAB-е имеются 8 базовых команд для управления потоками данных:
• if, совместно с else и elseif, осуществляет обработку группы выражений, основываясь на
некотором логическом условии.
• switch, совместно с case и otherwise, обрабатывает различные группы выражений, основы-
ваясь на значении некоторого логического условия.
• while осуществляет обработки группы выражений неопределенное число раз, основываясь
на некотором логическом условии.
• for осуществляет обработку группы выражений определенное (заданное) число раз.
• continue передает управление к следующей итерации в циклах for или while , пропуская
все оставшиеся выражения в теле цикла.
• break прекращает обработку выражений и выходит из циклов, созданных командами for
или while.
• try...catch изменяет последовательность выполнения команд, если во время выполнения
программы получено сообщение об ошибке.
• return приводит к прекращению выполнения данной программы и к возврату в вызываю-
щую функцию.
Все конструкции программ, основанные на логических условиях, используют команду end для указания конца соответствующего блока.
Внимание! Во многих случаях вы можете ускорить выполнение программ MATLAB-а, путем замены циклов с командами for и while векторными выражениями (см. ниже).
Команды if, else, and elseif
Команда if оценивает логическое выражение и обрабатывает группу операторов, основыва-ясь на значении указанного выражения. В свое простейшей форме синтаксис команды имеет вид
if (логическое выражение)logical_expression
операторы
end
Если логическое выражение истинно, то есть равно 1, MATLAB выполняет все операторы между строками, содержащими команды if и end . После этого он продолжает выполнять ко-манды. находящиеся за строкой с end. Если логическое выражение ложно, то есть дает логи-ческий 0, MATLAB перескакивает через все выражения между строками с if и end , и про-должает свою работу со строки, следующей за командой end. Например,
if rem (a,2) == 0
disp('a is even')
b = a/2;
end
Данный блок проверяет, является ли входной аргумент четным числом и, если да, то выводит в комндную строку соответствующее сообщение и делить число а пополам. В противном случае, данный блок не выполняется. Между строками с if и end вы можете включить произ-вольное число операторов, содержащих, в свою очередь, любые команды и циклы. Если ло-гическое выражение приводит к нескалярной величине, то для выполнения блока все элемен-ты аргумента должны буть ненулевыми. Например, допустим X является матрицей. Тогда выражение
if X
операторы
end
эквивалентно следующему
if all(X(:))
операторы
end
При использовании с if , команды else и elseif дают следующие дополнительные возможно-сти создания программ:
• Команда else не имеет логического условия. Операторы, связанные с данной командой вы-
полняются, если предшествующее условие команды if (и, возможно, elseif) является лож-
ным.
• Команда elseif имеет логическое условие, которое оценивается, если предшествующее ус-
ловие команды if (и, возможно, elseif), является ложным. Если логическое условие данной
команды elseif является истинным, то выполняются соответствующие операторы, следую-
щие за данной командой. Вы можете иметь произвольное число команд elseif в пределах
одного блока с if.
if n < 0 % Если n отрицательно, дать сообщение об ошибке
disp('Input must be positive');
elseif rem (n, 2) == 0 % Если n положительно и четно, разделить на 2.
A = n/2;
else
A = (n+1) /2; % Если n положительно и нечетно, прибавить 1 и
% разделить на два.
end
Команда if и пустые массивы
Если логическое условие, связанное с if, приводит к нулевому массиву, то оно оценивается как ложное. Например, если А является пустым массивом, то следующий блок
if A
S1
else
S0
end
выполняет оператор S0.
Команда switch
Команда switch осуществляет обработку определенных операторов, исходя из значения пере-менной или выражения. Ее базовая форма имеет вид
switch выражение (скаляр или строка символов)
case значение 1
операторы % Выполняются если выражение == значение 1
case значение 2
операторы % Выполняются если выражение == значение 2
.
.
.
otherwise
операторы % Выполняются если выражение не соответствует не одному
% значению, связанному с командами case
end
Данный блок состоит из:
• Слова switch за которым следует выражение которое нужно оценить..
• Любого числа блоков с командами case. Эти блоки состоят из слова case, за которым на той же строке следует возможное значение выражения за словом switch. Последующие строки содержат операторы, которые необходимо выполнить при указанном значении выражения в первой строке за словом switch. Эти строки могут быть любыми допустимыми выражени-ями, включая другие циклы switch. Выполнение группы операторов, связанных с данной ко-мандой case прекращается, когда MATLAB встречает следующую команду case или слово
otherwise. Отметим, что всегда выполняется только первый подходящий блок с case.
• Не обязательной группы операторов, начинающихся словом otherwise; эта группа обраба-тывается, если значение выражения не было перехвачено каким-либо предшествующим бло-ком с case. Обработка группы операторов за словом otherwise прекращается на команде end.
• Заключительной команды end.
Блок с командой switch работает путем сравнения входного выражения, которе может быть численным скаляром или строкой символов, с каждым значением ключей case. В случае чис-ленных выражений выполняется какой-либо (первый) блок, если справедливо логическое ра-венство значение == выражение. При выражениях в виде строки символов, блок выполня-ется, если истинно выражение strcmp(значение,выражение) (команда strcmp осуществляет логическое сравнение строк символов) .
Приведенный ниже код дает простой пример использования команды switch. Он проверяет переменную input_num и сравнивает ее с заданными числами. Если значения input_num равны –1, 0, или 1, команды case производят вывод значений на экран в виде текста. Если переменная input_num не равна не одному из указанных значений, выполнение переходит к строке otherwise и программа выводит на экран текст 'other value' («другое значение»).
switch input_num
case –1
disp('negative one');
case 0
disp('zero');
case 1
disp('positive one');
otherwise
disp('other value');
end
Внимание ! В отличие от соответствующих операторов языка C, оператор switch в MATLAB-е «доходит» только до первого оператора case, который удовлетворяет заданному входному выражению; остальные операторы case при этом не проверяются.
Команда switch позволяет оперировать с несколькими условиями при одном операторе case, путем заключения данных условий в фигурные скобки, то есть при их записи в виде массива ячеек. Соответствующий пример приводится ниже
switch var
case 1
disp('1')
case {2,3,4}
disp('2 or 3 or 4')
case 5
disp('5')
otherwise
disp('something else')
end
Команда while
Циклы с командой while обрабатывают оператор или группу операторов, находящихся в теле цикла, до тех пор, пока истинно проверяемой логическое условие при данной команде. Иными словами, операторы внутри цикла могут выполнться любое неопределенное заранее число раз. Ее синтаксис в общем случае имеет вид
while expression
statements
end
Если логическое выражение expression имеет матричный вид, то для продолжения выполне-ния цикла все его элементы должны быть истинными, то есть равны логической единице. Чтобы привести матричное условие к скалярному, следует воспользоваться функциями all и any. Например, следующий цикл находит первое целое число n, для которого факториал n! является 100-значным числом
n = 1;
while prod(1:n) < 1e100
n = n + 1;
end
Для выхода из петли while в любой момент нужно применить в теле цикла команду break. При этом, естественно, следует сформировать соответствующее логическое условие выхода из цикла.
Команда while и пустые массивы
Если условие при while сводится к пустому массиву, то оно соответствует ложному выраже-нию, то есть последовательность команд
while A
S1;
end
никогда не выполнит оператор S1 если A есть пустой массив.
Команда for
Цикл с командой for обрабатывает оператор или группу опреаторов заранее заданное число раз. Ее синтаксис имеет вид
for index = start:increment:end
statements
end
где index – является изменяемым целочисленным индексом с начальным и конечным значе-ниями start и end и приращением increment. По умолчанию, приращение равно 1, но вы мо-жете задать любое приращение, включая и отрицательное. При положительных индексах, выполнение прекращается когда значение индекса превышает конечное значение end; при отрицательных приращениях выполнение прекращается когда индекс становится меньше конечного значения.
Например, следующий цикл выполняется пять раз.
for i = 2:6
x(i) = 2*x (i–1);
end
Вы можете использовать вложенные циклы с комндой for:
for i = 1:m
for j = 1:n
A (i, j) = 1/(i + j – 1) ;
end
end
Внимание ! Вы можете зачастую ускорить выполнение кодов в MATLAB-е путем замены циклов с for и while векторизованными кодами (см. ниже).
Использование в качестве индексов массивов
Индексы команды for могут быть массивом значений. Например, рассмотрим массив А раз-мера m х n . Выражение
for i = A
statements
end
приравнивает индекс I вектору A(: , k). При первой итерации значение k равно 1; при второй итерации k равно 2 , и так до тех пор, пока k не становится равным n. Иными словами, цикл повторяется n раз, где n есть число столбцов в A. При этом, при каждой итерации индекс i является вектром, содержащим один из столбцов матрицы A.
Команда continue
Команда continue передает управление следующей итерации в циклах for или while, что приводит к перескакиванию через все оставшиеся операторы в теле цикла. В случае вложен-ных циклов, команда continue передает управление к следующей итерации внешних по отно-шению к данному циклу команд for или while , то есть пропускаются только оставшиеся опе-раторы данного внутреннего цикла. Для применения данной команды нужно сформировать соответствующее логическое условие.
Команда break
Команда break прекращает выполнение циклов, образованных командами for или while. Ко-гда в теле цикла встречается данная команда, дальнейшее выполнение происходит начиная со следующей строки вне данного цикла. Во вложенных циклах, команда break приводит к выходу только из внутреннего цикла.
Команды try ... catch
Общая форма последовательности команд try ... catch имеет вид
try
statement,
...,
statement,
catch,
statement,
...,
statement,
end
В данной последовательности выполняются операторы между командами try и catch до тех пор, пока не происходи какая-либо ошибка вычислений. Тогда управление передается («пе-рехватывается») последовательносью операторов между командами catch и end. Для того чтобы узнать причину, приведшую к ошибке, можно воспользоваться комндой lasterr (пос-ледняя ошибка). Если ошибка случается между командами catch и end, то MATLAB прек-ращает вычисления, если только между предыдущими командами catch и end не установле-на другая последовательность команд try ... catch.
Команда return
Команда return прекращает выполнение текущей последвательности команд и возвращает управление в вызывающую функцию (то есть «родительскую» функцию, из которой была вызвана текущая функция) или же возвращает управление к клавиатуре. Команда return так-же приводит к окончанию режима keyboard (последняя команда, когда встречается в теле программы, передает управление клавиатуре; она часто используется при отладке програм-мы). При обычных условиях работы вызванная функция передает управление в вызываю-щую функцию когда первая выполнена полностью, то есть до конца. Команда return может быть включена в тело вызываемой функции для того чтобы прекратить ее исполнение при выполнении определенных условий.
Подфункции
М-функции могут содержать коды более чем одной функции. Первая функция в файле являе-тся главной функцией (primary function), которая имеет имя самого М-файла. Дополнитель-ные функции в пределах данного файла являются подфункциями (subfunctions), которые «ви-дны» (то есть могут быть вызваны) только для главной функции или других подфункций то-го же файла. Каждая подфункция начинается со своей линии определения. Все подфункции следуют непосредственно друг за другом. Порядок следования различных подфункций не имеет никакого значения, при этом главная функция должна быть обязательно записана пер-вой. Например,
function [avg,med] = newstats(u) % Главная функция
% NEWSTATS Находит среднее значение и медиану при помощи внутренних
% подфункций.
n = length(u);
avg = mean(u,n);
med = median(u,n);
function a = mean(v,n) % Подфункция
% Находит среднее значение.
a = sum(v)/n;
function m = median(v,n) % Подфункция
% Находит медиану.
w = sort(v);
if rem(n,2) == 1
m = w((n+1)/2);
else
m = (w(n/2)+w(n/2+1))/2;
end
Подфункции mean и median вычисляют среднее значение и медиану входных данных. Глав-ная функция newstats находит длину входного вектора данных и вызывает подфункции, пе-редавая им данные длины n. Функции в пределах одного и того же файла не имеют общего доступа к каким-либо переменным, если только вы не объявите эти переменные глобальными или же не передадите их в виде аргументов в соответствующие подфункции, как это реализовано в приведенном выше примере. Кроме того, все средства помощи («help») име-ют доступ только к главной функции в М-файле. Когда вы вызываете какую-либо функцию из М-файла, MATLAB прежде всего проверяет, не является ли данная функция подфункци-ей. Затем проверяется, не является ли данная функция частной функцией (private function), описанной в следующем разделе, и далее ищутся стандартные М-файлы на путях доступа
MATLAB . Поскольку подфункции проверяются первыми, вы можете «подавить» вызов лю-бого существующего М-файла путем применения подфункций с тем же именем, как, напри-мер, мы имели в примере с функцией mean. Вместе с тем, в пределах одного М-файла все подфункции должны иметь разные индивидуальные имена.
Частные функции
Частные функции являются функциями, которые находятся в подкаталоге со специальным именем private (частный). Они видны, то есть могут быть вызваны, только из функций в пре-делах родительского каталога. Например, допустим, что каталог newmath находится на пу-тях доступа MATLAB-а. Подкаталог в данной директории newmath, названный private, со-держит только функции, которые могут быть вызваны из каталога newmath. Поскольку ча-стные функции являются невидимыми вне пределов родительского каталога, они могут ис-пользовать имена, совпадающие с именами функций в других каталогах. Это свойство быва-ет полезным, если вы хотите создать свою версию какой-либо конкретной функции, сохраняя в то же время оригинальную функцию в другом каталоге. Так как MATLAB ищет среди част-ных функций прежде чем перейти к поиску в остальных каталогах, он всегда найдет частную функцию, например с именем test.m, раньше чем любую другую М-функцию, названную тем же именем test.m, но расположенную в других каталогах. Вы можете создавать свои частные директории просто путем создания стандартных подкаталогов, названных private. При этом не следует помещать директории private на ваших путях доступа.
Приложение 1. Тематические направления системы MATLAB
дифференциальных уравнений (ODE solvers)
(Graphical User Interface (GUI))
коммуникации (CDMA Reference Blockset)
(Communications Blockset)
Blockset)
(Financial Derivatives Toolbox)
Toolbox)
(Fixed-Point Blockset)
(Instrument Control Toolbox)
неравенств (LMI Control Toolbox)
Control Toolbox)
Synthesis Toolbox)
Control Design Blockset)
конечных элементов (Partial Differential Equation Toolbox)
Blockset)
Simulink (Real-Time Workshop Embedded Coder)
Identification Toolbox)
Toolbox)
времени (xPC Target)
Примечание. Нзвание каждого тематического направления определяет соответствую-щую директорию (каталог) системы MATLAB.
Приложение 2. Команды общего назначения (General purpose commands)
Директория - matlab\general
Общая информация (General information)
browser).
Управление рабочим пространством ( Managing the workspace)
формате, с указанием размеров, числа байтов и классов.
Browser), т.е.специальный Графический Интерфейс Пользователя (GUI)
для выполнения действий с переменными рабочего пространства.
Управляющие команды и функции (Managing commands and functions)
командное окно.
функциям и файлам.
Управление командным окном (Controlling the command window)
Команды операционной системы (Operating system commands)
Отладка М-файлов ( Debugging M-files)
сверху вниз.
номеров строк.
снизу вверх.
Профилировщик М-файлов (Profiling M-files)
Функции для определения местонахождения зависимых функций М-файла (Tools to locate dependent functions of an M-file).
от которых зависит М-файл.
Директория - matlab\ general
Арифметические операторы (Arithmetic operators)
Операторы отношения (Relational operators)
Логические операторы (Logical operators)
Специальные символы (Special characters.)
Операторы побитовой обработки (Bitwise operators)
Операторы обработки множеств (Set operators)
(Elementary math functions).
Директория matlab\elfun
Тригонометрические функции (Trigonometric)
Экспоненциальные функции (Exponential)
Комплексные числа (Complex)
частей.
Округление и остатки (Rounding and remainder)
division).
(Elementary matrices and matrix manipulation)
Директория matlab\elmat
Элементарные матрицы и векторы (Elementary matrices)
трехмерных графиков).
индексирование матриц.
Основная информация о массивах (Basic array information)
Преобразования матриц (Matrix manipulation)
транспонирование).
Специальные символы, переменные и константы (Special variables and constants)
Специальные типы матриц (Specialized matrices)
проблемы собственных значений).
задачи на собственные значения.
Приложение 6. - Матричные функции и линейная алгебра
(Matrix functions - numerical linear algebra)
Директория matlab\matfun
Матричный анализ (Matrix analysis)
Линейные уравнения (Linear equations)
операторы)
мощи вычислителя пакета LAPACK (LAPACK reciprocal condition estimator).
Собственные значения и сингулярные числа (Eigenvalues and singular values)
модулями).
eigenvalue problem).
Вычисление функций от матриц (Matrix functions).
собственных векторов.
Утилиты для процедур факторизации матриц (Factorization utilities)
комплексной диагональной форме.
действительной диагональной форме.
собственных значений.
Приложение 7. Полиномы и интерполяция (Interpolation and polynomials)
Директория matlab\polyfun
Интерполяция данных (Data interpolation)
Фурье.
Интерполяция сплайнами (Spline interpolation)
Геометрический анализ (Geometric analysis)
Полиномы (Polynomials)
полинома с заданными корнями.
Директория matlab\datafun
Основные операции (Basic operations)
Конечные разности (Finite differences)
Корреляционные соотношения (Correlation)
Фильтрация и свертка (Filtering and convolution)
Преобразование Фурье (Fourier transforms)
Приложение 9. Функции обработки символьных строк (Character strings)
Директория matlab\strfun
Общие (General)
Проверка строк (String tests)
Операции над строками (String operations)
Преобразования строк (String to number conversion)
Преобразование систем счисления (Base number conversion)
точности.
Справочник по базовым функциям
системы MATLAB
Функция PLOT
Назначение - Двумерный линейных график
Синтаксис - plot(Y)
plot(X1, Y1, ...)
plot(X1, Y1, LineSpec, ...)
plot(..., 'PropertyName', PropertyValue, ...)
h = plot(...)
Описание. Если прямоугольный числовой массив Y является действительным, то функция plot(Y) строит линейные графики столбцов массива Y в зависимости от индексов их элементов. Если Y содержит комплексные числа, то запись plot(Y) эквивалентна записи plot(real(Y), imag(Y)). Во всех остальных случаях, при использовании plot мнимые компо-ненты игнорируются.
Команда plot(X1, Y1, ...), где количество пар массивов может быть произвольным, осуществ-ляет следующие построения.
· Если оба массива одномерные, то строится линейный график функции, где одномер-ный массив X1 соответствует значениям аргумента, а одномерный массив Y1 – зна-чениям функции.
· Если оба массива X1 и Y1 – двумерные (они должны иметь при этом одинаковую размерность), то строятся попарно линейные зависимости столбцов Y1 от соответст-вующих столбцов X1.
· Если массив Y1 двумерный, а массив X1 одномерный, то строятся линейные графики всех столбцов или строк массива Y1 в зависимости от элементов вектора X1. Выбор столбцов или строк массива Y1 здесь определяется размерностью вектора X1, то есть это могут быть и столбцы и строки (если массив Y1 - квадратный, то приоритет отда-ется столбцам)
· Если двумерным является массив X1, а массив Y1 одномерный (то есть вектор), то строятся графики столбцов или строк массива X1 в зависимости от элементов векто-ра Y1 (см. также предыдущий вариант).
Функция plot(X1, Y1, LineSpec,...) осуществляет приведенные выше построения, причем в спецификации линий LineSpec можно указать типы линий, символы маркеров и их цвета. Вы можете комбинировать тройки Xn, Yn, LineSpec с парами Xn, Yn, т.е. задавать специ-фикации LineSpec только для некоторых пар массивов, например: plot(X1, Y1, X2, Y2, LineSpec, X3, Y3).
Функция plot(... , 'PropertyName', PropertyValue,...) устанавливает свойство всех постро-енных линий, указанное строкой 'PropertyName', в соответствие с его значением, заданным в PropertyValue (См. раздел «Примеры» ниже).
h = plot(...) возвращает вектор-столбец всех дескрипторов (handles) построенных на графи-ке линий, по одному дескриптору на каждую линию.
Замечания. Если вы не задаете цвета при построении более чем одной линии, то функция plot циклически выбирает последовательные цвета так, как они указаны в свойстве ColorOrder текущих осей. После того как все цвета, определенные в ColorOrder, будут ис-пользованы, функция plot использует циклически стили линий (line styles) так, как они определены в свойстве LineStyleOrder текущих осей. При этом, после перехода к каждому новому стилю линии, происходит циклический выбор всех определенных цветов. Отметим, что по умолчанию, система MATLAB восстанавливает свойства ColorOrder и LineStyleOrder при каждом новом вызове функции plot. Если вы хотите сохранить введенные вами в данные свойства изменения, то вы должны задать эти изменения как значения по умолчанию. Например, команда
set(0, 'DefaultAxesColorOrder', [0 0 0], 'DefaultAxesLineStyleOrder', '-|-.|--|:')
задает на корневом (экранном) уровне использование только черного цвета при построении линий (свойство ColorOrder), а также использование следующих стилей линий (свойство LineStyleOrder) : сплошная линия (-), штрих-пунктирная линия (-.), штриховая линия (--) и пунктирная линия (:).
Дополнительная информация
• Для получения более обширной информации по заданию стилей и цветов линии см. раз-дел LineSpec.
1. Задание цвета и размера маркеров
Помимо цвета и стиля, имеется также возможность задавать и другие графические харак-теристики линий (более подробное описание этих свойств дано в описании функции line):
• LineWidth – задание ширины линии в точках (points), где 1 точка равна 1/72 дюйма.
• MarkerEdgeColor – задание цвета маркера или цвета граней маркера для «заполненных» маркеров (кружков, квадратов, ромбов, пентаграмм (пятиугольников), гексаграмм (шести-угольников), и четырех типов треугольников).
• MarkerFaceColor – задание цвета поверхности заполненных маркеров.
• MarkerSize – задание размера маркера в единицах точки.
Например, выражения
x = -pi : pi/10 : pi;
y = tan(sin(x)) - sin(tan(x));
plot(x, y, '--rs', 'LineWidth', 2,...
'MarkerEdgeColor', 'k',...
'MarkerFaceColor', 'g',...
'MarkerSize', 10)
дают следующий график
2. Задание положений меток (Tick-Mark) и указание надписей (Labeling)
Вы имеете возможность устанавливать положение меток на осях, а также вид надписей на каждой метке. Например, в следующем графике синусоидальной функции производится изменение маркировки оси x, с целью придания более значимых и информативных значений меток и их надписей:
x = -pi : 0.1 : pi;
y = sin(x);
plot(x, y)
set(gca, 'XTick',-pi : pi/2 : pi)
set(gca, 'XTickLabel',{'-pi', '-pi/2', '0', 'pi/2', 'pi'})
Добавление заголовков, надписей к осям и аннотаций
Добавим теперь надписи к осям и комментарий к точке -pi/4, sin(-pi/4).
Следующие три стандартные команды позволяют ввести надписи к осям x и y, а также общий заголовок к графику
xlabel('-\pi \leq \Theta \leq \pi')
ylabel('sin(\Theta)')
title('Plot of sin(\Theta)')
а команда text дает возможность ввести текстовую информацию в любую выбранную точ-ку координатных осей
text(-pi/4, sin(-pi/4), '\leftarrow sin(-\pi\div4)', 'HorizontalAlignment', 'left')
Изменим также цвет линии на красный, находя сперва дескриптор линии, созданной фун-кцией plot, а затем установив требуемое свойство линии Color property. В том же выраже-нии установим толщину линии LineWidth равной двум точкам
set(findobj(gca, 'Type', 'line', 'Color', [0 0 1]),...
'Color','red',,...
'LineWidth', 2)
См. также функции:
axis, bar, grid, legend, line, LineSpec, loglog, plotyy, semilogx, semilogy, subplot, xlabel,
xlim, ylabel, ylim, zlabel, zlim, stem
См. свойство String функции text , где дается список символов и описывается их приме-нение.
LineSpec
Назначение. Спецификации задания свойств графического объекта линия (Line).
Описание. В данном разделе описывается как можно задать свойства линий, используе-мых при построении графиков. Система MATLAB дает возможность задавать многие ха-рактеристики, включая:
MATLAB предусматривает специальные символьные спецификаторы (описатели) для сти-лей линий, типов маркеров и цветов. В следующих таблицах дается перечисление этих спецификаторов.
Спецификаторы |
Стили линии |
- |
Сплошная линия (по умолчанию) |
-- | Штриховая линия |
: |
Пунктирная линия |
-. |
Штрих-пунктирная линия |
Спецификаторы |
Типы маркеров |
+ |
Знак плюс |
o |
Кружочек |
* |
Звездочка |
. |
Точка |
x |
Крестик |
s |
Квадрат |
d |
Ромб |
^ |
Треугольная стрелка вверх |
v |
Треугольная стрелка вниз |
> |
Треугольная стрелка направо |
< |
Треугольная стрелка налево |
p |
Пятиугольная звезда (пентаграмма) |
h |
Шестиугольная звезда (гексаграмма) |
Спецификатор |
Цвет |
r |
Красный |
g |
Зеленый |
b |
Синий |
c |
Голубой (cyan) |
m |
Магента (magenta) |
y |
Желтый |
k |
Черный |
w |
Белый |
Многие графические функции допускают аргумент LineSpec, который определяет три спецификатора для характеристики линии:
Например, функция plot(x, y, '-.or') строит график значений y от аргумента x, используя штрих-пунктирную линию (-.); размещает круглые маркеры (o) в точках данных, и окра-шивает как линию, так и маркеры в красный цвет (r). Данные спецификаторы нужно задать (в любом порядке) как строка символов в кавычках, после записей массивов данных. Если вы задаете в LineSpec только маркеры, но не стиль линии (например, plot(x,y,'d')), MATLAB наносит только маркеры (без линий)
Связанные (родственные) свойства. При использовании функций plot и plot3, вы можете задавать также другие характеристики линий, используя следующие графические свойства:
В дополнение, вы можете задавать графические свойства LineStyle, Color, и Marker вместо использования символьной строки. Это может быть полезным, например, если вы хотите задать цвет, которого нет в приведенном выше списке спецификаторов цвета, при помощи тройки значений RGB. Более подробная информация о возможностях выбора цвета дана в разделе ColorSpec.
Построим синусоидальную функцию для трех различных пределов изменения аргумента, используя различные стили линий, цвета и маркеры.
t = 0 : pi/20 : 2*pi;
plot(t, sin(t), '-.r*')
hold on
plot(sin(t - pi/2), '--mo')
plot(sin(t - pi), ':bs')
hold off
Построим еще один график, иллюстрирующий как можно задавать свойства линий.
plot(t, sin(2*t),'-mo',...
'LineWidth', 2,...
'MarkerEdgeColor', 'k',...
'MarkerFaceColor', [0.49 1 0.63],...
'MarkerSize', 12)
См. также функции:
line, plot, patch, set, surface, и свойство LineStyleOrder координатных осей
[1] Данная терминология не совсем соответствует принятой в русско-язычных изданиях.
ГОСУДАРСТВЕННЫЙ ИНЖЕНЕРНЫЙ УНИВЕРСИТЕТ АРМЕНИИMATLABУЧЕБНОЕ ПОСОБИЕГаспарян Олег Николаевич Д.т.н, с.н.с2005 СОДЕРЖАНИЕ Система математических расчетов MATLAB 4 Рабочий стол
Система моделювання Electronics Workbench
Системи оброблення економічної інформації
Системне програмування та операційні системи
Системы автоматизированного проектирования и черчения
Системы проектирования и управления мультимедийными учебно-методическими курсами
Современные симметричные и асимметричные криптосистемы
Создание HTML-таблиц. Фреймы и формы
Создание презентаций в программе Power Point
Создание эскизов швейных изделий с использованием графического редактора Paint
Сообщения и их обработка
Copyright (c) 2024 Stud-Baza.ru Рефераты, контрольные, курсовые, дипломные работы.