перегрузка каждого оператора функции для класса в Matlab - PullRequest
2 голосов
/ 27 марта 2011

Я создаю класс, который для всех практических целей (хотя он гораздо сложнее, чем выглядит) можно рассматривать как вещественное число в формате matlab.

В классе я могу перегрузитьбольшое количество операторов matlab, таких как plus, mpower и т. д.

Вероятно, это невозможно, но как мне перегрузить любую функцию моего класса?Другими словами, предположим, что у меня есть произвольная функция f, которая принимает действительные числа и выводит действительные числа, и говорит, что X является экземпляром моего класса.Я хотел бы, чтобы f (X) правильно интерпретировался с помощью matlab (конечно, у меня есть естественный способ взять указатель на функцию и применить его к моему классу, что я и сделал бы в коде).

Проблемы, которые я могу видеть: у matlab нет возможности увидеть, что функция f принимает в качестве входных данных действительное число.Но я бы оставил это пользователю, чтобы не портить вызовы его функций.

Имею ли я какой-то смысл?

Не думаю, что это возможно, но если бы это было так, это было быофигенно.

ps: я знаю, что, возможно, смогу обойти это, создав метод, который принимает дескриптор функции в качестве входных данных, но он менее симпатичен ..

Спасибо!

edit:

Извините, я понимаю, что это немного сбивает с толку.Я буду более ясным.Допустим, у меня есть класс, который представляет случайные, реальные переменные (скажем, для дискретного набора для простоты).Мой класс содержит распределение вероятностей случайной величины, а также ее возможные значения.

Для любых двух случайных величин X, Y сумма X + Y четко определена, поэтому, если у меня есть экземпляры X и Yкоторые представляют случайные величины, было бы неплохо, если бы Z = X + Y определял новую случайную переменную, равную сумме X и Y, с соответствующим набором и распределением.Я сделал это, перегрузив оператор плюс.Это хорошо.

Скажи, что у меня есть произвольная функция f, скажем "cos".Ну, для любой случайной величины X, cos (X) также является случайной величиной, и было бы неплохо, если бы я мог просто написать Z = cos (X), который автоматически создаст экземпляр моего класса, вычислит соответствующую область иРаспределение вероятностей.

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

Чтобы привести еще один пример: я создаю случайную переменную X с областью [-2, -1,0,1,2] и вероятностями [1 / 5,1 / 5,1 / 5,1 / 5, 1/5]

Я создаю (странную) функцию f такую, что f (x) = x, если x = -2 или 2 f (x) = x ^ 2 в противном случае

Затем, установив Z = f (X), я хочу, чтобы matlab автоматически создал случайную величину Z с областью {-2,0,1,2} и вероятностями [1/5, 1/5,2/5, 1/5]

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

это имеет какой-то смысл?

ps: я не обучен формально объектно-ориентированному программированию, поэтому я могу использоватьиногда неверное слово для понятия.

Опять же, спасибо за любую помощь!

1 Ответ

1 голос
/ 28 марта 2011

Да, вы можете перегрузить операторов.Однако то, что вы пытаетесь сделать, это излишне.Все, что вам нужно, это простая проверка ввода с помощью функции isreal.

function rejectComplex(inputValue)
    if ~isreal(inputValue)
        error('Input is not a real number')
    end

Если вы введете комплексное число в качестве ввода для этой функции, оно отобразит ошибку, в противном случае это не так.Теперь вы можете построить свою функцию вокруг этого, чтобы весь код выполнялся только тогда, когда условие выполнено (поэтому продолжайте работу с вашей функцией после оператора end выше)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...