Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2378

.pdf
Скачиваний:
0
Добавлен:
15.11.2022
Размер:
1.49 Mб
Скачать

Объектно-ориентированное программирование в MatLab

В Matlab 5, как и во многих других языках программирования существует своя структура данных, представленная определѐнным набором классов. В процессе программирования можно создавать новые типы данных и операций, то есть создавать классы, создавать объекты и управлять ими, если они являются образцами классов MATLAB.

Такой подход, широко известен как объектно-ориентированное программирование.

Объекты и классы

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

1.Свойством конкатенации;

2.Свойством наследования;

3.Свойством полиморфизма;

Всистеме MATLAB 5.2 определено 37 классов объектов (в первых версиях было только 5):

Таблица 5.1.Классы объектов

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

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

char

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

 

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

 

 

cell

-массивы ячеек.

 

 

sym

- класс символьных переменных;

 

 

uint8

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

 

 

ss

- пространство состояний, (подкласс Iti)

tf

- передаточная функция, (подкласс to)

zpk

- нули, полюса, коэффициент передачи, (подкласс Lti)

cursor, database - используются при работе с БД и запросами.

 

 

mf

- используется для работы с объектами нечѐткой логики.

 

 

Lti

- класс объектов, используемых для решения задач ана-

 

лиза лин. стационарных систем.

93

arrowline, axischild,

axisobj axistext, cel- - определение встроенных функций. lline, celltext, edit-

line, editrect, fighangle, figobj, framerect, hgbin, scribehandle, scribehgobj

inLine

- определение встроенных функций

 

 

activex

- класс используемый для работы с элементами ActiveX

 

 

network fdax fdline

 

fdmeas fdspec

 

Пример

В системе MATLAB используется встроенный класс inline, который дает простой способ определения встроенных функций для применения в программах вычисления квадратур, решения дифференциальных уравнений и вычисления нулей функции.

А= inline (' a*x^3+b*x^2+c*x+f', 'а', 'b', 'с', 'f', 'х') inline function

А(а, b, с, f)= a*x^3+b*x^2+c*x+f

Для обращения к функции: А(2,4,2,6,5) ans =366

ППП Symbolic Math Toolbox базируется на классе объектов sym, который позволяет выполнять вычисления с символьными переменными и матрицами.

Пример

syms Т s; W=l/((T*s+l)*s);

преобразуем по Лапласу: К= ilaplace (W,s,t) ans = 1 - exp (-t/T)

Добавление классов осуществляется в рамках операционной среды системы MATLAB, которая обеспечивает возможность хранения созданных объектов и организации каталога М-файлов, которые определяют допустимые методы обработки для данного класса объектов. Каталог класса включает М-функции, которые определяют допустимые методы обработки для данного класса объектов. Переопределение встроенных операторов для нового класса объектов в рамках объектноориентированного подхода называется переопределением методов.

94

В языке MATLAB отсутствует механизм объявления переменных.

Пример

A=zeros(10, 10); s = 'Hello world';

(формирует обычную матрицу размера 10*10, которая является объектом класса double. Точно так вторая строка создает объект класса char).

То же самое относится и к вновь создаваемым классам.

Никаких объявлений переменных или объектов не требуется. Объекты создаются динамически посредством вызова конструктора класса.

Структура объекта. (Свойство инкапсуляции)

Один из первых шагов при проектировании нового класса объектов - это выбор структуры данных для рассматриваемого класса. Объекты класса задаются в виде структур. Поля структуры и операции с полями видимы только внутри методов для данного класса.

Выбор той или иной структуры среди этих альтернативных структур для такого простого объекта, как полином, не особенно существенен, труден или важен, но для более сложных объектов выбор структуры данных может играть очень важную роль. Например, специальная структура данных sparse, выбранная для разреженных матриц, существенно сокращает время выполнения операции над ними.

Каталог класса. М-файлы, определяющие методы для объектов данного класса, объединяются в каталог класса, название которого задается как @,<имя_класса>. Это означает, что М-файлы, определяющие методы для создаваемого класса, должны быть размещены в каталоге @<имя класса>. Причѐм имя каталога : "имя_класса" должно совпадать с М-файлом (конструктором), отвечающим за инициализацию создаваемого объекта.

Каталог класса обязательно является подкаталогом каталога, описанного в пути доступа системы MATLAB, но не самим каталогом.

Пример:

каталог @inline - это подкаталог каталога toolbox/matlab/funfun, а каталог @sym - это подкаталог каталога toolbox/symbolic. Новый каталог @polynom должен быть подкаталогом рабочею каталога системы MATLAB или собственного персонального каталога, который должен быть добавлен к пути доступа. Добавление к пути доступа осуществляется при помощи функции : AddPath, или при помощи пиктограммы на панели инструментов.

Конструктор класса. Каталог класса должен обязательно содержать М-файл, называемый конструктором класса. Название конструктора должно совпадать с названиями класса и каталога без префикса @. Конструктор создает объекты, используя данные в виде массива записей (структуры) и приписывая им метку класса.

Система MATLAB позволяет вызывать конструктор без аргументов. В этом

95

случае конструктор должен создать шаблон объекта, как правило, с пустыми полями. Также возможно, что конструктор будет вызываться с аргументами входа, который уже является объектом данного класса. В этом случае конструктор обычно возвращает входной аргумент. Функция isa проверяет эту ситуацию.

Вобщем виде функция конструктора удовлетворяет следующим свойствам:

-в отсутствие аргументов возвращается шаблон объекта;

-если вход является объектом данного класса, то он же является выходом;

-преобразовывает вход в требуемую форму;

-присваивает значения различным полям структуры;

использует функцию class для того, чтобы приписать объекту соответствующую метку.

Функции isa и class. Эти функции используются конструктором, но могут применяться и вне каталога класса.

Функция isa(a, 'class_name') проверяет, принадлежит ли объект данному классу.

Пример:

Каждое из следующих выражений истинно:

isa(pi, 'double')

isa('hello', 'char')

isa(p, 'sym')

ans = 1

ans = 1

ans = 1

 

При использовании вне контекста методов функция class допускает только один аргумент.

Команда class(a) возвращает строку, содержащую имя класса для объекта а.

Пример:

Последовательность операторов возвращает соответственно:

class(pi)

class('hello')

class(p)

ans = 'double'

ans = 'char'

ans = 'sym'

Объекты и массивы. В системе MATLAB 5 к основному объекту системы класса описывается структурой, то допустимы следующие способы использования массива в качестве объекта некоторого класса:

-поле объекта - массив;

-объект - массив;

-элементы массива - объекты некоторого класса.

Если поле объекта - массив, то объект, описанный выше, должен иметь в своей структуре поле, которое является массивом , вектором, как частный случай. Это также подразумевает, что входные переменные, при создании объекта должны быть "полиномиальными", то есть, чтобы входные данные также представляли собой массивы или вектора.

Если сам объект - массив или массив структур (например объект представляет собой вектор-столбец, каждый элемент которого является переменной типа 'char'). Особенностью этого случая является, то, что каждый метод должен допол-

96

нительно использовать цикл (или несколько циклов) для обработки всех полиномов последовательности. Это усложняет применение методов, но упрощает работу с объектами.

Если применяется массив объектов, то чтобы сгенерировать последовательность объектов, надо просто работать с входными данными, хранящимися в массиве ячеек. Применение таких структур, как массив ячеек, вероятно, является, лучшим способом генерации элементов создаваемого объекта.

Преобразование классов. Вызов функции преобразования класса имеет вид: b = class_name(a)

где а - объект некоторого класса, отличного от class_name. В этом случае система MATLAB ищет метод с именем в каталоге классов для объекта а. Такой метод преобразовывает объект одного класса в объект другого класса. Если входной объект уже является объектом класса class_name, то система MATLAB вызывает функцию конструктора, который просто возвращает этот вход.

Две из наиболее важных функций преобразования классов - это double и char. Преобразование в класс double создает традиционный массив системы MATLAB, хотя это может и не отражать требуемого соответствия для некоторых классов. Преобразование в класс char полезно для вывода на печать.

Пример:

 

 

 

А=49;

С='123'

В='111’;

D=111;

char(A)

char(C)

double(B)

double(B)

ans='1'

ans ='123'

ans =49 49 49

ans =111

Таким образом для созданного класса объектов, например функция преобразования к классу double - это очень простой М-файл, находящийся в каталоге класса @<имя_класса>/double.m, который восстанавливает в общем случае вектор коэффициентов:

Пример: ( Приметный вид м-файла double.m) function с = double(p)

%Преобразование объекта в вектор коэффициентов.

%содержащий коэффициенты полинома по степеням переменной

и

с =р.с;

(где поле р.с - поле, содержащее коэффициенты полинома при соответствующих степенях ).

Пример:

 

 

 

А=49;

С='123'

В='111';

D=111;

char(A)

char(C)

double(B)

double(D)

ans ='1'

ans='123'

ans=49 49 49

ans=111

(char() - возвращает строку символов, double() - возвращает вектор коэффи-

97

циентов).

Вывод на терминал. Как правило, для удобства работы с объектами любого класса, классы имеют методы, отвечающие за вывод значения объекта или значения какого либо отдельного поля объекта на экран. (Например, метод с именем 'display' или 'disp' или 'plot') Причѐм нужно учесть ту особенность, что данный метод вызывается всякий раз, когда оказывается, что исполняемый оператор не

заканчивается ";"

Пример:

display(p) display(p); p=x^3-2*x-5

Так же нужно отметить, что аналогичный метод можно получить тремя способами:

1.Путѐм наследования метода другого существующего объекта.

2.Путѐм переопределения метода другого существующего объекта, (при наследовании и одновременной его модернизацией)

3.Путѐм непосредственного его написания.

Переопределение классов (свойство полиморфизма)

Во многих случаях можно изменить поведение операторов и функций системы MATLAB, когда в качестве аргумента выступает объект. Это осуществляется путем переопределения соответствующих функций. Переопределение класса открывает возможность обработки с помощью этой функции различных типов данных при произвольном количестве входных аргументов.

Переопределение арифметических операций и операторов. Каждый встроен-

ный оператор в системе MATLAB имеет имя. Поэтому любой оператор может быть переопределен путем создания М-файла с соответствующим названием в каталоге классов.

Переопределение операторов. Так же относиться к переопределению методов, являющихся стандартизованными в Matlab 5 и привязанных к определѐнного вида обозначению.

Следующая таблица устанавливает символьные имена для большинства встроенных операторов системы MATLAB. Символьные имена встроенных операторов системы MATLAB:

98

 

 

Таблица 5.2. Имена операторов

 

 

 

Оператор

Имя M-файлов

Описание

 

 

 

а+b

Plus(a.b)

Двоичное сложение

 

 

 

а-b

Minus (a. b)

Двоичное вычитание

 

 

 

uminus(a)

Унарное вычитание

 

 

 

Up Ins (a)

Унарное сложение

 

 

 

а.*b

Times(a, b)

Поэлементное умножение

 

 

 

А*b

Mtimes(.a, b.)

Умножение матриц

 

 

 

а./b

Rdivide(a, b)

Правое поэлементное деление

 

 

 

А.\b

Idivide(a, b)

Левое поэлементное деление

 

 

 

А/b

Mrdivide(a, b)

Правое деление матриц

 

 

 

А\b

mldivide(a, b)

Левое деление матриц

 

 

 

а.^b

Power(a, b)

Поэлементное возведение в степень

 

 

 

А^b

Mpower(a, b)

Возведение матрицы в степень

 

 

 

а<b

It(a, b)

Меньше

 

 

 

а >b

Gt(a, b)

Больше

а<=b

Le(a, b)

Меньше или равно

 

 

 

а>=b

ge(a, b)

Больше или равно

а~=b

Ne(a, b)

Неравно

 

 

 

а=b

Eq(a, b)

Тождественно

 

 

 

а&b

And(a,b)

Логическое И

 

 

 

a|b

or(a, b)

Логическое ИЛИ

 

 

 

Not(a, b)

Логическое НЕ

a:d:b a:b

Colon(a, d, b) Co-

Формирование вектора

 

lon(a, b)

 

a'

Ctranspose(a)

Транспонирование матрицы

 

 

 

a.'

Transpose(a)

Транспонирование массива

 

 

 

Command win-

display (a)

Вывод на терминал

dow output

 

 

[ab]

horzcat(a, b,...)

Объединение в строку

 

 

 

[a;b]

Vertcat(a, b,...)

Объединение в столбец

 

 

 

a(sl, s2,..,sn)

Subsref(a, s)

Индексная ссылка

 

 

 

A(sl,...sn)=b

Subsasgn(a, s, b)

Индексная выражение

B(a)

Subsindex(a, b)

Индекс подмассива

 

 

 

99

Переопределение функций. Можно переопределить любую М-функцию, создавая функцию с тем же именем в каталоге класса. Когда функция применяется к объекту, то ОНА прежде всего просматривает каталог соответствующего класса, а уже потом другие пути доступа. Чтобы переопределить функцию plot для некоторого класса, надо просто разместить М-файл plot.m в соответствующем каталоге класса: @<имя_класса>\р1оt.m

Пример: (На примере того же класса List) a=plot(obj)

disp('Значения полей объекта следующие:') disp(obj.number)

disp(obj.name)

disp(obj.mark) disp( )

, где obj.***** - поля данного объекта.

(отличием от привычной команды plot() в данном примере является то, что на экран выводятся значения полей объекта класса obj).

Функция methods (Позволяет просмотреть все методы класса) имеет следующие форматы:

methods('имя_класса') или methods имя класса

Пример: выводит на экран все методы для данного класса в следующем виде:

Methods ('List')

Methods for class List: get list nargin plot set

Иерархия объектов

Правило старшинства устанавливает иерархию объектов в системе MATLAB. Это позволяет управлять последовательностью обработки выражений, составленных из объектов. В системе MATLAB принято, что объекты имеют один приоритет и при выполнении выражения вызывается метод, ассоциированный с крайним левым объектом. Если установлено соотношение старшинства, то вызывается метод для класса с самым высоким приоритетом. Для установления иерархии объектов служат функции конструктора: inferiorto и superiorto.

Функция Superiorto('class_A') устанавливает более высокий приоритет объектов других классов по отношению к объектам класса, указанного в качестве аргумента.

Функция inferiorto('class А') устанавливает более низкий приоритет объектов других классов по отношению к объектам класса, указанного в качестве аргумента, (иначе говоря, объекты класса class_A имеют наивысший приоритет).

100

Индексация объектов

Общее правило состоит в том, что индексация объекта аналогична индексации структур.

Индексная ссылка. Использование индекса или указателя поля в правой части оператора присваивания называется индексной ссылкой. В этих случаях вызывается метод subsref, реализованный в виде встроенной функции. Соответствующие выражения могут иметь следующий вид: A(l), A{1}, A. field. Каждый из них приводит к вызову метода subsref в форме:

В = subsref(A, S)

Второй аргумент S является структурой с двумя полями. S.type - строка, содержащая символы'( }','; }' или '.'. которые определяют тип индекса.

круглые скобки соответствуют числовому массиву;

фигурные - массиву ячеек;

точка - структуре.

S.subs - массив ячеек или строка, содержащая фактические индексы, (двоеточие, используемое как индекс, соответствует строковой переменной':')

Таким образом выражение А(1:2,:) вызывает метод subsref(A, S), где S - структура размера 1х1:

S.type = '( )' S.subs=(1:2,':')

Эти простые обращения могут быть объединены в более сложные индексные выражения.

Пример:

Рис. 5.10 Схема, иллюстрирующая индексную структуру многомерного массива PATIENT.

101

В этом случае величина length(S) определяет количество уровней индексации. Таким образом выражение A(l, 2).name(3:4) вызывает метод subsret (A, S), где

S- структура размера 3х1 со следующими значениями полей:

S(l).type='( )'

S(2).type ='.'

S(3).type ='( )'

S(l).subs = '{1,2}'

S(2).subs = 'name'

S(3).subs = '{3.4}

Индексное присваивание. Использование индекса или указателя поля в левой части оператора присваивания называется индексным присваиванием. В этих случаях MATLAB вызывает метод subsasgn, реализованный в виде встроенной функции.

Пример:

А(1)=В А{1}=В A.field=B

(каждый из них приводит к вызову метода subsasgn в форме А = subsasgn(A, S, В)) Поля структуры S аналогичны полям структуры в случае индексной ссылки.

Функция subsasgn различает присваивание вида A(i) = [] и A(i) = В, где В - пустой массив.

>>a.name='Caшa';

>>a.group='SAU';

>>a.course=4;

>>a

name: Саша grope: SAU course: 4 из-

меним значение поля:

>>a.name = strcat(a.name,num2str(1)); >>a

name: Саша1 grope: SAU course: 4

При необходимости работать с такого рода структурами данных, удобным является создание своего пользовательского класса.

Наследование

Процедура, когда объекты одного класса приобретают свойства объект некоторый объект (дочерний) наследует свойства другого (родителя), дочерний объект включает все поля родительского объекта и может вызывать соответствующие методы.

Наследование - главное свойство объектно-ориентированного программирования. Оно позволяет многократно применять программы, разработанные для родительских объектов, к дочерним. Методы родительского класса имеют доступ только к тем полям, которые унаследованы от родительского класса, а не к полям

102

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]