如何在MATLAB中重新定义指数函数.^
?从:
x.^y
为:
sign(x).*abs(x.^y))
答案 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
如果您的变量x
和y
将是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);