Учебное пособие для студентов высших учебных заведений
Скачать 5.41 Mb.
|
>> 'Это' получим в командном окне ans = Это Аналогично, при помощи знака присваивания, производится определение переменных типа char: >> st1 = ' Это '; st2 = ' строка '; st3 = ' символов. '; >> st1,st2,st3 st1 = Это st2 = строка st3 = символов. Объединение нескольких строк в единую строку (сцепление или конкате- нацию) можно осуществить с помощью обычной операции объединения векторов в строку: >>[st1 st2 st3 ] ans = Это строка символов. Другая возможность достичь той же цели - использование процедуры strcat(s1,s2,...sn), которая производит сцепление заданных строк s1, s2, ... sn в еди- ную строку в порядке их указания в списке аргументов: >> st = strcat(st1,st2,st3) st = Это строка символов. 3.1. Основные классы объєктов 164 Объединить строки символов в несколько отдельных, но соединенных в единую конструкцию строк, можно, используя другую процедуру - strvcat (верти- кальной конкатенации): >> stv = strvcat(st1,st2,st3) stv = Это строка символов Примечание. Для такого сцепления символьных строк нельзя применять операцию вертикального сцепления (символ ' ; '), используемую для построения матрицы из отдельных строк, так как количество элементов (символов) сцепляе- мых символьных строк может быть различным). Например >> [st1; st2; st3] ??? All rows in the bracketed expression must have the same number of columns. Символьная строка представляет собой массив (точнее – вектор-строку), элементами которого являются отдельные символы, из которых она состоит, включая символы пробелов. Поэтому информацию о любом символе в строке можно получить, указав номер этого символа от начала строки (при этом, конеч- но, надо учитывать и символы пробелов). Например: >> st(3) ans = т >> st(3:12) ans = то строка Совокупность вертикально сцепленных строк образует двумерный массив (матрицу) символов. Поэтому, команда >> ss =stv(2,3:end) приводит к результату: ss = трока Процедура strrep(s1, s2, s3) формирует строку из строки s1 путем замены всех ее фрагментов, которые совпадают с строкой s2 на строку s3: >> st = [st1 st2 st3] st = Это строка символов. >> y = strrep(st,'о','а') y = Эта страка симвалав. >> x = strrep(st,'а','о') x = Это строко символов. Функция upper(st) переводит все символы строки st в верхний регистр. На- пример: >> x1 = upper(st) x1 = ЭТО СТРОКА СИМВОЛОВ. Аналогично, функция lower(st) переводит все символы в нижний регистр: >> x2 = lower(x1) x2 = это строка символов. Процедура findstr(st,st1) выдает номер элемента строки st, с которого начи- нается первое вхождение строки st1, если она есть в строке st: >> findstr(st,'рок') ans = 9 Как ранее отмечалось, довольно часто возникает необходимость вставить в строку символов числовое значение одного или нескольких рассчитанных пара- 3.1. Основные классы объєктов 165 метров, что связано с переводом числовой переменной в строку символов опреде- ленного вида. Это можно сделать с помощью процедуры num2str. Входным аргу- ментом этой процедуры является числовая переменная (класса double). Процедура формирует представление значения этой числовой переменной в виде символьной строки. Формат представления определяется установленным форматом Numeric Format. В качестве примера рассмотрим формирования текстовой строки с включением значения переменной: >> x = pi; >> disp(['Значение переменной ''x'' равно ', num2str(x)]) Значение переменной 'x' равно 3.1416 Аналогичним образом, при помощи процедуры mat2str(A) можно получить значение матрицы А в виде символьной строки: >> A = [1,2,3;4 5 6; 7 8 9]; >> disp(mat2str(A)) [1 2 3;4 5 6;7 8 9] Обратный переход от символьного представления числа к численному осу- ществляется процедурой str2num : >> stx = num2str(x) stx = 3. 1416 >> y = str2num(stx) y = 3. 1416 >> y+5 ans = 8. 1416 >> z = stx+5 z = 56 51 54 57 54 59 Последний результат получен вследствие того, что строка символов stx при включении ее в арифметическую операцию автоматически перестраивается в класс double, т. е. все символы, составляющие ее, заменяются целыми числами, равными коду соответствующего символа. После этого сложение полученного чи- слового вектора с числом 5 происходит по обычным правилам, т. е. 5 суммируется с каждым из кодов символов. Проверим это, учитывая, что с помощью процедуры double(str) можно получить числовое представление строки символов str в виде кодов составных ее символов: >> double(stx) ans = 51 46 49 52 49 54 Сравнивая полученный результат с предыдущим, можно убедиться в спра- ведливости сказанного. Функция str2mat(st1,st2,... ,stn) действует аналогично функции strvcat(st1,st2, ... , stn), т. е. образует символьную матрицу, располагая строки st1, st2, ... ,stn одна под другой: >> Z = str2mat(st1,st2,st3) Z = Это строка символов 4.1.2. Класс записей (struct) Массивы записей - это тип массивов в системе MatLAB, в котором разреша- ется сосредоточивать в виде записей разнородные данные (т. е. данные разных 3.1. Основные классы объєктов 166 классов). Отличительной особенностью таких массивов является наличие имено- ванных полей. Как и вообще в MatLAB, массивы записей не объявляются. Отдельные эк- земпляры этого класса создаются автоматически при задании конкретных значе- ний полям записи. Обращение к любому полю за именем field осуществляется так: <имя переменной-записи> . field Например, команда >> PG81. fam = 'Аврутова' PG81 = fam: 'Аврутова' приводит к автоматическому формированию переменной PG81 класса struct с единственным полем fam, значение которого - символьная строка Аврутова. Та- ким же образом к этой переменной можно добавлять другие поля: >> PG81. imya = 'Марина'; PG81. bat = 'Степановна'; >> PG81 PG81 = fam: 'Аврутова' imya: 'Марина' bat: 'Степановна' В результате получим ту же переменную-запись, но уже с тремя полями. Чтобы создать массив аналогичных переменных с теми же полями и с тем же именем PG81 достаточно доибавлять при обращении к этому имени номер записи (в скобках, как к элементу массива): >> PG81(2). fam = 'Березнюк' ; >> PG81(2). imya = 'Алексей'; PG81(2). bat = 'Иванович'; >> PG81(3). fam = 'Попель' ; >> PG81(3). imya = 'Богдан'; PG81(3). bat = 'Тимофеевич'; >> PG81 PG81 = 1x3 struct array with fields: fam imya bat Как видим, в случае массива записей, содержимое полей уже не выводится на экран. Выводится лишь информация о структуре массива, его размерах и име- нах полей. Для получения информации о именах полей записи можно использовать функцию fieldnames: >> fieldnames(PG81) ans = 'fam' 'imya' 'bat' Другой способ задания переменной-записи - применение функции struct по схеме <имя записи> = struct('<имя поля1>', <значение1>, '<имя поля2>', <значе- ние2>, ...). Например, команда 3.1. Основные классы объєктов 167 >> PG72= struct('fam','Сергеев','imya','Сергей','bat','Сергеевич','god', 1981) приведет к формированию такой переменной-записи: PG72 = fam: 'Сергеев' imya: 'Сергей' bat: 'Сергеевич' god: 1981 Используя индексацию, можно легко определить значение любого поля или элемента структуры. Таким же образом можно присвоить значение любому полю или элементу структуры. Если к какому-либо из элементов массива записей (структуры) добавляется значение нового поля, то же поле автоматически появляется во всех остальных элементах, хотя значение этого поля у других элементов при этом остается пус- тым. Например: >> PG81. fam = 'Аврутова' ; >> PG81. imya = 'Марина'; PG81. bat = 'Степановна'; >> PG81(2). fam = 'Березнюк' ; >> PG81(2). imya = 'Алексий'; PG81(2). bat = 'Иванович'; >> PG81(3). fam = 'Попіль' ; >> PG81(3). imya = 'Богдан'; PG81(3). bat = 'Тимофеевич'; >> PG81(3). god = 1982 PG81 = 1x3 struct array with fields: fam imya bat god >> PG81(2). god ans = [] Чтобы удалить некоторое полеиз всех элементов массива записей, надо ис- пользовать процедуру rmfield по схеме S= rmfield (S, 'имя поля '), где S - имя массива записей, который корректируется. Рассмотрим пример: >> PG81 = rmfield(PG81, 'bat') PG81 = 1x3 struct array with fields: fam imya god Класс struct, как видим, имеет незначительное число методов, что делает его непосредственное использование при расчетах довольно проблематичным. Однако именно на использовании объектов этого класса основана возможность создавать новые классы объектов (см. далее). Поэтому этот класс является очень важным для расширения возможностей системы MatLAB. 4.1.3. Класс ячеек (cell) Массив ячеек - это массив, элементами которого есть ячейки, которые сами могут содержать любой тип массива, в том числе и массив ячеек. Массивы ячеек позволяют хранить массивы с элементами разных типов и разных измерений. На- пример, одна из ячеек может содержать матрицу действительных чисел, вторая - 3.1. Основные классы объєктов 168 массив символьных строк, третья - вектор комплексных чисел. Можно строить массивы ячеек любых размеров и любой структуры, включая и многомерные. Создать массив ячеек можно двумя способами: - использованием операторы присваивания; - при помощи функции cell предварительно сформировать пустой массив, а потом присвоить значения отдельным ячейкам. Применение операторов присваивания Есть два способа присвоить значения отдельным каморкам - индексация ячеек и индексация содержимого. Индексация ячеек. При присваивании значений отдельным элементам массива ячеек индексы ячейки в левой от знака присваивания части размещают в скобках, используя стандартные обозначения для массива, а в правой части при- сваиваемое значение ячейки помещают в фигурные скобки. Для примера рассмотрим создание массива C ячеек размером (2*2). Для этого определим каждый элемент этого массива, т. е. каждую из ячеек, так: >> C(1,1) = {' Иванов И. Ю.'}; >> C(1,2) = {[1 2 3; 4 5 6; 7 8 9]}; >> C(2,1) = {5-3i}; >> C(2,2) = {-pi : pi/5 : pi} C = ' Иванов И. Ю.' [3x3 double] [5. 0000- 3. 0000i] [1x11 double] Индексация содержимого. В этом случае в левой от знака присваивания части элемент массива ячеек указывается в фигурных скобках, а в правой части - содержимое соответствующей ячейки без скобок: >> C{1,1} = ' Иванов И. Ю.'; >> C{1,2} = [1 2 3; 4 5 6; 7 8 9]; >> C{2,1} = 5-3i; >> C{2,2} = -pi : pi/5 : pi C = ' Иванов И. Ю.' [3x3 double] [5. 0000- 3. 0000и] [1x11 double] Как видно из примеров, система MatLAB отображает массив ячеек в сокра- щенной форме. Чтобы отобразить содержимое ячеек, нужно применять функцию celldisp: >> celldisp(C) C{1,1} = Иванов И. Ю. C{2,1} = 5.0000 - 3.0000i C{1,2} = 1 2 3 4 5 6 7 8 9 C{2,2} = Columns 1 through 7 -3.1416 -2.5133 -1.8850 -1.2566 -0.6283 0 0.6283 Columns 8 through 11 1. 2566 1. 8850 2. 5133 3. 1416 Для отображения структуры массива ячеек в виде графического изображе- ния на экране предназначена функция cellplot >> cellplot(C) 3.1. Основные классы объєктов 169 Рис. 3.1 Фигурные скобки являются конструктором массива ячеек так же, как квад- ратные скобки являются конструктором числового массива. Фигурные скобки аналогичны квадратным, за исключением того, что они могут быть еще и вложен- ными. Например, предшествующий массив С ячеек может быть построен так: >> C = { ' Иванов И. Ю.', [1 2 3; 4 5 6; 7 8 9]; 5-3и,-pi : pi/5 : pi } C = ' Иванов И. Ю.' [3x3 double] [5. 0000- 3. 0000i] [1x11 double] Применение функции cell Функция cell позволяет создать шаблон массива ячеек, заполняя его пус- тыми ячейками. Пример. Создадим пустой массив ячеек размером (2*3): >> A = cell(2,3) A = [] [] [] [] [] [] Заполним одну из ячеек, используя оператор присваивания: >> A(2,2) = {0 : pi/10:2*pi} A = [] [] [] [] [1x21 double] [] Извлечение данных из массива ячеек можно также осуществить двумя пу- тями. Первый способ рассмотрим на примерах. Извлечение содержимого отдельных ячеек производится указанием индек- сов нужной ячейки в фигурных скобках: >> B =C{1,2} B = 1 2 3 4 5 6 7 8 9 3.1. Основные классы объєктов 170 >> st = C{1,1} st = Иванов И. Ю. Извлечение содержимого отдельных элементов определенной каморки про- изводится дополнительным указанием в дужках индексов элемента массива, на- ходящегося в нужной каморке: >> x =C{1,2}(2,3) x = 6 >> y= C{1,1}(1:5) y = Иван Второй способ позволяет извлекать из массива ячеек другой массив ячеек, составляющий часть первого: >> D = A(2,2:3) D = [1x21 double] [] В этом случае применяются обычные скобки. Массивы ячеек используются для объединения массивов данных разных типов и размеров. Массивы ячеек удобнее массивов записей (структур) в следую- щих обстоятельствах: - когда нужен доступ одновременно к нескольким полям; - когда нужен доступ к подмножествам данных в виде списка переменных; - когда число полей не определено; - когда нужно извлекать поля из структуры. В заключение заметим, что для того, чтобы установить, какому классу принадлежит тот или другой вычислительный объект, к имени этого объекта следует применить процедуру class: >> x=pi; >> class(x) ans =double >> st='Письмо'; >> class(st) ans =char >> s=class(num2str(x)) s =char 3.2. Производные классы MatLAB 171 4.2. Производные классы MatLAB Рассмотренные ранее классы вычислительных объектов построены таким образом, что на их основе пользователь имеет возможность создавать новые собственные классы объектов. В самой системе MatLAB на этой основе создан и используется встроенный класс inline, который предоставляет простой способ определения встроенных функций для применения в программах вычисления интегралов, решения дифференциальных уравнений и вычисления минимумов и нулей функций. Пакет символьных вычислений Symbolic Math Toolbox базируется на классе объектов sym, который позволяет выполнять вычисления с символьными переменными и матрицами. Пакет Control System Toolbox использует класс объектов lti и три его дочерних подкласса tf, zpk, ss, которые поддерживают алгоритмы анализа и синтеза линейных стационарных систем автоматического управления. В языке MatLAB отсутствует необходимость и возможность предварительного объявления типа или класса переменных, которые будут использованы. То же самое относится и к объектам любых вновь создаваемых классов. Объекты класса создаются в виде структур (записей), т. е. к потомкам (наследникам) класса struct. Поля структуры и операции с полями являются доступными только внутри методов данного класса. Все М-файлы, определяющие методы объектов данного класса, должны размещаться в специальном каталоге, который называется каталогом класса и обязательно имть имя, состоящее из знака @ (коммерческое 'эт') и имени класса, т. е. @<имя класса>. Каталог класса должен быть подкаталогом одного из каталогов, описанных в путях доступа системы MatLAB, но не самим таким каталогом. Каталог класса обязательно должен содержать М-файл с именем, сов- падающим с именем класса. Этот файл называют конструктором класса. Назначение такого М-файла - создавать объекты этого класса, используя данные в виде массива записей (структуры) и приписывая им метку класса. 4.2.1. Класс объектов inline В MatLAB определен класс объектов inline. Он предназначен для описания функций в виде F(x, P1, P2, ...), который соответствует их математическому описанию. При таком представлении вычисления функции при заданных значениях аргумента x и параметров P1, P2, ... может осуществляться путем об- ращения к ней в естественной форме, например, F(0.6, -0.5, 3). Классу inline соответствует подкаталог @INLINE каталога TOOLBOX/MATLAB/FUNFUN. В нем содержатся такие М-файлы: - конструктор inline; - методы класса argnames disp formula nargin vectorize cat display horzcat nargout vertcat |