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

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

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

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

Имею ли я смысл?

Я не думаю, что это возможно, но если бы это было возможно, это было бы здорово.

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

Благодарность!

Редактировать:

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

Для любых двух случайных величин 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: я формально не обучен объектно-ориентированному программированию, поэтому иногда я могу использовать неправильное слово для понятия.

Еще раз спасибо за любую помощь!

2
Cyrano 27 Мар 2011 в 23:50
Я не совсем понимаю, что вы пытаетесь сделать, можете ли вы привести пример желаемого поведения? Вы пытаетесь создать f(double d) и f(int i), как я понял?
 – 
Juhl
28 Мар 2011 в 00:39
Извините, я не очень ясно выразился. я добавил некоторые пояснения
 – 
Cyrano
28 Мар 2011 в 01:27

1 ответ

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

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

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

1
abcd 28 Мар 2011 в 01:35
Я могу запутаться, но моя проблема в том, что я хочу перегрузить все функции. Я понимаю, что это может показаться безумием - см. выше, что я пытаюсь сделать.
 – 
Cyrano
28 Мар 2011 в 01:38
1
Я понимаю, что вы пытаетесь сделать, однако я не уверен, что это правильный подход к тому, что вам нужно. Вы пытаетесь получить range своих функций, учитывая domain. Учитывая домен D={d1,d2,d3} и функцию f(x), диапазон просто R=f(D). Теперь, как и в вашем примере, вы получите повторяющиеся значения, которые можно отсеять с помощью функции unique. Чтобы получить вероятность каждого из этих уникальных элементов, см. мой ответ на аналогичный вопрос.
 – 
abcd
28 Мар 2011 в 02:32
1
Спасибо за ваши ответы. У меня остались две проблемы: а) мой класс значительно сложнее, чем просто содержащий домен и вероятности (которые я не хочу вычислять с использованием статистических частот, потому что это было бы слишком медленно). б) Класс взаимодействует с кучей других вещей, и для удобства пользователя возможность написать Z=f(X) значительно лучше, чем создавать Z с нуля и заполнять его всеми соответствующими вещами. Синтаксис станет уродливым, и это удалит смысл того, что я пытаюсь сделать, то есть приятный интерфейс для обработки случайных переменных.
 – 
Cyrano
28 Мар 2011 в 02:59
Я должен добавить, что ваш подход - это именно то, как я бы вычислил новую область (хотя я хочу иметь возможность обобщать функции с несколькими входами, и в этом случае мне нужно охватить область всех случайных переменных, но я могу это сделать хорошо с setprod). Но, как я уже сказал, под брюхом класса скрывается гораздо больше вещей.
 – 
Cyrano
28 Мар 2011 в 03:02
1
Вы должны взглянуть на ответ на аналогичный вопрос о перегрузке. Это было бы хорошей отправной точкой. Как только вы изучите все арифметические операторы, большинство функций и пользовательских функций станут на свои места, поскольку большинство функций основано на базовой арифметике. Исключением могут быть функции, которые отклоняют входные данные, не относящиеся к определенному классу.
 – 
abcd
28 Мар 2011 в 03:34