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

Зачем перегружать операторов

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

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

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

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

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

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

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

q + p 
p + q

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

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

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

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

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

Пример реализации - Addable Objects

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

The Adder класс также реализует оператор меньше, чем (<) путем определения lt способ. The 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)

Индекс индекса индекса

Похожие темы