Материал: Автоматизация проектирования систем и средств управления. Учебное пособие. Кисурин А.А., Беспаленко В.Д

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Объектно-ориентированное программирование в 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