如何在MATLAB中重新定义指数函数.^
?发自:
x.^y
至:
sign(x).*abs(x.^y))
发布于 2011-09-28 12:45:09
你能在
中重新定义一个算术运算符吗?是
你是否应该在中重新定义算术运算符?...呃,可能不会。
为什么?因为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中的默认类型一样),那么您将不得不隐藏内置的@double\power
函数。为此,您可以创建一个目录(我们将其称为temp
),在名为@double
的目录中创建一个子目录,然后在该子目录中放置以下自定义power
函数:
function result = power(x, y)
result = sign(x).*abs(builtin('power', x, y));
end
现在,基于MATLAB下面的function precedence order,如果您将目录temp
添加到MATLAB path,或者如果您简单地将current working directory更改为temp
,则在对双变量使用power
运算符时,将调用上面的自定义.^
函数而不是内置的函数。
发布于 2011-09-28 11:03:11
不要,这不会是正确的。(-1).^(1/2)应该总是给你虚数单位(i)。您拥有的表达式将得到( -1 ).^(1/2) -> -1。更糟糕的是,考虑(-1)^2。
创建一个单独的函数来执行您所描述的操作。就像这样
function a = myPowerFunc(x, y)
a = sign(x).*abs(x.^y);
https://stackoverflow.com/questions/7577802
复制相似问题