3

如何.^在 MATLAB 中重新定义指数函数?从:

x.^y

到:

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

2 回答 2

12

您可以在 MATLAB 中重新定义算术运算符吗?...是的

您是否应该在 MATLAB 中重新定义算术运算符?...嗯,可能不会。

为什么?因为 MATLAB 中的所有其他函数都期望算术运算符的行为与内置实现的定义相同。

我已经回答了一些其他相关问题,这些问题涉及重载算术运算符和隐藏内置行为,我绝对建议您先阅读这些问题,以了解这种方法所涉及的细节、困难和陷阱:

现在我已经完成了我的免责声明,我会把枪交给你,用它可能会射中你自己的脚……;)


MATLAB 中的算术运算符具有功能等效项,当您调用它们时会在后台调用它们,在此处列出。数组幂运算符在调用时调用.^内置power函数。

现在,将为使用它的每种数据类型定义一个单独的power函数。这个函数会放在一个目录下,你可以通过使用该函数查看存在的不同函数来查看:@typewhichpower

>> 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

如果您的变量xy将是类型double(默认情况下它们在 MATLAB 中),那么您将不得不隐藏内置@double\power函数。您可以通过创建一个目录(我们称之为temp),在该目录中创建一个子目录来做到这一点@double,然后power在该子目录中放置以下自定义函数:

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

现在,根据 MA​​TLAB 遵循的函数优先顺序,如果您将目录添加tempMATLAB 路径,或者如果您只是将当前工作目录更改为temp,那么power在使用.^双变量上的运算符。

于 2011-09-28T04:45:09.057 回答
8

不。它不会是正确的。(-1).^(1/2) 应该总是给你虚数单位 (i)。您拥有的表达式会给您 (-1).^(1/2) -> -1。更糟糕的是,考虑 (-1)^2。

创建一个单独的函数来执行您描述的操作。就像是

function a = myPowerFunc(x, y)

a = sign(x).*abs(x.^y);
于 2011-09-28T03:03:11.490 回答