gno*_*ice 12

你能在MATLAB中重新定义算术运算符吗?...是的

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

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

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

现在,我已经完成了我的免责声明,我会把你的枪交给你,可能会在脚下开枪......;)


MATLAB中的算术运算符具有在调用它们时在幕后调用的功能等价物,这些在此处列出.arraywise power运算符在调用时调用.^内置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
Run Code Online (Sandbox Code Playgroud)

如果您的变量xy类型double(在MATLAB中默认为),那么您将不得不隐藏内置@double\power函数.你可以通过创建一个目录(我们称之为temp),在被调用的子目录中创建一个子目录@double,然后将以下自定义power函数放在该子目录中来实现:

function result = power(x, y)
  result = sign(x).*abs(builtin('power', x, y));
end
Run Code Online (Sandbox Code Playgroud)

现在,基于MATLAB遵循的函数优先级顺序,如果将目录添加tempMATLAB路径,或者只是将当前工作目录更改为temp,则在使用时power将调用上面的自定义函数而不是内置函数..^双变量的运算符.


dan*_*ain 8

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

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

function a = myPowerFunc(x, y)

a = sign(x).*abs(x.^y);
Run Code Online (Sandbox Code Playgroud)