如何.^
在 MATLAB 中重新定义指数函数?从:
x.^y
到:
sign(x).*abs(x.^y))
如何.^
在 MATLAB 中重新定义指数函数?从:
x.^y
到:
sign(x).*abs(x.^y))
您可以在 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
在使用.^
双变量上的运算符。
不。它不会是正确的。(-1).^(1/2) 应该总是给你虚数单位 (i)。您拥有的表达式会给您 (-1).^(1/2) -> -1。更糟糕的是,考虑 (-1)^2。
创建一个单独的函数来执行您描述的操作。就像是
function a = myPowerFunc(x, y)
a = sign(x).*abs(x.^y);