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运算符没有影响.
所以:
看起来这种无证处理!.m在R2015b 中消失了(可能是新版本的执行引擎发生了变化).
对于早于R2015b版本中,你确实可以命名一个文件!.m的路径,然后该函数的名称中的文件并不重要(因为它从来没有在MATLAB一样).
!.m
function bang(varargin)
disp('bang!')
end
Run Code Online (Sandbox Code Playgroud)
在MATLAB的当前版本中,!操作者会忽略你的!.m文件,但会调用底层system,unix或dos命令.因此,您需要重载这些命令.
所以在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)