超载!(砰)算子

Rat*_*ert 4 matlab operator-overloading

在回答这个问题时,MathWorks支持团队指出:

也有可能超载!(bang)运算符通过创建一个名为"!.m"的文件,并将此文件放在MATLAB搜索路径中的$ MATLABROOT\toolbox\matlab\general目录之前.

我试过这个,似乎没有用.我在Linux Mint上运行Matlab 9.1.0.441655(R2016b).我的路径看起来像这样:

/home/raphael/Programs/Test
/usr/local/MATLAB/R2016b/toolbox/matlab/iofun
...
/usr/local/MATLAB/R2016b/toolbox/matlab/general
...
Run Code Online (Sandbox Code Playgroud)

我创建了一个文件!.m/home/raphael/Programs/Test.无论我在此文件中放置什么,编辑器都会显示错误:

Line 1: Unable to run code analysis. '/home/raphael/Programs/Test/!.m' is an invalid file name.
Run Code Online (Sandbox Code Playgroud)

作为!(bang)运算符未列在运算符和关联函数列表中,目前还不清楚!.m文件中的内容.

不过我还是尝试了一些代码:

function bang(c)

disp(c)
Run Code Online (Sandbox Code Playgroud)

虽然which !返回我的自定义文件路径,但Matlab总是调用内置运算符:

>> which !
/home/raphael/Programs/Test/!.m

>> !pwd
/home/raphael/Programs/Test
Run Code Online (Sandbox Code Playgroud)

重命名文件以bang.m解决错误但对bang运算符没有影响.

所以:

  • 自R2012以来,Matlab的行为是否发生了变化?
  • 怎么会超载!(砰)算子?
  • 如果这实际上是可能的,那么函数声明的语法应该是什么?

Sue*_*ver 5

看起来这种无证处理!.m在R2015b 中消失了(可能是新版本的执行引擎发生了变化).

对于早于R2015b版本中,你确实可以命名一个文件!.m的路径,然后该函数的名称的文件并不重要(因为它从来没有在MATLAB一样).

!.m

function bang(varargin)
    disp('bang!')
end
Run Code Online (Sandbox Code Playgroud)

在MATLAB的当前版本中,!操作者会忽略你的!.m文件,但会调用底层system,unixdos命令.因此,您需要重载这些命令.

所以在OS X上,重载就是unix.m诀窍:

unix.m

function varargout = unix(varargin)
    disp('My Unix Command')
    [varargout{1:nargout}] = builtin('unix', varargin{:});
end
Run Code Online (Sandbox Code Playgroud)