Я создаю класс, который для всех практических целей (хотя он гораздо сложнее, чем выглядит) можно рассматривать как вещественное число 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: я формально не обучен объектно-ориентированному программированию, поэтому иногда я могу использовать неправильное слово для понятия.
Еще раз спасибо за любую помощь!
1 ответ
Да, вы можете перегружать операторов. Однако для того, что вы пытаетесь сделать, это излишне. Все, что вам нужно, это простая проверка ввода с помощью функции isreal
.
function rejectComplex(inputValue)
if ~isreal(inputValue)
error('Input is not a real number')
end
Если вы введете комплексное число в качестве входных данных для этой функции, она отобразит ошибку, иначе — нет. Теперь вы можете построить свою функцию вокруг этого, чтобы весь код выполнялся только при выполнении условия (поэтому продолжайте свою функцию после оператора end
выше)
range
своих функций, учитывая domain
. Учитывая домен D={d1,d2,d3}
и функцию f(x)
, диапазон просто R=f(D)
. Теперь, как и в вашем примере, вы получите повторяющиеся значения, которые можно отсеять с помощью функции unique
. Чтобы получить вероятность каждого из этих уникальных элементов, см. мой ответ а> на аналогичный вопрос.
Похожие вопросы
Связанные вопросы
Новые вопросы
matlab
MATLAB - это высокоуровневая языковая и интерактивная среда программирования для численных расчетов и визуализации, разработанная MathWorks. Не используйте оба тега [matlab] и [octave], если явно не задан вопрос о сходстве или различии между ними. При использовании этого тега, пожалуйста, укажите версию MATLAB, с которой вы работаете (например, R2017a).
f(double d)
иf(int i)
, как я понял?