如何在MATLAB中重新定义。^运算符?

时间:2011-09-28 02:49:16

标签: matlab function operator-overloading exponential redefine

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

x.^y

为:

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

2 个答案:

答案 0 :(得分:12)

  

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

     

应该你在MATLAB中重新定义算术运算符吗?......呃,可能不是。

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

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

现在我已经完成了我的免责声明了,我会把你用枪射向你的枪......;)


MATLAB中的算术运算符具有在调用它们时在幕后调用的功能等价物,它们列在here中。数组方向幂运算符.^在调用时调用内置的power函数。

现在,将为使用它的每个data type定义一个单独的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

如果您的变量xy将是double类型(默认情况下它们在MATLAB中),那么您必须隐藏内置的{{} 1}}功能。您可以通过创建一个目录(我们称之为@double\power),在名为temp的子目录中创建一个子目录,然后将以下自定义@double函数放在该子目录中来实现此目的: / p>

power

现在,基于function precedence order MATLAB,如果您将目录function result = power(x, y) result = sign(x).*abs(builtin('power', x, y)); end 添加到MATLAB path,或者只是将current working directory更改为temp },然后在双变量上使用temp运算符时,将调用上面的自定义power函数而不是内置函数。

答案 1 :(得分:8)

别。这是不正确的。 (-1)。^(1/2)应该总是给你假想单位(i)。你得到的表达式会给你(-1)。^(1/2) - > -1。更糟糕的是,考虑(-1)^ 2。

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

这样的东西
function a = myPowerFunc(x, y)

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