Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Начала прогаммирования в среде MatLab / Начала программирования в среде MatLab.pdf
Скачиваний:
254
Добавлен:
02.05.2014
Размер:
5.66 Mб
Скачать

3.1. Основные классы объєктов

162

 

 

 

4. Классы вычислительных объектов

Классом в MatLAB принято называть определенную форму представления вычислительных объектов в памяти ЭВМ в совокупности с правилами (процедурами) их преобразования. Класс определяет тип переменной, а правила - операции и функции, которые могут быть применены к этому типу. В свою очередь, тип определяет объем памяти, которая отводится записи переменной в память ЭВМ и структуру размещения данных в этом объеме. Операции и функции, которые могут быть применены к определенному типу переменных, образовывают методы этого класса.

4.1.Основные классы объектов

Всистеме MatLAB определены шесть встроенных классов вычислительных объектов:

-double - числовые массивы и матрицы действительных или комплексных чисел с плавающей запятой в формате двойной точности;

-sparse - двумерные действительные или комплексные разреженные матри-

цы;

-char - массивы символов;

-struct - массивы записей (структуры);

-cell - массивы ячеек;

-uint8 - массивы 8-битовых целых чисел без знаков.

Класс double определяет наиболее распространенный тип переменных в системе MatLAB, с которыми оперирует большинство функций и процедур. Класс char определяет переменные, которые являются совокупностью символов (каждый символ занимает в памяти 16 битов). Эту совокупность часто называют строкой. Класс sparse определяет тип переменных, которые являются разреженными матрицами двойной точности. Разреженная структура применяется для хранения матриц с незначительным количеством ненулевых элементов, что позволяет использовать лишь незначительную часть памяти, необходимой для хранения полной матрицы. Разреженные матрицы требуют применения специальных методов для решения задач. Переменные класса cell (ячейки) являются совокупностью некоторых других массивов. Массивы ячеек позволяют объединить связанные данные (возможно, разных типов и размеров) в единую структуру. Объекты класса struct состоят из нескольких составляющих, которые называются полями, каждое из которых носит собственное имя. Поля сами могут содержать массивы. Подобно массивам ячеек, массивы записей объединяют связанные данные и информацию о них, однако способ обращения к элементам структуры (полям) принципиально иной - путем указывания имени поля через точку после имени структуры. Наконец, класс uint8 позволяет сохранять целые числа от 0 до 255 в 1/8 части памяти, необходимой для чисел двойной точности. Никакие математические операции для этого класса данных не определены.

3.1. Основные классы объєктов

163

 

 

 

Каждому типу данных соответствуют собственные функции и операторы обработки, т. е. методы. Приведем некоторые из них:

-класс array (обобщенный класс объектов-массивов, являющийся прародителем всех упомянутых встроенных классов) имеет такие методы: определение размеров (size), длины (length), размерности (ndims), объединение массивов ([a b]), транспонирование (transpose), многомерная индексация (subindex), переопределение (reshape) и перестановка (permute) измерений многомерного массива;

-методы класса char (строки символов) - строковые функции (strcmp, lower), автоматическое преобразование в тип double;

-методы класса cell - индексация с использованием фигурных скобок {e1,...en} и разделением элементов списка запятыми;

-методы класса double - поиск (find), обработка комплексных чисел (real, imag), формирование векторов, выделение строк, столбцов, подблоков массива, расширение скаляра, арифметические и логические операции, математические функции, функции от матриц;

-методы класса struct - доступ к содержимому поля ( . field) (разделитель элементов списка - запятая);

-в классе uint8 - единый метод - операция сохранения (чаще всего приме-

няется с пакетом Image Processing Toolbox).

4.1.1.Класс символьных строк (char)

Введение строк символов из клавиатуры осуществляется в апострофах. Например, вводя совокупность символов

>> 'Это'

получим в командном окне

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>, ...).

Например, команда