2016-12-24 2 views
4

В ответ на this questionMathWorks Support Team утверждает, что:Перегрузка! (Взрыва) оператор

It is also possible to overload the ! (bang) operator by creating a file called "!.m" and having this file be before the directory $MATLABROOT\toolbox\matlab\general in the MATLAB search path.

Я попробовал это, и это не похоже на работу. Я запускаю Matlab 9.1.0.441655 (R2016b) на Монетный двор Linux. Мой путь выглядит следующим образом:

/home/raphael/Programs/Test 
/usr/local/MATLAB/R2016b/toolbox/matlab/iofun 
... 
/usr/local/MATLAB/R2016b/toolbox/matlab/general 
... 

и я создал файл !.m в /home/raphael/Programs/Test. Независимо от того, что я помещаю в этот файл, в редакторе появляется сообщение об ошибке:

Line 1: Unable to run code analysis. '/home/raphael/Programs/Test/!.m' is an invalid file name. 

Как есть! (bang) не указан в Operators and associated function list, непонятно, что помещать в файл !.m.

я все-таки попытался поставить код:

function bang(c) 

disp(c) 

но хотя which ! возвращает мой пользовательский путь файла, Matlab неизменно вызывает встроенный оператор:

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

>> !pwd 
/home/raphael/Programs/Test 

переименовав файл bang.m разрешает ошибку, но не влияет на оператор bang.

Итак:

  • ли поведение MatLab изменилось с тех пор R2012?
  • Как можно перегрузить! (bang)?
  • И если это действительно возможно, каков должен быть синтаксис объявления функции?

ответ

5

Похоже, что это недокументированного обращение с !.m исчез в R2015b (предположительно с новыми изменениями исполнения двигателя, которые были введены с этой версией).

Для ранних версий, чем R2015b, вы действительно можете назвать файл !.m на пути, а затем имя функции в файл не имеет значения (как он никогда не делает в MATLAB).

!.m

function bang(varargin) 
    disp('bang!') 
end 

В текущих версиях 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 
+0

Великий ответ, спасибо! – Ratbert

Смежные вопросы