Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
САНКТ-ПЕТЕРБУРГСКИЙ
ГОСУДАРСТВЕННЫЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
И.Е. Ануфриев
ИНФОРМАТИКА
Пакет MatLab
Учебное пособие
Фундаментальная
библиотека СПб ГПУ
г\ у п \Гэ
ФБ СПб
0001092873
Санкт-Петербург
Издательство Политехнического университета
20 40
УДК 518:683.03 (075.8)
Библиогр.: 9 назв.
Печатается по решению редакционно-издательского совета Санкт-Петербургского
государственного политехнического университета.
© Санкт-Петербургский государственный
политехнический университет, 2040.
ВВЕДЕНИЕ
Название MatLab является сокращением от Matrix Laboratory. Первона
чально пакет MatLab предназначался для матричных вычислений и был только
удобной оболочкой для имеющихся библиотек программ, но за последнее деся
тилетие его возможности существенно возросли. В настоящее время MatLab
является одним из самых мощных среди всех универсальных вычислительных
пакетов.
Научные работники и инженеры применяют MatLab для решения задач,
возникающих в различных прикладных областях. Обработка сигналов и изо
бражений, исследование и расчет физических процессов, визуализация данных,
статистический анализ, матричный анализ, оптимизация, нейронные сети, не
четкая логика, моделирование нелинейных динамических систем — вот далеко
неполный перечень задач, которые могут быть эффективно решены в MatLab.
Уникальность пакета MatLab состоит еще и в том, что он идеально приспособ
лен для лабораторной поддержки курсов по методам вычислений и информати
ке, читаемых студентам технических факультетов. Специализированные пакеты
(ТооШох'ы), входящие в состав MatLab, могут быть использованы при прове
дении лабораторных работ на старших курсах технических факультетов. Ин
тегрирование MatLab с Word позволяет получать интерактивные документы для
разработки электронных курсов лекций и практических занятий.
Удобный интерфейс и встроенный простой язык программирования, про
стота которого компенсируется обширной библиотекой графических, вычисли
тельных и сервисных функций, способствуют быстрому созданию приложений
для исследования и решения поставленной задачи. Визуальная среда програм
мирования позволяет при наличии некоторого опыта программировать прило
жения с графическим интерфейсом пользователя. Сочетание MatLab и Excel
существенно расширяет возможности Excel при оперировании с данными. Про
граммы, написанные на современных языках программирования высокого
уровня, могут прекрасно взаимодействовать с приложениями, созданными
в MatLab.
Данное пособие посвящено основам работы в MatLab и охватывает толь
ко те возможности пакета, которые необходимы при дальнейшем изучении бо
лее специального круга вопросов, например, численных методов или использо
вании ТооЮох'ов. Описана работа из командной строки, вычисление арифме
тических выражений, использование одномерных и двумерных массивов. Сле
дует подчеркнуть, что успешная работа в пакете невозможна без понимания
принципов оперирования с массивами данных в MatLab. Рассмотрены графиче
ские возможности MatLab для визуализации данных и построения графиков
функций. Приведены базовые конструкции встроенного языка программирова
ния и показано их использование при обработке различных типов данных и ор
ганизации файлового ввода-вывода.
Каждый параграф содержит варианты заданий для самостоятельной рабо
ты. Изучение материала рассчитано на семестр.
3
§ 1. В Ы Ч И С Л Е Н И Е А Р И Ф М Е Т И Ч Е С К И Х В Ы Р А Ж Е Н И Й
Арифметические выражения в MatLab состоят, как и в большинстве язы
ков программирования, из чисел, знаков арифметических операций, знака л
(возведение в степень), круглых скобок, переменных, и встроенных функций.
Десятичная часть числа отделяется точкой. Для вычисления простейшего вы
ражения следует набрать его в командной строке и нажать <Enter>. Ответ запи
сывается в специальную переменную a n s и результат выводится в командное
окно:
» 1.5+2.9
ans =
4.4000
Вид результата зависит от установленного формата, подробнее о форма
тах вывода написано ниже. После вычисления следующего выражения значе
ние a n s изменится. Для сохранения результатов промежуточных вычислений
их следует записывать в переменные. При использовании переменных необхо
димо придерживаться правил:
■ имя переменной может состоять из символов латинского алфавита,
знака подчёркивания и цифр, но начинается обязательно с символа алфавита;
■ прописные и строчные буквы различаются;
■ пробел не входит в имя переменной.
В качестве знака присваивания используется =, например:
» а = 3 . 2 5 * ( 0 . 7 - 3 . 3 / 5 . 1 ) + 2 . 3 А3
а =
12.3391
Обратите внимание, что результат сразу же выводится в командное окно.
Для подавления вывода следует завершить строку с оператором присваивания
точкой с запятой. Символ е предназначен для записи чисел в экспоненциальной
форме: числа 0.00125 и 1.25е-3 эквивалентны. Комплексные числа вводятся
при помощи буквы i :
» b = 5 * (2.2 + 3 . 9 i )+0 .8
Ь =
11.8000 + 1 9 . 5000i
MatLab обладает большим набором встроенных математических функ
ций. Некоторые из них приведены в табл. 1.1. При вызове математических
функций аргумент заключается в круглые скобки. Полный список всех встро
енных элементарных математических функций можно получить, набрав в ко
мандной строке h e l p e l f u n . Команда h e l p отображает в командном окне
список разделов справочной системы. Для получения содержимого раздела не
обходимо указать через пробел его название после h e l p , а для вывода деталь
ной информации о какой-либо функции, следует ввести в строке с h e l p имя
функции.
4
Табли ца 1.1
Основные математические функции
Тригонометрические функции (аргумент задаётся в радианах)
sin, cos, tan, cot Синус, косинус, тангенс и котангенс
sec, csc Секанс, косеканс
Обратные тригонометрические функции (результат вычисляется в радианах)
asin, acos, atan, acot Арксинус, арккосинус, арктангенс и арккотангенс
asec, acsc Арксеканс, арккосеканс
Гиперболические функции
sinh, cosh, tanh, coth Гиперболические синус, косинус, тангенс и котан
генс
sech, csch Гиперболические секанс и косеканс
asinh, acosh, atanh, Гиперболические арксинус, арккосинус, арктангенс
acoth и арккотангенс;
Экспоненциальная функция, логарифмы, степенные функции
exp Экспоненциальная функция
log, log2, log 10 Натуральный логарифм, логарифмы по основанию
2 и 10
sqrt Квадратный корень
Модуль, знак и функции для работы с комплексными числами
abs, sign Модуль и знак числа
conj, imag, real Комплексно-сопряжённое, мнимая и вещественная
часть
Пусть, например, требуется найти значение выражения при х = 0.2 и у = -3.9:
lsin(jnx) + e ° 'y
I c o s(| юс) + e 0Iy ij cos(y лх) + e 01y
Если набирать сразу все выражение, то получается достаточно длинная
строка. Для переноса на следующую строку любой команды MatLab можно ис
пользовать три идущие подряд точки, после нажатия на <Enter> среда MatLab
ждет продолжения ввода:
» х = 0 .2;
» у = - 3 .9;
» c = s q r t ( (sin(4/3*pi*x)+exp (0.1*у) ) / ( c o s (4/3*pi*x)+exp(0.1*y))) + . . .
( ( s i n ( 4 / 3 * p i * x ) + е х р ( 0 . 1 * у ) ) / ( c o s ( 4 / 3 * p i * x ) + e x p ( 0 . l * y ) ) ) л (1/3)
Проще всего решить поставленную задачу, используя промежуточные
переменные:
» х = 0 .2 ;
» у= -3.9;
» a= sin (4 /3 * p i* x )+ехр(0 .1*у);
» b = c o s (4/ 3 * p i * x ) + е х р ( 0 . 1*у);
» c = s q r t (а / Ь ) + ( а / Ь ) л ( 1 / 3 )
с =
2.0451
5
Обратите внимание на несколько важных особенностей. Все операторы
присваивания, кроме последнего, завершены точкой с запятой для подавления
вывода результата. Необязательно набирать выражение для Ь, похожее на толь
ко что введенное для а. После ввода третьей строки нажмите клавишу < j> . В
командной строке появится предыдущее выражение, внесите в него необходи
мые изменения, а именно, замените sin на cos, и нажмите <Enter>. Клавиши
< |> и <J> служат для перехода по истории команд, т.е. для занесения ранее на
бранных команд в командную строку, а <*->, <—»>, <Home>, <End> — для пе
ремещения в пределах командной строки. Передвижение по экрану (только для
просмотра команд, а не для редактирования) осуществляется клавишами
<PageUp>, <PageDown> или вертикальной полосой скроллинга. Начиная с вер
сии 6.0 в среду MatLab включено окно Command History для быстрого перехода
по истории команд. В любой момент можно вывести значение переменной в
командное окно, для чего следует набрать имя переменной в командной строке
и нажать <Enter>, либо вызвать функцию disp:
» di sp (с )
2.0451
Возникающий в процессе вычислений комплексный результат не являет
ся ошибкой. MatLab автоматически переходит в область комплексных чисел,
продолжая вычисления. Найдите, например, квадратный корень из -1. Более
того, допустимы операции деления на ноль, которые приводят к стандартным
переменным Inf или -Inf. Результат деления нуля на ноль есть NaN (Not а
Number — не число). Переполнение или потеря точности в MatLab при выпол
нении операций с числами с плавающей точкой не вызывает прекращение вы
числений.
Просмотр текущих переменных рабочей среды производится при помощи
команды w hos. Предположим, что ранее переменным а и Ь были присвоены
значения:
» а=-1.34;
» Ь = 2 .98+3.8 6 i ;
Вызовите команду w h o s, указав через пробелы имена переменных
» w hos а Ь
В командное окно выводится таблица, приведённая ниже. В столбике
Class указан тип переменной, в Bytes — число байт, выделенных под хране
ние значения, a Size содержит информацию о размере. После таблицы разме
щена строка с указанием суммарного объема памяти в байтах.
Name Size Bytes Class
a lxl 8 double array
b lxl 16 double array (complex)
Grand total is 2 elements using 24 bytes
Обратите внимание, что числовые переменные в MatLab являются дву
мерными массивами размера один на один. Представление всех данных
6
в MatLab в виде массивов оказывается очень полезным, о чем подробнее будет
сказано в следующих разделах.
Пользователь имеет возможность управлять видом результата, устанав
ливая подходящие форматы вывода. Существует два способа задания форма
тов. Выбор пункта Preferences... в меню File рабочей среды приводит к появле
нию диалогового окна с одноименным названием. В MatLab 5.3 панель Numeric
Format вкладки General содержит переключатели, а в в е р с т 6.x на панели Text
display расположены раскрывающиеся списки Numeric Format и Numeric display
(при выбранном пункте Command Window в списке левой панели окна). Воз
можно установить один из следующих форматов.
■ short (default) — короткий формат с плавающей точкой с четырьмя
цифрами после десятичной точки (используется по умолчанию).
■ long — длинный формат с плавающей точкой с четырнадцатью цифра
ми после десятичной точки.
■ short е — экспоненциальный формат с четырьмя цифрами после деся
тичной точки.
■ long е — экспоненциальный формат с пятнадцатью цифрами после де
сятичной точки.
■ short g — наилучшее представление числа либо в формате short, либо в
short е (аналогично long g).
* hex — шестнадцатеричное представление числа.
* + — положительные и отрицательные числа отображаются знаками "+"
и а нулевые — пробелами.
■ bank — формат для вывода денежных сумм с двумя знаками после де
сятичной точки.
■ rat — вещественные числа приближённо представляются отношением
двух небольших целых чисел.
Иногда возникает ситуация, когда MatLab не может уложиться в установ
ленный формат при выводе результата. Пусть, например, установлен формат
short. При вычислении 1/3333 результат отображается в формате short е, одна
ко, автоматической смены формата для всех последующих вычислений не про
исходит.
MatLab предоставляет два способа вывода в командное окно.
■ compact — строки с результатами выводятся подряд.
■ loose — строки с результатами разделяются пустой строкой.
Команда format служит для установки формата из командной строки. К
примеру, обращение
» format short е
аналогично выбору короткого экспоненциального формата в диалоговом окне
Preferences. Вне зависимости от установленного формата все вычисления про
изводятся с двойной точностью, следовательно, после смены формата с short на
long не требуется повторно находить значения переменных. Достаточно снова
вывести их значения в командном окне.
7
Зада ния для с ам ост оят ельно й работ ы
Во всех заданиях требуется занести в некоторую переменную значения
выражений при заданных х = -1.75-10-3 и у = ЗАж, отобразить результат в раз
личных форматах и изучить информацию о переменных при помощи команды
whos.
ч2.3
е sin_y + 2 cos .у е sin ^ + 2 cosy
1. F = ln|sin jy| -
200х + у I 200x + у
\jx - s in y \х \4 й г
2. 2 = arctg
V b? Ijx - s m y
]+ x+tgy
ln_y | InУ
4. W-- !+ ■
x + tgy
R = sh ^ + ■•ch[(x + l n y ) J ^ b y \
1\ ^ Щ LV 'Vl 1
ex sia y + e x cosy
7. g = 1jeJcsin y + e x cosy + ^ 1+
x -s in y x + siny
9. S = arctg + e (x-sin^X^+sin y)
x + sin y x -sm y
Г N2
10 jj l + arcsin(cos2>) | 2X + 3~* -1
2 X +3~X x + arcsin(cos 2y)
§ 2. В Е К Т О Р -С Т Р О К И И В Е К Т О Р -С Т О Л Б Ц Ы
Массивы являются одним из самых распространенных способов хранения
данных и используются во всех языках программирования и вычислительных
пакетах. К особенностям работы с массивами в MatLab относится то, что одно
мерный массив может быть вектор-строкой или вектор-столбцом. Если способ
представления массива важен, то мы будем подчеркивать, о строке или о столбце
идет речь. Если же это несущественно, то будем говорить о вектор-строках и
вектор-столбцах просто как о векторах или одномерных массивах (одномерный
массив в MatLab есть двумерный, у которого один из размеров равен единице).
Для ввода вектора используются квадратные скобки, элементы вектора
отделяются друг от друга:
■ точкой с запятой, если требуется получить вектор-столбец;
■ пробелом или запятой, если необходимо разместить элементы в вектор-строке.
Занесите вектор-столбцы и вектор-строки
0.2
а = - 3 .9
4.6
в соответствующие массивы, набрав в командной строке:
» а = [0.2; - 3 . 9 ; 4.6] ;
» Ь=[7.6; 0.1; 2.5] ;
» и = [0.1 0.5 - 3. 7 8.1] ;
» v = [5.2 9.7 3.4 - 0 . 2 ] ;
Точка с запятой в конце каждой строки поставлена для подавления вывода
на экран, она никак не связана с точкой с запятой, которая является разделителем
элементов в вектор-столбцах. Выведите в командное окно значения переменных
a, b, u, v и посмотрите, как MatLab отображает содержимое вектор-строк и век
тор-столбцов. Получите информацию о переменных при помощи команды who s.
В предыдущем параграфе было замечено, что числа хранятся в двумерных мас
сивах, каждый из размеров которых равен единице. Векторы также представля
ются двумерными массивами, один из размеров которых равен единице.
Для получения длины вектора предназначена функция l e n g t h , вектор
указывается в качестве ее входного аргумента:
» L=length(a)
L
3
Вектор-столбцы с одинаковым числом элементов можно складывать и
вычитать друг из друга при помощи знаков "+" и Аналогичное верно и для
вектор-строк:
» с=а+Ь;
» w = u -v ;
Сложение и вычитание вектор-строки и вектор-столбца или векторов раз
ных размеров приводит к ошибке. Операция * предназначена для умножения
векторов по правилу матричного умножения. Поскольку MatLab различает век
9
тор-строки и вектор столбцы, то допустимо либо умножение вектор-строки на
такой же по длине вектор-столбец (скалярное произведение), либо умножение
вектор-столбца на вектор-строку (внешнее произведение, в результате которого
получается прямоугольная матрица). Скалярное произведение двух векторов
возвращает функция d o t , а векторное — c r o s s :
» s=dot(a,b)
» c=cross(a,b)
Разумеется, векторное произведение определено только для векторов из трех
элементов.
Для операции транспонирования зарезервирован апостроф 1. Если вектор
содержит комплексные числа, то операция ' приводит к комплексно
сопряженному вектору. При вычислении скалярного и векторного произведе
ний функциями c r o s s a d o t H e обязательно следить за тем, чтобы оба вектора
были либо столбцами, либо строками. Результат получается верный, например,
при обращении c = c r o s s ( а , b ' ) , только с становится вектор-строкой.
MatLab поддерживает поэлементные операции с векторами. Наряду с ум
ножением по правилу матричного умножения, существует операция поэле
ментного умножения . * (точка со звездочкой). Данная операция применяется к
векторам одинаковой длины и приводит к вектору той же длины, что исходные,
элементы которого равны произведениям соответствующих элементов исход
ных векторов. Например, для векторов а и Ь, введенных выше, поэлементное
умножение дает следующий результат:
» с = а . *Ь
с =
1.5200
-0.3900
11.5000
Аналогичным образом работает поэлементное деление . / (точка с косой
чертой). Кроме того, операция . \ (точка с обратной косой чертой) осуществля
ет обратное поэлементное деление, то есть выражения а . /Ъ и Ь . \ а эквива
лентны. Возведение элементов вектора а в степени, равные соответствующим
элементам Ь, производится с использованием . Л. Для транспонирования век
тор-строк или вектор-столбцов предназначено сочетание . ' (точка с апостро
фом). Операции ' и . ' для вещественных векторов приводят к одинаковым ре
зультатам. Не обязательно применять поэлементные операции при умножении
вектора на число и числа на вектор, делении вектора на число, сложении и вы
читании вектора и числа. При выполнении, например, операции а* 2, результат
представляет собой вектор того же размера, что и а, с удвоенными элементами.
Векторы могут быть аргументами встроенных математических функций,
таких, как s i n , c o s и т. д. В результате получается вектор с элементами, рав
ными значению вызываемой функции от соответствующих элементов исходно
го вектора, например:
» q=sin([0 pi/2 pi])
10
О 1.0000 0.0000
Однако для вычисления более сложной функции от вектора значений, скажем
vsinv + v 2
V+ 1 ’
выражение f= ( v * s i n (v) + v A2) / ( v + 1 ) вызовет ошибку уже при попытке ум
ножения v на s i n ( v ) . Дело в том, что v является вектор-строкой длиной четыре,
т. е. хранится в двумерном массиве размером один на четыре. Точно также пред
ставлен и s i n ( v ) , следовательно, умножение при помощи звездочки (по правилу
матричного умножения) лишено смысла. Аналогичная ситуация возникает и при
возведении вектора v в квадрат, т. е., фактически, при вычислении v*v. Правиль
ная запись выражения в MatLab требует использования поэлементных операций:
» f = ( v . * s i n ( v ) + v . Л2 ) . / (v+1)
Часто требуется вычислить функцию от вектора значений аргумента, от
личающихся друг от друга на постоянный шаг. Для создания таких вектор-
строк предусмотрено двоеточие. Последовательность команд
» х=-1.2:0.5:1.8;
» f = ( х . * s i n ( х ) + х . Л2 ) . / ( х + 1 ) ;
приводит к заполнению следующих векторов:
» х
х =
-1.2000 -0.7000 -0.2000 0.3000 0.8000 1.3000 1.8000
» f
f =
-12.7922 3.1365 0.0997 0.1374 0.6744 1.2794 1.7832
Ш аг может быть отрицательным, в этом случае начальное значение
должно быть больше, либо равно конечному для получения непустого вектора.
Если шаг равен единице, то его можно не указывать, например:
» п=-3:4
п =
- 3 - 2 - 1 0 1 2 3 4
Ясно, что для заполнения вектор-столбца элементами с постоянным ша
гом следует транспонировать вектор-строку. Создание векторов при помощи
двоеточия и умение производить поэлементные операции необходимо для ви
зуализации массивов данных, о чем будет сказано в следующих разделах.
MatLab обладает большим набором встроенных функций для обработки
векторных данных, часть из них приведена в табл. 2.1. Полный список имею
щихся функций выводится в командное окно при помощи h e l p d a t a f u n , а
для получения подробной информацию о каждой функции требуется указать ее
имя в качестве аргумента команды h e l p . Обратите внимание на то, что ряд
функций допускает обращение к ним как с одним, так и с двумя выходными ар
11
гументами. В случае нескольких выходных аргументов они заключаются в
квадратные скобки и отделяются друг от друга запятой.
Очень часто требуется обработать только часть вектора, или обратиться к
некоторым его элементам. Разберем правила MatLab, по которым производится
индексация векторных данных. Для доступа к элементу вектора необходимо
указать его номер в круглых скобках сразу после имени переменной, в которой
содержится вектор. Например, сумма первого и третьего элементов вектора v
находится при помощи выражения
» s = v (1)+ v (3);
Обращение к последнему элементу вектора можно произвести с использовани
ем e n d , т.е. v (e n d ) и v ( l e n g t h (v) ) приводят к одинаковым результатам.
Таблица. 2.1
Функции обработки данных
Функции Назначение
s =s um(а ) Сумма всех элементов вектора а
p = p r o d (а ) Произведение всех элементов вектора а
m=ma x(а ) Нахождение максимального значения среди элемен
тов вектора а
[ т , к ] = т а х (а ) Второй выходной аргумент к содержит номер мак
симального элемента в векторе а
m= mi n ( а ) Нахождение минимального значения среди элемен
тов вектора а
[ т , к ] = m i n (а ) Второй выходной аргумент к содержит номер мини
мального элемента в векторе а
т = т е а п (а ) Вычисление среднего арифметического элементов
вектора а
a l = s o r t (а) Упорядочение элементов вектора по возрастанию
(al,ind]=sort(a) Второй выходной аргумент i n d является вектором
из целых чисел от 1 до l e n g t h ( а ), который соот
ветствует проделанным перестановкам
Указание номеров элементов вектора можно использовать и при вводе
векторов, последовательно добавляя новые элементы (не обязательно в порядке
возрастания их номеров). Команды:
» h=10;
» h (2)=20;
» h ( 4 ) = 4 0;
приводят к образованию вектора:
» h
h =
10 20 0 40
Заметьте, что для ввода первого элемента h не обязательно указывать его ин
декс, т.к. при выполнении оператора h = l создается вектор (массив размера
один на один). Следующие операторы присваивания приводят к автоматиче
12
скому увеличению длины вектора h, а пропущенные элементы (в нашем случае
h {3) ) получают значение ноль.
Индексация двоеточием позволяет выделить идущие подряд элементы в
новый вектор. Начальный и конечный номера указываются в круглых скобках
через двоеточие, например:
» z = [0.2 -3 .8 7.9 4.5 7.2 -8.1 3 .4 ];
» znew=z(3:6)
z ne w =
7.9000 4.5000 7.2000 -8.1000
Применение встроенных функций обработки данных к некоторым последовательно
расположенным элементам вектора не представляет труда. Следующий вызов
функции p r o d вычисляет произведение элементов вектора z со второго по шестой:
» p = p r o d ( z (2:6) )
Индексация вектором служит для выделения элементов с заданными ин
дексами в новый вектор. Индексный вектор должен содержать номера требуе
мых элементов, например:
» ind=[3 5 7];
» znew=z(ind)
zne w =
7.9000 7.2000 3.4000
Подумайте, как найти сумму элементов произвольного вектора z с четными
индексами. Вот правильное решение:
» ind=2:2 :le n g th (z );
» s=sum(z ( i n d ) )
Конструирование новых векторов из элементов имеющихся векторов произво
дится при помощи квадратных скобок. Следующий оператор приводит к обра
зованию вектора, в котором пропущен пятый элемент вектора z
» znew=[z(l:4) z (6:end) ]
z new =
0. 2000 -3 .8 0 0 0 7. 9000 4. 5000 -8 .1 0 0 0 3. 4000
13
Варианты
1. а = [0.5 3.7 6.0 -4.3 1.2 -2.7 2.4 2.2]; Ъ = [3.6 7.0 7.0 5.4 2.6 -2.7 -6.4 0.3].
2. а = [-4.8 -1.3 -1.0 0.7 4.0 5.8 4.3 -8.0]; b = [-1.1 -1.9 7.1 -2.1 6.8 2.8 0.3 1.6].
3. а = [1.0 -3.9 -2.3 -3.3 -1.7 2.2 -0.6 1.8]; b = [2.7 -2.7 -2.2 4.4 0.4 -6.0 -
4. а = [-2.4 3.3 -0.1 3.6 7.4 -2.8 0.3 2.2]; b = [6.3 0.6 4.3 -3.7 -7.0 3.7 3
5. а = [8.4 -5.9 -6.5 -0.9 6.9 -1.7 1.7 0.8]; Ъ = [-0.0 2.0 -1.57.5 -4.0 -3.0
6. а = [5.3 6.8 -7.1 6.8 -4.0 -2.3 -4.4 -0.2]; Ъ = [7.5 -1.5 -4.9 -4.6 -2.3 -5.3 5.5 2.3].
7. а = [1.2 -4.1 -0.8 -0.7 -2.2 1.7 3.3 -6.1]; Ъ = [-1.5 2.2 1.0 -4.3 -0.0 -1.8 -1.5 2.4].
8. а = [6.6 -5.0 -2.7 8.3 3.8 1.9 1.1 2.7]; b = [-1.0 3.2 4.2 -6.4 1.9 -6.5 -6.2 -8.1].
9. а = [-1.9 0.4 1.8 4.2 -3.8 -4.7 4.0 -2.1]; Ъ = [-8.7 -4.2 -1.4 2.8 -2.2 7.8 0.0 -0.1].
10. а = [0.9 1.7 -3.2 -3.8 7.3 6.0 -0.2 8.6]; Ъ = [0.6 -0.4 -6.9 -2.2 1.6 3.8 -3.2 0.4].
1I е*
4. ^ (х ) = x s in x + х [0,1] N =1
х+1
, . Vjc+ 1 si nx+1
10. I - 2'2' " =»
14
§ 3. М А Т Р И Ц Ы
Матрицы небольших размеров удобно вводить из командной строки. Су
ществует три способа ввода матриц. Например, матрицу
Г 0.7 - 2 . 5 9.1'
А = 8.4 0.3 1.7
- 3 .5 6.2 4.7
можно ввести следующим образом: набрать в командной строке (разделяя эле
менты строки матрицы пробелами): А = [ 0 . 7 - 2 . 5 9 . 1 и нажать <Enter>.
Курсор перемещается в следующую строку (символ приглашения командной
строки » отсутствует). Элементы каждой следующей строки матрицы набира
ются через пробел, а ввод строки завершается нажатием на <Enter>. При вводе
последней строки в конце ставится закрывающая квадратная скобка:
» А=[0.7 - 2 . 5 9.1
8.4 0.3 1.7
- 3 . 5 6.2 4.7]
Если после закрывающей квадратной скобки не ставить точку с запятой для по
давления вывода в командное окно, то матрица выведется в виде таблицы.
Другой способ ввода матрицы основан на том, что матрицу можно рас
сматривать как вектор-столбец, каждый элемент которого является строкой
матрицы. Поскольку точка с запятой используется для разделения элементов
вектор-столбца, то ввод, к примеру, матрицы
Г 6.1 о.з"
в = - 7 .9 4.4
_ 2.5 —8. lj
осуществляется оператором присваивания:
» В=[6.1 0.3 ; - 7 . 9 4.4 ; 2.5 - 8 . 1 ] ;
Введите матрицу В и отобразите ее содержимое в командном окне, набрав в
командной строке В и нажав <Enter>.
Очевидно, что допустима такая трактовка матрицы, при которой она счи
тается вектор-строкой, каждый элемент которой является столбцом матрицы.
Следовательно, для ввода матрицы
г0.4 - 7.2 5.3 '
С = 0.1 - 2 . 1 - 9 .5
15
цией о размерах массивов, памяти, необходимой для хранения каждого из мас
сивов, и ти п е— d o u b l e a r r a y :
» whos A B C
Name Size Bytes Class
A 3x3 72 double array
В 3x2 48 double array
С 2x3 48 double array
Функция s i z e позволяет установить размеры массивов, она возвращает результат
в виде вектора, первый элемент которого равен числу строк, а второй — столбцов:
» s = s i z e (В)
s =
3 2
Сложение и вычитание матриц одинаковых размеров производится с ис
пользованием знаков +, - . Звездочка * служит для вычисления матричного произ
ведения, причем соответствующие размеры матриц должны совпадать, например:
» Р=А*В
Р =
46.7700 -84.5000
53.1200 -9.9300
-58.5800 -11.8400
Допустимо умножение матрицы на число и числа на матрицу, при этом про
исходит умножение каждого элемента матрицы на число и результатом является
матрица тех же размеров, что и исходная. Апостроф ' предназначен для транспо
нирования вещественной матрицы или нахождения сопряженной к комплексной
матрице. Для возведения квадратной матрицы в степень применяется знак Л.
Вычислите для тренировки матричное выражение R = ( A - В С )3 + A B C , в
котором А , В и С — определенные выше матрицы. Ниже приведена запись1 в
MatLab этого выражения:
» R = (А-В*С)А3+А*В*С
R =
1.0е+00б *
-0.0454 0.1661 -0.6579
0.0812 -0.2770 1.2906
-0.0426 0.1274 -0.7871
MatLab обладает многообразием различных функций и способов для ра
боты с матричными данными. Для обращение к элементу двумерного массива
следует указать его строчный и столбцевой индексы в круглых скобках после
имени массива, например:
16
» с (1 , 2 )
ans =
-7.2000
Индексация двоеточием позволяет получить часть матрицы — строку, столбец
или блок, например:
» с1=А( 2 :3 ,2 )
cl =
0.3000
6.2000
» rl=A(1,1:3)
rl =
0.7000 -2.5000 9.1000
Для обращения ко всей строке или всему столбцу не обязательно указывать че
рез двоеточие начальный (первый) и конечный индексы, то есть операторы
г 1=А ( 1 , 1 : 3 ) и r l = A ( 1, : ) эквивалентны. Для доступа к элементам строки
или столбца от заданного до последнего можно использовать e n d , так же как и
для векторов: А ( 1 , 2 : e n d ) . Выделение блока, состоящего из нескольких строк
и столбцов, требует индексации двоеточием как по первому измерению, так и
по второму. Пусть в массиве Т хранится матрица:
1 7 -3 2 4 9
0 - 5 - 6 3 -8 7
Т=
2 4 5 - 1 0 3
- 6 - 4 7 2 6 1
Для выделения ее элементов (обозначенных курсивом) со второй строки по
третью и со второго столбца по четвертый, достаточно использовать оператор:
» Т 1 = Т (2:3,2:4)
Т1 =
-5 -6 3
4 5 -1
Индексация двоеточием так же очень полезна при различных перестановках
в массивах. В частности, для перестановки первой и последней строк в произ
вольной матрице, хранящейся в массиве А, подойдет последовательность команд:
» s=A( 1 , : ) ;
» А ( 1 , : ) =А( e n d , : ) ;
» A ( e n d , : ) =s;
MatLab поддерживает такую операцию, как вычеркивание строк или
столбцов из матрицы. Достаточно удаляемому блоку присвоить пустой массив,
задаваемый квадратными скобками. Например, вычеркивание второй и третьей
строки из массива Т, введенного выше, производится следующей командой:
» Т (2 :3, : )= []
Т =
1 7 - 3 2 4 9
17
-6 -4 7 2 6 1
Индексация двоеточием упрощает заполнение матриц, имеющих опреде
ленную структуру. Предположим, что требуется создать матрицу
' 1 1 1 1 1 '
1 00 0 1
^ = 1 0 0 0 1
1 00 0 1
_1 11 1 1_
Первый шаг состоит в определении нулевой матрицы размера пять на пять, за
тем заполняются первая и последняя строки и первый и последний столбцы:
» W (1:5,1:5)=0;
» W(1 , :) = 1 ;
» W (end,:)=1;
» W( : , 1 ) = 1 ;
» W( : , e n d ) =1 ;
Проверьте, что в результате получается требуемая матрица. Ряд встроен
ных функций, приведенных в табл. 3.1, позволяет ввести стандартные матрицы
заданных размеров. Обратите внимание, что во всех функциях, кроме d i a g ,
допустимо указывать размеры матрицы следующими способами:
■ числами через запятую (в двух входных аргументах);
■ одним числом, результат — квадратная матрица;
■ вектором из двух элементов, равных числу строк и столбцов.
Последний вариант очень удобен, когда требуется создать стандартную матри
цу тех же размеров, что и некоторая имеющаяся матрица. Если, к примеру, А
была определена ранее, то команда I = e y e ( s i z e ( A ) ) приводит к появлению
единичной матрицы, размеры которой совпадают с размерами А, так как функ
ция s i z e возвращает размеры матрицы в векторе.
Разберем, как получить трехдиагональную матрицу размера семь на семь,
приведенную ниже, с использованием функций MatLab.
1 -1 0 0 0 0 0
5 2 -2 0 0 0 0
0 5 3 -3 0 0 0
Т = 0 0 5 4 -4 0 0
0 0 0 5 5 -5 0
0 0 0 0 5 6 -6
0 0 0 0 0 5 7
Введите вектор v с целыми числами от одного до семи и используйте его для
создания диагональной матрицы и матрицы со смещенной на единицу вверх диа
гональю. Вектор длины шесть, содержащий пятерки, заполняется, например, так:
5 * o n e s (1,6). Этот вектор укажите в первом аргументе функции d i a g , а ми
нус единицу — во втором и получите третью вспомогательную матрицу. Теперь
достаточно вычесть из первой матрицы вторую и сложить с третьей:
» T = d iag ( v ) - d i a g ( v (1:6),1)+ d i a g ( 5 * o n e s (1,6) ,-1)
18
Таблица. 3.1
Функции для создания стандартных; матриц
Функция Результат и примеры вызовов
zeros Нулевая матрица
F=zeros(4,5) F=zeros(3) F=zeros([3 4])
eye Единичная прямоугольная матрица (единицы расположены
на главной диагонали)
1=еуе(5,8) 1=еуе(5) 1=еуе([5 8])
ones Матрица, целиком состоящая из единиц
E=ones(3,5) E=ones(6) E=ones([2 5])
rand Матрица, элементы которой — случайные числа, равно
мерно распределенные на интервале (0,1)
R=rand(5,7) R=rand(6) R=rand([3 5])
randn Матрица, элементы которой — случайные числа, распреде
ленные по нормальному закону с нулевым средним и дисперсией
равной единице
N=randn(5,3) N=randn(9) N=randn([2 4])
diag 1) диагональная матрица, элементы которой задаются во
входном аргументе — векторе
D=diag(v)
2) диагональная матрица со смещенной на к позиций диа
гональю (положительные к — смещение вверх, отрицательные —
вниз), результатом является квадратная матрица разме
ра length(v)+abs(k)
D = d i a g (v, k)
3) выделение главной диагонали из матрицы в вектор
d = d i a g (А)
4) выделение k-ой диагонали из матрицы в вектор
d = d i a g (А,к)
Варианты
1. (a 3 +C b \ a 2 - 3Cb J . 2. А * + 2 А 3 - А С В .
3. В АС - 4С ТВ Т. 4. ЗВА3С - ВАС + 2 В С .
5. - 3 С ТА С - В В Т . 6. (jB C B - A C г )а \
1. {a B t - c j f + A B T) T - З А . 8. (.АБг в ) 4 - 2 А 3 + С С Т.
9. с { в в т+ с 7с ) с г - 8 Л . 10. 2А А Т - ( С В ) 2 + 4А .
21
Задания для сам ост оят ельной работы
При помощи встроенных функций для заполнения стандартных матриц,
индексации двоеточием и, возможно, поворота, транспонирования или вычер
кивания получите следующие матрицы:
Варианты
Г1 1 1 1 1 1 1] 2 1 0 0 0 0 51 Г-1 0 0 0 0 0 2
12 0 0 0 7 1 -1 3 1 0 0 0 0 0 0 0 0 0 3 0
10 2 0 0 0 1 0 - 1 4 1 0 0 0 0 0 0 0 4 0 0
10 0 2 0 0 1 2. 0 0 - 1 5 1 0 0 3. 0 0 0 5 0 0 0
10 0 0 2 0 1 0 0 0 -1 6 1 0 0 0 6 0 0 0 0
10 0 0 0 2 1 0 0 0 0- -1 7 0 0 7 0 0 0 0 0
1 1 1 1 1 1 1 5 0 0 0 0 -1 8_ _8 0 0 0 0 0 1_
'4 3 3 3 3 3 9' '1 2 3 4 5 6 Г Г1 0 0 о о о -Г
3 4 3 3 3 3 3 2 0 0 0 7 0 1 0 1 0 0 0 - 1 0
3 3 4 3 3 3 3 3 0 0 7 0 7 1 0 0 1 0 - 1 0 0
4. 3 3 3 4 3 3 3 5. 4 0 7 0 7 0 1 6. 0 0 0 5 0 0 0
3 3 3 3 4 3 3 5 7 0 7 0 0 1 0 0 -1 0 1 0 0
3 3 3 3 3 4 3 6 0 7 0 0 0 1 0 -1 0 0 0 1 0
9 3 3 3 3 3 4 12 3 4 5 6 1 -1 0 0 0 0 0 1
2 1 1 1 1 1 1 1 1 1 1 0 1 11 11 1 1
1 2 0 0 0 0 0 0 0 0 1 1 0 1 11 1 1 1
1 0 2 0 0 0 0 0 0 0 1 1 10 1 11 1 1
1. 1 0 0 2 0 0 0 0 0 0 1 8. 1 1 10 11 1 1
1 0 0 0 2 0 0 0 0 0 1 1 11 10 1 1 1
1 0 0 0 0 2 0 0 0 0 1 1 11 110 1 1
1 1 1 1 1 1 2 1111 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0'
0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
9. 0 0 0 0 1 0 0 0 0 0 0 10. 0 0 0 1 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1
Варианты
9.33 -4 .0 1 8.19 2.64
1. f { x ) ~ x - 2 х + s i n x - 4 ; 0.55 3.81 3.32 5.07
е -х 9.32 0.21 -9 .8 9 3. 11'
2. / 0 ) = А = 0.54 4.99 5.01 -0 .0 3
е +х
-1 .5 4 0.49 3.11 2.99'
3. f ( x ) = л(1 + J x +1 ; А=
4.05 --5.85 3.72 0. i l
22
f
6. f ( x ) = eX2+X+1. A = -4 .5 3 -2 .1 2 - 6 .5 4 -3.21'
3.43 7.43 -0 .2 5 1.64
0.23 3.89 -4 .2 3 -7 .2 5
7. / ( * ) = 5.84 5.13 - 0 .8 9 3.55
1*1+ 3
1 -5 .8 4 9.84 0.23 1.59'
8. /(*) =
1+ x ’ -9 .2 5 -0 .2 5 1.54 0.43
1+
l-x
n . x 3 + sinx r~ x г
9. f ( x ) = — Ve + 1 ; A = 0.64 6.34 0.32 -4 .2 3
x -co sx 1.19 3.23 1.54 0.43
Варианты
10 0 4 0 0
0 10 0 4 0
0 0 10 04 т = шах<УV *
> аи
1. А =
2 2 2 33 3 м -6 I s J
2 2 2 33 3
2 2 2 33 3
-1 -1
-1 -1 6 6, .
-1 -1
2. А = -1 -1 5=z sK -
(-1 м
-1 -1
-1 -1
1 2 3 4 5 6
-1 -2 -3 -4 -5 -6
4 4 4 4 4 4 т = mm аИ
3. А-- 4 4 4 4 4 4
5 5 5 5 5 5
5 5 5 5 5 5
23
Ik
-1 -1 -1 1 1 1
-1 -1 -1 1 1 1
-1 -1 -1 1 1 1
2 2 2 3 0 0
2 2 2 0 3 0
2 2 2 0 0 3
1 1 - 3 - 3 -3 -3
1 1 - 3 - 3 -3 -3
5. А = - 3 -3 2 О О О
‘п+1
-3 -3 0 2 0 0
-3 -3 0 0 2 0
-3 -3 0 0 0 2
-1 2 0 ООО
0 - 1 2 ООО
6 5
6. А = О 0 - 1 2 0 0
О 0 0 - 1 0 0 * = 2 > й + 5 Х +1-
0 0 0 0 4 4 <=1 /=1
0 0 0 0 4 4
0 0 0 0 3
0 0 0 3 0
7. А = 0 0 3 0 0
0 3 0 0 0
/-1 > 1
3 0 0 0 0
1 1111
12 3 - 1 0 О
1 2 3 0 -1 0
А_ 1 2 3 0 0 -1
0 0 7 2 2 2 т = max mi n .
i‘=i,....6j=i в J
0 7 0 2 2 2
7 0 0 2 2 2
1 0 0 1 - 3 - 3
О 1 1 0 - 3 - 3
9. А = 0 1 1 0 - 3 - 3
1 0 0 1 - 3 - 3
-2 -2 - 2 - 2 4 4
-2 -2 - 2 - 2 4 4
1 1 1 2 2 2
1 1 1 2 2 2
10.Л: 1 1 1 2 2 2
-1 -1 -1 4 0 0 p = n ik j> -
-1 -1 1 0 4 0 м ;=!
-1 -1 10 0 4
24
§ 4. Г РА Ф И К А И В И З У А Л И З А Ц И Я Д А Н Н Ы Х
MatLab обладает широким набором средств для построения графиков
функций одной и двух переменных и отображения различных типов данных.
Все графики выводятся в графические окна со своими меню и панелями инст
рументов. Вид графиков определяется аргументами графических команд и за
тем может быть изменен при помощи инструментов графического окна. Важно
понимать, что для построения графиков функций на некоторой области изме
нения аргументов следует вычислить значения функции в точках области, часто
для получения хороших графиков следует использовать достаточно много точек.
Разберем сначала, как получить график функции одной переменной, к
примеру:
f { x ) - e x sinOT + x 2
на отрезке [-2,2]. Первый шаг состоит в задании координат точек по оси абс
цисс. Заполнение вектора х элементами с постоянным шагом при помощи
двоеточия позволяет просто решить эту задачу. Далее необходимо поэлементно
вычислить значения/ (х) для каждого элемента вектора х и записать результат в
вектор f . Для построения графика функции осталось использовать какую-либо
из графических функций MatLab. Достаточно универсальной графической
функцией является p l o t . В самом простом случае она вызывается с двумя
входными аргументами —- парой х и f (т. е. p l o t выводит зависимость эле
ментов одного вектора от элементов другого). Последовательность команд,
приведенная ниже, приводит к появлению графического окна Figure No. 1
с графиком функции (рис. 4.1).
» х=-2:0.05:2;
» f = e x p ( х ) .*sin(pi*x) + х .А2 ;
» p l o t (х,f )
25
Тип линии, цвет и маркеры определяются значением третьего дополни
тельного аргумента функции p l o t . Этот аргумент указывается в апострофах1,
например, вызов p l o t ( х, f , ' г о : ' ) приводит к построению графика красной
пунктирной линией, размеченной круглыми маркерами. Обратите внимание,
что абсциссы маркеров определяются значениями элементов вектора х. Всего в
дополнительном аргументе может быть заполнено три позиции, соответствую
щие цвету, типу маркеров и стилю линии. Обозначения для них приведены
в табл. 4.1. Порядок позиций может быть произвольный, допустимо указывать
только один или два параметра, например, цвет и тип маркеров. Посмотрите на
результат выполнения следующих команд: p l o t ( х, f , 1g ' ) ,
p l o t (х,f , ' к о '),p l o t (х,f , ' : ' ) .
Функция p l o t имеет достаточно универсальный интерфейс, она, в част
ности, позволяет отображать графики нескольких функций на одних осях.
Пусть требуется вывести график не только / (х), но и g (x) = е~х sin 5л-х на от
резке [-2, 2]. Сначала необходимо вычислить значения g(x):
» g = e x p ( - х . А2 ) . * s i n ( 5 * p i * x ) ;
а затем вызвать p l o t , указав через запятую пары х, f и х, g и, при желании,
свойства каждой из линий:
» p l o t ( х , f , ' к о - 1, х , д , ' к : ' )
Таблица 4.1
Сокращения для цвета, типа маркеров и стиля линий
Цвет Тип маркера
У Желтый Точка
ш Розовый о Кружок
с Голубой X Крестик
г Красный + Знак плюс
g Зеленый ★ Звездочка
ь Синий S Квадрат
W Белый d Ромб
к Черный V Треугольник вершиной вниз
Тип линии Л Треугольник вершиной вверх
- Сплошная < Треугольник вершиной влево
Пунктирная > Треугольник вершиной вправо
Штрих-пунктирная Р Пятиконечная звезда
-- Штриховая h Шестиконечная звезда
28
b a r ( х , 1 . 2 ) , приводят к частичному перекрытию столбцов. Указание матри
цы во входном аргументе b a r приводит к построению групповой диаграммы,
число групп совпадает с числом строк матрицы, а внутри каждой группы стол
биками отображаются значения элементов строк.
Круговые диаграммы векторных данных получаются с помощью функ
ции p i e , которая имеет некоторые особенности по сравнению с b a r . Различа
ются два случая:
1) если сумма элементов вектора больше или равна единицы, то выво
дится полная круговая диаграмма, площадь каждого её сектора пропорцио
нальна величине элемента вектора;
2) если сумма элементов вектора меньше единицы, то результатом явля
ется неполная круговая диаграмма, в которой площадь каждого сектора про
порциональна величине элементов вектора, в предположении что площадь все
го круга равна единице.
Сравните, например p i e ( [ 0 . 1 0 . 2 0 . 3 ] ) и p i e ( [1 2 3 ] ) . Можно отде
лить некоторые секторы от всего круга диаграммы, для чего следует вызвать
p i e со вторым аргументом — вектором той же длины, что исходный. Ненуле
вые элементы второго вектора соответствуют отделяемым секторам. Следую
щий пример показывает, как отделить от диаграммы сектор, соответствующий
наибольшему элементу вектора х:
» х = [0.3 2 1.4 0.5 0.9] ;
» [ш, к] =шах (х) ;
» v = z e r o s (s i z e ( х ) );
» v(k)= l;
» p i e ( х, v)
Подписи к секторам диаграммы указываются во втором дополнительном вход
ном аргументе, который заключается в фигурные скобки1:
» p i e ( [ 2 4 0 0 3450 1 8 0 0 5 1 0 0 ] , { ' М а р т ' А п р е л ь ' М а й ' И ю н ь ' })
Функции b a r и p i e имеют аналоги:
■ b a r h — построение столбцевой диаграммы с горизонтальным распо
ложением столбцов;
■ b a r 3, p i e 3 — построение объемных диаграмм.
При обработке больших массивов векторных данных часто требуется по
лучить информацию о том, какая часть данных находится в том или ином ин
тервале. Функция h i s t предназначена для отображания гистограммы данных и
нахождения числа данных в интервалах. Входным аргументом h i s t является
вектор с данными, а выходным — вектор, содержащий количество элементов,
попавших в каждый из интервалов. По умолчанию берется десять равных ин
тервалов. Например, вызов h i s t ( r a n d n ( 1, 5 0 0 0 ) ) приводит к появлению
на экране гистограммы данных, распределенных по нормальному закону, а
31
Остановимся подробнее на нескольких вопросах. Первый из них: как из
менять установки, определённые по умолчанию, при отображении функций ли
ниями уровня при помощи c o n t o u r , c o n t o u r f и c o n t o u r 3 . Число линий
уровня задается в четвертом дополнительном аргументе, например:
» c o n t o u r f (X,Y,Z,10)
Вместо числа линий уровня можно указать в векторе те значения z(xy), для ко
торых требуется построить линии уровня:
» contour(X,Y,Z, [-0.51 -0.25 -0.01 0.89])
Несколько сложнее нанести подписи с соответствующим значением z i xy )
к каждой линии уровня. Для этого придется вызвать c o n t o u r с двумя выход
ными аргументами, первый из них — матрица с информацией о положении ли
ний уровня, а второй — вектор с указателями* на линии. Полученные перемен
ные следует использовать в качестве входных аргументов функции с l a b e l :
» [CMatr, h] = contour (X, Y, Z,[-0.51 -*5.25 -0.01 0.89]);
» clabel(CMatr, h)
Залитые цветом каркасные поверхности, построенные при помощи s u f r
и s u r f c , имеют постоянный цвет в пределах каждой ячейки. Команда
s h a d in g i n t e r p , вызываемая после s u r f и s ,u rfc , служит для плавного из
менения цвета в пределах ячеек и скрытия линий сетки на поверхности. Если
желательно убрать сетку и сохранить постоянный цвет ячеек, то достаточно ис
пользовать s h a d i n g f l a t , a s h a d i n g f a c e t e d придает графику прежний вид.
Графические функции по умолчанию располагают поверхность так, что
наблюдатель видит ее часть под некоторым углом, а другая — скрыта от взора.
Положение наблюдателя определяется двумя углами: азимутом (AZ) и углом
возвышения (EL). Азимут отсчитывается от оси, противоположной у, а угол
возвышения — от плоскости ху (см. рис. 4.3, на котором положительные на
правления отсчета углов обозначены стрелками).
Рис. 4.3
Осмотреть поверхность со всех сторон позволяет функция v ie w . Вызов
функции v ie w с двумя выходными аргументами и без входных дает возможность
10. f { x ) = x x \ g ( x) = x x ; x e [0.1,1].
1 1
и(х) = v(x) = ■ x g [0,1].
1+ x ’ 1+ 1 >
l+x
Задания для самостоятельной работы
Построить график кусочно-заданной функции, отобразить ветви разными
цветами и маркерами.
- х,1, -3 < х < -1
—1 < X < 1 2.
л/х, 0 < X< 1
1- / ( * ) = /м = 1, 1<х<3
,1-л
1< х < 3 ( х - 4 ) 2, 3 < х < 5
sinx, - 2 т г < х < 0
Inx, 1 < х < е
3. / ( * ) = х/е, е < х < 9 4. Д х ) = - х 3, 0<х <1
СОБЯХ, 1< X < Ък
9е*~х, 9 < х < 1 2
35
I
3. z ( x , у ) = s i n 2 ( х - 2 у ) ■е ^ x e [0, л ] У e [-1Д]
. . x 2y 2 + 2 x y - 3
4. Ф , у ) = 2 2 x e [-2,2] У 6 [-1,1]
X +y +1
s'mxy
5. z ( x , y ) = x e [0.1,5] у е \-л ,л]
X
38
в одноименных М-файлах. Функция s i n допускает два варианта вызова:
s i n (х) и y = s i n ( х ) , в первом случае результат записывается в a n s , а во вто
ром — в переменную у. Наша функция my sum ведет себя точно так же. Более
того, входными аргументами mysum могут быть массивы одинаковых размеров
или массив и число.
Разберем теперь, как создать файл-функцию с несколькими выходными
аргументами. Список выходных аргументов в заголовке файл-функции заклю
чается в квадратные скобки, сами аргументы отделяются запятой. В качестве
примера на листинге 5.3 приведена файл-функция q u a d e q , которая по задан
ным коэффициентам квадратного уравнения находит его корни.
Листинг 5.3. Файл-Функция для решения квадратного уравнения
function [ x l , х2]=quadeq(а,Ь,с)
D=bA2 - 4 * a * c ;
x l = ( - b + s q r t (D) ) / { 2 *а );
х2=(-b -sq rt(D )) / (2*а);
При вызове q u a d e q из командной строки используйте квадратные скобки для
указания переменных, в которые будут занесены значения корней:
» [ r l , г 2 ]=quadeq(1,3,2)
rl =
-1
r2 =
-2
Заметьте, что файл-функцию q u a d e q можно вызвать без выходных аргумен
тов, или только с одним выходным аргументом. В этом случае вернется только
первый корень.
Файл-функция может и не иметь входных или выходных аргументов, за
головки таких файл-функций приведены ниже:
f u n c t i o n noout ( a , b ) , f u n c t i o n [v,u]=noin, f u n c t i o n noar gO
Умение писать собственные файл-функции и файл-программы необходи
мо как при программировании в MatLab, так и при решении различных задач
средствами MatLab (в частности, поиска корней уравнений, интегрирования,
оптимизации'). Разберем только один пример, связанный с построением графи
ка функции / (л) = е~х (sin х + 0.1 sin(l ООях)) на отрезке [0,1]. Запрограммируйте
файл-функцию my f u n для вычисления f ( x ) . Используйте поэлементные опе
рации (см. листинг 5.4) для того, чтобы m y f u n можно было вызывать от векто
ра значений аргумента и получать вектор соответствующих значений функции.
Листинг 5.4. Файл-Функция myfun
f u n c t i o n y=myfun(x);
у = е х р ( - х ) . * ( s i n ( х ) + 0 . l * s i n ( 1 0 0 * p i * x ) );
Рис. 5.1.
Варианты
. п \ '1 гппсп ~ г/ \ Зхsin 5жс , 3xcos5tk „ _ гп п
\ . f { x ) = sin-^- х е [0.05,1]. 2.f{x) = e +е xe[0,lj.
40
10 s'm lln x
з•/(*)= x e [0 .0 5 ,1 ], 4 .fix)- x e [0,1].
11 —10sin2 bra: 2 + sin 20лх
f \
1 1
5-/W = xe [ 0, l ] . 6 . f ( x ) = cos * 6 [0,1].
1 - arctg**
arctg -
Vl.l + sin5^xy 2
Ва ри ант ы
1. Написать файл-функцию, которая по заданному вектору определяет
номер его элемента с наибольшим отклонением от среднего арифметического
всех элементов вектора.
2. Написать файл-функцию, возвращающую сумму всех элементов век
тора с нечетными индексами.
3. Написать файл-функцию, вычисляющую максимальное значение сре
ди диагональных элементов заданной матрицы.
4. Написать файл-функцию, переставляющую первый столбец квадрат
ной матрицы с ее диагональю.
5. Написать файл-функцию, которая суммирует все внедиагональные
элементы заданной матрицы.
6. Написать файл-функцию, заменяющую максимальный элемент векто
ра средним значением всех его элементов.
7. Написать файл-функцию, заменяющую элемент матрицы с индекса
ми 1,1 произведением всех элементов матрицы.
8. Написать файл-функцию, которая строит многоугольник (замкнутый)
по заданным векторам х и у с координатами вершин.
9. Написать файл-функцию, которая отображает элементы заданного
вектора синими маркерами, а максимальный элемент — красным и возвращает
значение и номер максимального элемента.
10. Написать файл-функцию, переводящую время в секундах в часы, ми
нуты и секунды.
41
§ 6. П Р О Г Р А М М И Р О В А Н И Е
Язык программирования MatLab достаточное простой, он содержит ос
новной набор конструкций: операторы ветвления и циклы. Простота языка про
граммирования окупается огромным количеством встроенных функций, кото
рые позволяют рещать задачи из различных областей.
Цикл f o r используется для повторения операторов в случае, когда число
повторений заранее известно. В цикле f o r используется счетчик цикла, его на
чальное значение, шаг и конечное значение указываются через двоеточие. Блок
операторов, размещенный внутри цикла, должен заканчиваться словом er>d.
Листинг 6.1 содержит файл-программу для вывода графиков функции
f ( x , P ) = е@х sinx на отрезке [-2 ,2 ], для значений параметра Р е [-0.5,0.5].
Листинг 6.1. Графики Ф у н к ц и и п р и различных значениях параметра
х=-2:0.01:2;
for beta= -0.5:0.1:0.5
у= ех р (beta*x) . *sin ( х ) ;
p l o t (х,у)
h o l d on
end
hold o ff
Если шаг равен единице, то его указывать не обязательно. Например, для вы
числения суммы
10 к
45
Досрочное завершение цикла w h i l e или f o r осуществляется при помо
щи оператора b r e a k . Пусть, например, требуется по заданному массиву х об
разовать новый массив у по правилу у (к) =х ( к + 1 ) / х (к) до первого нулево
го элемента х ( к ), т.е. до тех пор, пока имеет смысл операция деления. Номер
первого нулевого элемента в массиве х заранее неизвестен, более того, в масси
ве х может и не быть нулей. Решение задачи состоит в последовательном вы
числении элементов массива у и прекращении вычислений при обнаружении
нулевого элемента в х. Файл-функция, приведенная на листинге 6.8, демонст
рирует работу оператора b r e a k .
Листинг 6.8. Использование оператора break для выхода из цикла
fu n c tio n y=div(x)
fo r k = l : l e n g t h (х)-1
i f x(k)==0
break
end
у (k) =х ( k+1) / х (k) ;
end
За дания для с а мо ст о ят е ль но й р аботы
Написать файл-функцию для вычисления кусочно-заданной функции (см.
варианты на стр. 35).
Написать файл-функцию для решения поставленной задачи.
Ва р и анты
1. Вычислить произведение элементов вектора, не превосходящих сред
нее арифметическое значение его элементов.
2. Подсчитать число нулей и единиц в заданной матрице.
3. Определить количество положительных элементов вектора, располо
женных между его максимальным и минимальным элементами.
4. Просуммировать отрицательные элементы матрицы, лежащие ниже
главной диагонали.
5. Заменить положительные элементы вектора суммой всех его отрица
тельных элементов.
6. Заполнить квадратную матрицу А, каждый элемент которой ау опре
деляется следующим образом:
i~j, i>j
a»=i i + J’ i = J.
2
■ -2
Г +J , K J
7. Вычислить сумму:
46
8. Для матрицы А - ( а у ) размера п ш т найти значение выражения:
п т
w w = Z r i ay.
;=iy=i
9. По заданному х найти максимальное значение п, для которого сле
дующая сумма не превосходит 100:
П
s(x) = ,
к =1
10. Вычислить сумму
^ гк
к=0
с заданной точностью £ . Суммировать следует пока модуль отношения теку
щего слагаемого к уже накопленной части суммы превосходит е . Сравнить ре
зультат с точным значением, построив графики е х и s(x) для х е [0,5].
11. Заданы окружности, координаты их центров содержатся в массивах х
и у, а радиусы в массиве г. Известны координаты некоторой точки. Требуется
вывести график, на котором маркером отмечено положение точки, синим цве
том изображены те окружности, внутри которых лежит точка, а остальные ок
ружности нарисованы красным цветом.
§ 7. Р А Б О Т А СО С Т Р О К А М И
47
вектор-строки, ее длина равна 13. Поскольку строковые переменные являются
массивами, то к ним применимы некоторые функции и операции, рассмотрен
ные нами ранее. Длина строковой переменной, т.е. число символов в ней, нахо
дится при помощи функции l e n g t h . Допустимо сцепление строк как вектор-
строк с использованием квадратных скобок. Создайте еще одну строковую пе
ременную s t r l , содержащую текст ' My name is Igor.1, и осуществите сцепле
ние:
» strnew=[str strl]
strnew =
H e l l o , W o r l d ! My nam e i s I g o r .
Обратите внимание, что для разделения сцепляемых строк в квадратных
скобках следует использовать пробел (или запятую). Применение точки с запя
той приведет к ошибке, поскольку точка с запятой служит для образования век-
тор-столбцов или отделения строк матриц. Но в матрице все строки должны
быть одинаковой длины, а переменные s t r и s t r l состоят из различного чис
ла символов. Далее рассмотрим, как создавать двумерные массивы символов
(массивы строк), а пока обратимся к наиболее важным функциям MatLab, пред
назначенным для обработки строк.
Сцепление строк может быть проведено как с использованием квадрат
ных скобок, так и при помощи функции s t r c a t . Входными аргументами
s t r c a t являются сцепляемые строки, их число неограничено, а результат воз
вращается в выходном аргументе. Функция s t r c a t игнорирует пробелы в
конце каждой строки. Для строк: s l = ' a b c 1 и s 2 = ' d e f ' сцепления
s = [ s l s 2 ] и s = s t r c a t ( s l , s 2 ) приведут к разным результатам.
Поиск позиций вхождения подстроки в строку производится при помощи
функции f i n d s t r . Ее входными аргументами являются строка и подстрока, а
выходным — вектор позиций, начиная с которых подстрока входит в строку,
например:
» s = ' a b cb cd d efb cc';
» sl= 'b c';
» p = fin d s tr(s, si)
P =
2 4 10
Порядок входных аргументов не важен, подстрокой всегда считается аргумент
меньшего размера.
Функция s t r c m p предназначена для сравнения двух строк, которые ука
зываются во входных аргументах: s t r c m p ( s i , s 2 ). Результатом является ло
гическая единица или ноль. Функция s t r n c m p сравнивает только часть строк
от первого символа до символа, номер которого указан в третьем входном ар
гументе: s t r n c m p ( s i , s 2 , 8) . Данные функции имеют аналоги: s t r c m p i и
s t r n c m p i , которые проводят сравнение без учета регистра, т.е., например,
48
символы ' А ' и ' а ' считаются одинаковыми.
Для замены в строке одной подстроки на другую служит функция s t r r e p .
Пусть, например, требуется заменить в строке s t r подстроку s i на s2 и запи
сать обновленную строку в s t r n e w . Тогда вызов функции s t r r e p должен вы
глядеть так: s t r n e w = s t r r e p ( s t r , s i , s 2 ). Здесь важен порядок аргументов.
Преобразование всех букв строки в строчные (прописные) производит
функция l o w e r ( u p p e r ) , например: l o w e r ( ' M a t L a b ' ) приводит к
' m a t l a b ' , a u p p e r ( ' M a t L a b ' ) — к 1MATLAB'.
То, что строки являются массивами символов, позволяет легко писать
собственные файл-функции обработки строк. Предположим, что требуется пе
реставить символы в строке в обратном порядке. Файл-функция, приведенная
на листинге 7.1, решает поставленную задачу.
Листинг 7.1. Файл-Функиия для перестановки символов в строке
function sout=strinv(s)
L=length(s);
for k=l:L
sout(L-k+1)=s(k);
end
Перейдем теперь к изучению массивов строк. Можно считать, что массив
строк является вектор-столбцом, каждый элемент которого есть строка, причем
длины всех строк одинаковы. В результате получается прямоугольная матрица,
состоящая из символов. Например, для переменных s 1 = 1M a r c h ' ,
s 2 = ' A p r i l ' , s 3 = ' M a y ' , операция S = [ s l ; s 2 ] является допустимой, и
приводит к массиву строк:
S =
Ma r c h
April
Аналогичное объединение трех строк S = [ s l ; s 2 ; s 3 ] вызовет вывод со
общения об ошибке. Можно, конечно, дополнить при помощи сцепления, каж
дую строку пробелами справа до длины наибольшей из строк и затем произво
дить формирование массива. Функция c h a r как раз и решает эту задачу, созда
вая из строк разной длины массив строк:
» S = c h a r ( s i , s 2 , s 3)
S =
Ma r c h
April
May
Проверьте при помощи команды w hos, что S является массивом размера 3 на 5.
Для определения размеров массива строк, так же, как и любых массивов, ис
пользуется s i z e .
Обращение к элементам массива строк производится аналогично обраще
нию к элементам числового массива — при помощи индексирования числами
49
или двоеточием, например: S (3 , 2 ) , S (2 , : ) , S (2 : 3 , 1 : 4) . При выделении
строки из массива строк в конце могут остаться пробелы. Если они не нужны,
то их следует удалить, воспользовавшись функцией d e b l a n k . Сравните, к че
му приводят S ( 3 , :} и d e b l a n k (S ( 3, :) ).
Поиск подстроки в массиве строк выполняется функцией s t r m a t c h .
Входными аргументами s t r m a t c h являются подстрока и массив строк, а вы
ходным — вектор с номерами строк, содержащих подстроку:
» p = s t r m a t c h ( ' М а ' , S)
Р =
1
3
Если требуется искать номера строк, точно совпадающих с подстрокой, то сле
дует задать третий дополнительный входной аргумент ' e x a c t '.
Некоторые функции обработки строк могут работать и с массивами
строк. Например, при сцеплении массивов с одинаковым числом строк при по
мощи s t r e a t , сцепление применяется к соответствующим строкам массивов,
образуя новый массив строк. Среди входных аргументов s t r e a t может быть и
строка. В этом случае она добавляется ко всем строкам массива.
Среди символов строки могут быть цифры и точка, т.е. строка может со
держать числа. Важно понимать, что оператор присваивания Ь =10 приводит к
образованию числовой переменной Ь, а оператор s = ' 10 ' — строковой. Пре
образование целого числа в строку производится при помощи функции
i n t 2 s t r , входным аргументом которой является число, а выходным — строка,
например:
» str=['May, ' in t2 str(1 0 )]
str =
May, 10
Заметьте, что нецелые числа перед преобразованием округляются. Для перево
да нецелых чисел в строки служит функция num2 s t r :
» str=num2str(pi)
str =
3.1416
Дополнительный второй входной аргумент n u m 2 s t r предназначен для указа
ния количества цифр в строке с результатом: s t r = n u m 2 s t r ( p i , 1 1 ) . Воз
можно более гибкое управление преобразованием при помощи строки специ
ального вида, определяющей формат (экспоненциальный или с плавающей точ
кой) и количество позиций, отводимых под число. Строка с форматом задается
в качестве второго входного аргумента n u m 2 s t r , начинается со знака процента
и имеет вид ' %А. а х г, где:
■ А — количество позиций, отводимое под все число;
■ а — количество цифр после десятичной точки;
50
* х — формат вывода, который может принимать, например, одно из
следующих значений: f (с плавающей точкой), е (экспоненциальный) или
g (автоматический подбор наилучшего представления).
Сравните результаты следующих преобразований числа в строку:
» z=198 .23981
» s f = n u m 2 s t r ( z , ’ %12. 5 f ’ )
» s e = n u m 2 s t r (z , ' % 1 2 . 5 e ' )
» s g = n u m 2 s t r (z, ' %1 2 . 5g ' }
Если входным аргументом функций i n t 2 s t r и n u m 2 s t r является матрица, то
результатом будет массив строк. В этом случае в строке с форматом часто по
лезно указать разделитель, например запятую и пробел:
>> R = r a n d ( 5 )
>> S = n u m 2 s t r ( R , ' %7. 2 е , ' )
Обратная задача, а именно, преобразование строковой переменной, со
держащей число, в числовую переменную решается при помощи функции
s t r 2 n u m . Входным аргументом s t r 2 n u m может быть строка с представлени
ем целого, вещественного или комплексного числа в соответствии с правилами
MatLab, например: str2 n u m ( ' 2 . 9 е - 3 ' ) , str2 n u m ( ' 0 . 1 ' ) , str2num (' 4. 6 + 4 i ' ).
Задания для самостоятельной работы
Написать файл-функцию для решения поставленной задачи.
Варианты
1. Подсчитать число вхождений подстроки в строку.
2. Найти количество пробелов в строке.
3. Определить количество цифр в строке.
4. Удалить идущие подряд одинаковые символы в строке.
5. Заменить идущие подряд одинаковые символы в строке на один.
6. Строка является предложением, в котором слова разделены пробела
ми. Переставить первое и последнее слово.
7. Образовать строку, состоящую из первых букв строк, входящих в мас
сив строк.
8. Вывести номера одинаковых строк в массиве строк.
9. Определить количество символов в каждой строке массива строк без
учета пробелов.
10. По заданному массиву строк образовать новый, исключив повторяю
щиеся строки.
11. Заменить в строке цифры числительными (вместо 1, 2,... — один, два,
три,...).
12. Задана строка, содержащая текст и числа, выделить числа в числовой
массив.
51
§ 8. М А С С И В Ы С Т Р У К Т У Р И М А С С И В Ы Я Ч Е Е К
Массивы MatLab могут состоять не только из чисел или символов, но со
держать и более сложно организованную информацию. Пусть необходимо хра
нить и обрабатывать информацию о группе из пяти студентов. Данные о каж
дом студенте включают в себя:
■ фамилию;
■ имя;
■ год рождения;
■ экзаменационные оценки по четырем предметам.
Структура данных, относящихся к каждому из студентов, одинакова (имеет
одинаковые поля), а содержание структуры (значения полей структуры) инди
видуально для каждого из студентов. Для хранения в MatLab такой однотипно
организованной информации предназначен массив структур. Назовем массив
структур GR521, а его поля: Fam, Name, Year и Marks.
Обращение к структурам массива производится при помощи индексации,
например: GR5 21(4) — четвертая структура массива GR5 21 . Названия полей от
деляются от структуры при помощи точки. Скажем, для получения имени второго
студента, следует воспользоваться обращением GR521 (2) .Name. Заметьте, что
поля Fam и Name содержат строки, поле Year — число, a Marks — вектор дли
ны четыре (поскольку записаны оценки по четырем предметам). Создайте файл-
программу fillinfo для заполнения массива структур GR521 (см. листинг 8.1).
После запуска fillinfo в рабочей среде образовался массив структур
GR521. Функция size позволяет получить его размеры, в данном случае один на
пять1. Длину одномерного массива структур возвращает функция length. Введите
имя массива в командную строку и нажмите <Enter> — содержимое каждой струк
туры не отображается, выводятся только сведения о размере массива и названия
полей. Для отображения в командном окне содержимого каждой структуры следует
обратиться непосредственно к ней, например: GR521 (2) или disp (GR521 (2)).
Листинг 8.1.д.• Файл-программа
twuvi к*»»»*»»»» fillinfo для заполнения массива структур
GR521 (1) . Fam=' А л е к с е е в ' ; G R 5 2 1 (1) .Name='HBaH';
G R 5 2 1 (1) . Year=1982; G R 5 2 1 (1) . M a r k s = [ 4 5 5 4] ;
GR521 (2) . F a m= ' И в а н о в ' ; G R 5 2 1 (2) . Na me = ' С е р г е й I r.
G R 5 2 1 (2) . Year=1981; GR521 (2) . M a r k s = [ 3 4 4 5] ;
GR521 (3) . F a m= ' Н и к о л а е в ' ; GR 5 2 1 (3) . N a me = ' О л е г ' ;
G R 5 2 1 (3) . Year=1981; G R 5 2 1 (3) . M a r k s = [ 5 5 5 5] ;
GR521 (4) . F a m= ' П е т р о в а 1; G R 5 2 1 (4) . Na me = ' А н н а ' ;
GR521 (4) . Year=1982; G R 5 2 1 (4) . M a r k s = [ 5 5 5 4] ;
G R 5 2 1 (5) . F a m= ' Ф е д о р о в а ' ; GR 5 2 1 (5) . Na me = ' Е л е н а ' '
GR521 (5) . Year=1982; G R 5 2 1 (5) .Marks=[3 3 3 4] ;
1 Массив структур может быть и двумерным, тогда для его заполнения и обра
щения к его элементам следует применять два индекса (как для матриц).
52
При работе с массивами структур требуется производить некоторые опе
рации либо над структурами, либо с их содержимым. Элемент массива струк
тур всегда можно выделить в отдельную структуру и наоборот, заменить его на
другую структуру (с аналогичным набором полей). Например, для перестанов
ки первых двух структур в массиве GR521 достаточно использовать вспомога
тельную структуру:
» H=GR521 ( 2 ) ;
» G R 5 2 1 { 2 ) =GR521 ( 1 ) ;
» G R 5 2 1 ( 1 ) =Н;
Доступ к данным структур осуществляется при помощи полей, причем
обязательно учитывать, что именно содержит поле: строку, число или массив.
Предположим, что требуется по заданной структуре вида GR521 сформировать
массив строк с фамилиями и именами каждого из студентов. Файл-функция
n a m e s g r o u p , приведенная на листинге 8.2, решает поставленную задачу. Пред
полагается, что входной аргумент GR является структурой вида GR521. Сначала
в строковые переменные f и п выделяются фамилия и имя первого студента, из
которых формируется строка N. Затем в цикле из каждой структуры массива GR
извлекаются фамилия и имя текущего студента, они объединяются в строку s t r ,
которая добавляется в массив строк при помощи функции c h a r .
Листинг 8.2. Файл-Функция. Формирующая массив с т р о к с Фамилиями и
именами
f u n c t i o n N=namesgroup(GR)
f - G R ( 1) . Fam;
n=GR(l).Name;
N=[f, ' n];
for k = 2 :length(GR)
f =G R ( k ) - F a m ;
n = G R ( k ) .Name;
s t r = [f , ' ', n ] ;
N=char(N, str);
end
Проверьте работу файл-функции n a m e s g r o u p , вызвав ее от массива
GR521 с выходным аргументом NAMES, а затем отобразите содержимое NAMES
в командное окно при помощи функции d i s p :
» N A M E S = n a m e s g r o u p (GR521) ;
» di s p( NAMES)
NAMES =
А л е к с е е в Иван
Иванов С е р г е й
Ни кол ае в Олег
Пе т р о в а Анна
Федорова Ел ен а
53
Структуры массива можно дополнить новым полем, для чего следует
присвоить значение этому полю в какой-нибудь структуре массива, например,
первой. Добавьте в массив GR521 поле NBook, предназначенное для хранения
номера зачетной книжки студента:
» GR521( 1 ) . NBook=599001;
Созданное поле, разумеется, образуется во всех структурах массива, но только
в первой из них будет содержать заданное значение (проверьте!). Поле NBook
остальных структур массива следует заполнить отдельно. Обратная опера
ция — удаление поля из всех структур массива — осуществляется при помощи
функции r m f i e l d . Входными аргументами r m f i e l d являются имя массива
структур и название поля, а выходным — имя массива, в который следует запи
сать обновленный массив структур:
» g521=rmfield(GR521,' Year') ;
При работе с массивами структур часто возникает ситуация, когда назва
ние поля хранится в строковой переменной и требуется получить доступ к соот
ветствующему полю. Функция g e t f i e l d предназначена для получения значения
поля структуры по строке с его названием. Входными аргументами g e t f i e l d яв
ляются структура и строка с названием поля, а выходным — его значение.
» field2='Fam ';
» faml=getfield(GR521(1 ),f i e l d 2 ) ;
Заметьте, что к аналогичному результату приводит faml=GR512 (1) . Fam. Для
изменения значения поля по строке с его названием служит функция s e t f i e l d .
Во входных аргументах s e t f i e l d задаются: структура, строка с названием поля
и его новое значение, а в выходном — возвращается измененная структура:
» f ie ld 3 = ' Year';
» G R 5 2 1 ( l ) = s e t f i e l d ( G R 5 2 1 ( 1 ) , f i e l d 3 , 1980);
На том же самом принципе основана функция s t r u c t , которая заполняет
структуру по строкам с названием полей. Входными ее аргументами являются
пары 'название поля'-значение, а выходным — структура:
» GR521( 6 ) = s t r u c t ( ' F a m ' , ' К о т о в ' , ' Name' , ' П е т р ' , ' Y e a r ' , 1 9 8 0 , . . .
' M a r k s ' , [3 5 4 4 ] , ' N B o o k ' , 59 908 )
Определение названий полей в заданном массиве структур или структуре
производится при помощи функции f ie ld n a m e s . Ее входным аргументом явля
ется массив структур или структура, а выходным — названия полей, записанные в
массив ячеек. Про массив ячеек сказано ниже, приведем здесь только примеры,
демонстрирующие получение названий полей с использованием fie ld n a m e s :
» Fields=fieldnames(GR521) ;
» f i e l d 3 = F i e l d s (3)
field3 =
' Year'
Массив ячеек является самым универсальным способом хранения разно
родных данных. Его элементами могут быть числа, числовые массивы, строки,
54
структуры и массивы строк и структур. Присваивание значений ячейкам масси
ва требует заключения индексов в фигурные скобки, а при обращении к ячей
кам можно использовать как фигурные, так и круглые скобки. Листинг 8.3 со
держит пример заполнения двумерного массива ячеек СMAS размера два на два.
Ячейка с номером {1,1} содержит матрицу, {1,2}— строку, {2,1} — массив
строк, {2,2} — структуру с полями D a t a и Ti me.
Листинг 8.3. Заполнение массива ячеек
c l e a r CMAS
CMAS{ 1 , 1 } = [ - 2 . 2 0 . 9 ; 5 . 6 - 8 . 3 ] ;
CMAS{ 1 , 2 } = ' T h i s i s a s t r i n g ' ;
CMAS{ 2 , 1 } = c h a r ( ' f i r s t stringsecond string');
CMAS{ 2 , 2 } . D a t a = [ 3 . 9 8 1 9 . 7 6 5 4 . 4 4 2 0 . 0 0 3 ] ;
CMAS{ 2 , 2 } . T i m e = [ 0 . 1 1 0 . 1 2 0 . 1 3 0 . 1 4 ] ;
Обратите внимание, что перед заполнением массива ячеек целесообразно ис
пользовать команду c l e a r CMAS для удаления (возможно существующей в ра
бочей среде) переменной CMAS. Дело в том, что при наличии, к примеру, число
вой переменной CMAS, последующее заполнение ее как массива ячеек приведет к
сообщению об ошибке. Другие типы переменных не требуют вызова c l e a r —
последовательность присваиваний s = l , s = 1 s t r i n g 1 допустима в MatLab.
Для отображения данных, хранящихся в массиве ячеек, MatLab предлага
ет две функции: c e l l d i s p , которая выводит в командное окно содержимое
каждой ячейки, и c e l l p l o t , предназначенная для визуализации содержимого
массива в графическом окне. Программная обработка разнородных данных зна
чительно облегчается благодаря ряду функций, которые позволяют установить
тип содержимого ячейки1. Перечисленные ниже функции возвращают логиче
скую единицу или ноль в зависимости от типа входного аргумента:
■ i s c h a r ( а) — равно 1, если а является строкой или массивом строк;
■ i s n u m e r i c ( a ) — равно 1, если а является числом или числовым
массивом;
■ i s s t r u c t (а) — равно 1, если а является структурой или массивом
структур.
За дания для с ам о ст оя те л ьн ой р аботы
Задан массив структур вида GR521 (см. выше) с информацией о группе
студентов. Написать файл-функцию для решения следующей задачи.
В ар и а нт ы
1. Подсчитать средний балл каждого студента и вывести столбцевую
диаграмму успеваемости.
2. Найти фамилию наиболее успевающего студента.
1 Разумеется, при помощи данных функций можно определить тип любой пе
ременной, а не только ячейки массива.
55
3. Сформировать матрицу, строки которой содержат оценки каждого из
студентов.
4. Определить, есть ли в группе студент с заданной фамилией.
5. Расположить структуры массива в соответствии с успеваемостью сту
дентов.
Задания для с а мо с то яте ль но й работы
Задан одномерный массив ячеек, который может содержать данные раз
личных типов. Написать файл-функцию для решения следующей задачи.
Ва ри анты
1. Определить количество ячеек, содержащих числа или числовые массивы.
2. Найти номера ячеек, которые содержат только числа, но не массивы.
3. Объединить в один массив все строки и массивы строк, входящие в
массив ячеек.
4. Отобразить столбцевыми диаграммами все данные, являющиеся век
торами.
5. Выделить в массив структур все структуры, входящие в массив ячеек
(предполагается, что поля всех структур одинаковы).
§ 9. Т Е К С Т О В Ы Е Ф А Й Л Ы
MatLab предлагает достаточно универсальные способы считывания дан
ных из текстовых файлов и записи данных в требуемом виде в текстовый файл.
Рассмотрим сначала оперирование с числовыми данными, представленными
матрицами и векторами. Пусть в текстовом файле vec.dat в столбик записаны
числа в соответствии с правилами MatLab, т.е. для отделения десятичных зна
ков используется точка, а для записи числа в экспоненциальном виде применя
ется символ е. Функция l o a d позволяет занести содержимое файла vec.dat в
числовой массив. Имя файла, заключенное в апострофы, указывается во вход
ном аргументе l o a d , а в выходном аргументе возвращается вектор-столбец':
» v = l o a d ( ' v e c . d a t 1) ;
Обратная операция— запись значений вектор-столбца в ф айл— производится
при помощи команды s a v e , аргументами которой являются: имя файла, перемен
ная, и дополнительный параметр - a s c i i , означающий запись в текстовом виде:
» v 2 = v . л 2;
» s a v e ' v e c 2 . d a t ' v2 - a s c i i
Если числа в текстовом файле расположены в строку и разделены пробелами,
то результатом считывания будет вектор-строка. Верно и обратное, запись зна
чений вектор-строки приведет к занесению их в строку в текстовом файле.
В ар и ан ты
1. Алексеев Сергей 1980 544535
Иванов Константин 1981 343435
Петров Олег 1980 555445
4. Результаты наблюдений
Time= 0.0 0.1 0.2 0.3 0.4 0.5 0.6
Mass=
2.1 2.3 2.3 1.9 1.8 2.4 2.9
0.8 0.7 0.5 1.1 3.2 0.3 0.4
62
Варианты
1. 0.1 0.2 0.3 9.91
1.9 0.4 0.1 8.01
4.7 5.1 3.9 7.16
3. 1 2 3 4 99 80
5 6 7 8 33 21
15 90
4. 10 20 40 50 12 19 21 32 44
-1 -2 -3 -4 32
10
5. 1 2 3 4 100
6 7 8 9 0.1 0.2 0.3 0.4 200
0.5 0.6 0.7 0.8 300
63
Библиографический список
64
СОДЕРЖАНИЕ
Введение....................................................................................................................... 3
§ 1. Вычисление арифметических выражений............................................................. 4
§ 2. Вектор-строки и вектор-столбцы........................................................................... 9
§ 3. Матрицы...............................................................................................................15
§ 4. Графика и визуализация данных...................................................................... 25
§ 5. Файл-функции и файл-программы................................................................... 37
§ 6. Программирование............................................................................................. 42
§ 7. Работа со строками....................................................................................................47
§ 8. Массивы структур и массивы ячеек................................................................. 52
§ 9. Текстовые файлы................................................................................................56
Библиографический список..................................................................................... 64
65