Как переопределить оператор. ^ В MATLAB? - PullRequest
3 голосов
/ 28 сентября 2011

Как мне переопределить экспоненциальную функцию .^ в MATLAB? От:

x.^y

до:

sign(x).*abs(x.^y))

Ответы [ 2 ]

12 голосов
/ 28 сентября 2011

Можете ли вы переопределить арифметический оператор в MATLAB? ... Да

Должен ли переопределить арифметический оператор в MATLAB? ... Эх, вероятно нет.

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

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

И теперь, когда я закончил со своим заявлением об ограничении ответственности, я передам вам пистолет, из которого можно выстрелить себе в ногу ...;)


Арифметические операторы в MATLAB имеют функциональные эквиваленты, которые вызываются за кулисами при их вызове, которые перечислены здесь . Оператор массива .^ при вызове вызывает встроенную функцию power.

Теперь будет отдельная power функция, определенная для каждого типа данных , который ее использует. Эта функция будет помещена в каталог @type, который можно увидеть с помощью функции which для просмотра различных существующих функций power:

>> which power -all
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@single\power)  % single method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@double\power)  % double method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@char\power)    % char method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@int64\power)   % int64 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@int32\power)   % int32 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@int16\power)   % int16 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@int8\power)    % int8 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@uint64\power)  % uint64 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@uint32\power)  % uint32 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@uint16\power)  % uint16 method
built-in (C:\Program Files\MATLAB\R2010b\toolbox\matlab\ops\@uint8\power)   % uint8 method

Если ваши переменные x и y будут иметь тип double (как они есть по умолчанию в MATLAB), то вам придется затенять встроенный @double\power функция. Вы можете сделать это, создав каталог (назовем его temp), создав подкаталог в этом каталоге с именем @double, а затем поместив следующую пользовательскую функцию power в этот подкаталог:

function result = power(x, y)
  result = sign(x).*abs(builtin('power', x, y));
end

Теперь, в соответствии с порядком приоритета функции , MATLAB следует, если вы добавите каталог temp в путь MATLAB , или если вы просто измените текущую рабочую информацию директории от до temp, то при использовании оператора .^ для двойных переменных вместо встроенной будет вызываться указанная выше пользовательская функция power.

8 голосов
/ 28 сентября 2011

Не.Это не будет правильно.(-1). ^ (1/2) всегда должен давать вам мнимую единицу (i).Ваше выражение даст вам (-1). ^ (1/2) -> -1.Что еще хуже, подумайте (-1) ^ 2.

Создайте отдельную функцию для выполнения описываемой вами операции.Что-то вроде

function a = myPowerFunc(x, y)

a = sign(x).*abs(x.^y);
...