exponenta event banner

Перегрузка оператора

Почему операторы перегрузки

Реализуя операторы, соответствующие классу, можно интегрировать объекты класса в язык MATLAB ®. Например, объекты, содержащие числовые данные, могут определять такие арифметические операции, как+, *, - для использования этих объектов в арифметических выражениях. Реализуя реляционные операторы, можно использовать объекты в условных операторах, например switch и if заявления.

Определение операторов

Для работы с объектами класса можно внедрить операторы MATLAB. Для реализации операторов определите связанные методы классов.

Каждый оператор имеет связанную функцию (например, оператор + имеет связанную plus.m функция). Можно реализовать любой оператор, создав метод класса с соответствующим именем. Этот способ может выполнять любые шаги, подходящие для реализуемой операции.

Список операторов и связанных имен функций см. в разделе Операторы MATLAB и связанные функции.

Приоритет объекта в операциях

Определяемые пользователем классы имеют более высокий приоритет, чем встроенные классы. Например, предположим q является объектом класса double и p является определяемым пользователем классом. Оба этих выражения генерируют вызов plus метод в определяемом пользователем классе, если он существует:

q + p 
p + q

Может ли этот метод добавлять объекты класса double и определяемый пользователем класс зависит от способа реализации метода.

Когда p и q являются объектами различных классов, MATLAB применяет правила приоритета, чтобы определить, какой метод использовать.

Приоритет объекта при вызове метода предоставляет информацию о том, как MATLAB определяет метод для вызова.

Приоритет оператора

Перегруженные операторы сохраняют исходный приоритет MATLAB для оператора. Сведения о приоритетности операторов см. в разделе Приоритетность операторов.

Пример реализации - добавляемые объекты

Adder класс реализует добавление для объектов этого класса путем определения plus способ. Adder определяет добавление объектов как добавление NumericData значения свойств. plus метод конструирует и возвращает Adder объект, чей NumericData значение свойства является результатом сложения.

Adder класс также реализует оператор «меньше» (<) путем определения lt способ. lt метод возвращает логическое значение после сравнения значений в каждом объекте NumericData собственность.

classdef Adder
   properties
      NumericData
   end
   methods
      function obj = Adder(val)
         obj.NumericData = val;
      end
      function r = plus(obj1,obj2)
         a = double(obj1);
         b = double(obj2);
         r = Adder(a + b);
      end
      function d = double(obj)
         d = obj.NumericData;
      end
      function tf = lt(obj1,obj2)
         if obj1.NumericData < obj2.NumericData
            tf = true;
         else
            tf = false;
         end
      end
   end
end

Использование двойного преобразователя позволяет добавлять числовые значения в Adder и выполнять сложение с объектами класса.

a = Adder(1:10)
a = 

  Adder with properties:

    NumericData: [1 2 3 4 5 6 7 8 9 10]

Добавьте два объекта:

a + a
ans = 

  Adder with properties:

    NumericData: [2 4 6 8 10 12 14 16 18 20]

Добавьте объект с любым значением, которое может быть преобразовано в двойное:

b = uint8(255) + a
b = 

  Adder with properties:

    NumericData: [256 257 258 259 260 261 262 263 264 265]

Сравнить объекты a и b с использованием < оператор:

a < b
ans =

     1

Убедитесь, что класс обеспечивает любую проверку ошибок, необходимую для реализации конструкции класса.

Операторы MATLAB и связанные функции

В следующей таблице перечислены имена функций для операторов MATLAB. Реализация операторов для работы с массивами (скалярное расширение, векторизированные арифметические операции и так далее) также может потребовать изменения индексации и конкатенации. Ссылки в этой таблице используются для поиска конкретной информации по каждой функции.

Операция

Метод для определения

Описание

a + b

plus(a,b)

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

a - b

minus(a,b)

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

-a

uminus(a)

Унарный минус

+a

uplus(a)

Унарный плюс

a.*b

times(a,b)

Элементное умножение

a*b

mtimes(a,b)

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

a./b

rdivide(a,b)

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

a.\b

ldivide(a,b)

Разделение по левому элементу

a/b

mrdivide(a,b)

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

a\b

mldivide(a,b)

Матрица левого деления

a.^b

power(a,b)

Мощность по элементам

a^b

mpower(a,b)

Мощность матрицы

a < b

lt(a,b)

Меньше, чем

a > b

gt(a,b)

Больше, чем

a <= b

le(a,b)

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

a >= b

ge(a,b)

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

a ~= b

ne(a,b)

Не равно

a == b

eq(a,b)

Равенство

a & b

and(a,b)

ЛОГИЧЕСКОЕ И

a | b

or(a,b)

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

~a

not(a)

Логический NOT

a:d:b

a:b

colon(a,d,b)

colon(a,b)

Оператор двоеточия

a'

ctranspose(a)

Комплексное сопряженное транспонирование

a.'

transpose(a)

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

[a b]

horzcat(a,b,...)

Горизонтальная конкатенация

[a; b]

vertcat(a,b,...)

Вертикальная конкатенация

a(s1,s2,...sn)

subsref(a,s)

Подстрочная ссылка

a(s1,...,sn) = b

subsasgn(a,s,b)

Подстрочное назначение

b(a)

subsindex(a)

Индекс подстрочного индекса

Связанные темы