Избегать предупреждения запуска MATLAB при перегрузке встроенных функций? - PullRequest
6 голосов
/ 20 июня 2011

Как описано здесь , я создал свой собственный figure.m, который приятно перегружает встроенную команду figure.Теперь, когда я запускаю MATLAB, я получаю предупреждение

Предупреждение: Функция C: \ somepath \ figure.m имеет то же имя, что и встроенная MATLAB.Мы рекомендуем переименовать функцию, чтобы избежать потенциального конфликта имен.

Есть ли способ отключить это предупреждение, учитывая, что в моем случае это желаемое поведение?

Вы можете сказать,что я должен вызывать свою функцию иначе, чем перегрузку, но я чувствую, что для моей системы разработки эта перегрузка - правильный путь ...

Обновление

КакУпомянутый Aabaz вы можете отключить это предупреждение глобально, используя

warning off MATLAB:dispatcher:nameConflict

, которое должно идти в начале matlabrc.m (до того, как будет задан путь).Тем не менее, я все еще был бы заинтересован в решении, которое могло бы конкретно удалить это сообщение об ошибке для перегрузки figure.m (или некоторого самоопределяемого списка функций) вместо всех функций.Наверное, я здесь слишком много спрашиваю ;-)?

Ответы [ 4 ]

4 голосов
/ 20 июня 2011

Кажется, я не могу повторить это предупреждение с моей версией Matlab (R2008b), но в любом случае, если вы еще не пробовали это, вам следует изучить функции lastwarn и предупреждение , идентифицировать и отключить это предупреждение.

PS: предупреждение в конце концов пришло по какой-то причине, и я смог использовать lastwarn и предупреждение, чтобы отключить его.

>>[msgstr msgid]=lastwarn;
>>disp(msgid);
MATLAB:dispatcher:nameConflict
>>warning('off',msgid);

Я должен добавить, что вы должны отключить его при запуске , чтобы это было эффективно между различными сессиями Matlab.

2 голосов
/ 20 февраля 2015

Я только что столкнулся с этой проблемой на MATLAB R2014b, где я также хотел переопределить figure. Я думаю, что это самое близкое решение для вашего обновленного вопроса (3,5 года спустя ...).

Я думаю, что использование "грязного" трюка из вашего комментария на самом деле является самым чистым, если сделано разумно, так как оно не требует изменения matlabrc.m и может подавить предупреждение только для тех функций, которые вы хотите переопределить встроенные.

  1. Поместите все ваши переопределения по умолчанию в папку, которая не находится на вашем постоянном пути MATLAB. Я держу мой в ~/Documents/MATLAB/overrides на моем Mac. У меня есть например ~/Documents/MATLAB/overrides/figure.m
  2. Используйте startup.m, чтобы добавить переопределения к вашему пути с отключенным предупреждением, а затем снова включить его:
    warning off MATLAB:dispatcher:nameConflict
    addpath('/Users/victor/Documents/MATLAB/overrides');
    warning on MATLAB:dispatcher:nameConflict

Не уверен, работает ли расширение тильды с addpath, поэтому я записываю полный путь.

Делая это таким образом, я выборочно подавляю предупреждение только для вещей, которые загружаются из overrides. Вы, конечно, можете быть более избирательными с именами папок. Это также означает, что мне не нужно ничего менять в моих системных файлах MATLAB, поэтому они локализуются в моей учетной записи пользователя и сохраняются при всех обновлениях (хорошо или плохо; патч обезьяны ответственно).

Чтобы получить доступ к встроенному figure из моего переопределения, мне нужно временно там cd (в противном случае переопределение просто назовет его self). Так что figure.m будет выглядеть так:

function fig = figure(varargin)

% Call original figure function
old = pwd;
cd(fullfile(matlabroot, 'toolbox', 'matlab', 'graphics', ''));
fig = figure(varargin{:});
cd(old);

% ...
% Do dirty override magic

end
1 голос
/ 26 ноября 2016

Добавление каталога, содержащего перегрузку функции, к пути поиска будет отображать предупреждение всякий раз, когда функция в этом каталоге редактируется и сохраняется, независимо от того, добавлен ли каталог в startup.m или нет.

Простой способ решить эту проблему - поместить функции перегрузки в пакет . Затем импортирует пакет при запуске. Не нужно связываться с предупреждениями.

1 голос
/ 19 января 2016

Я пока не могу комментировать, поэтому я просто расширю ответ, заданный vicvicvic , здесь.Общий процесс остается прежним, однако он имеет некоторые дополнительные настройки.

  1. Поместите вашу функцию override figure.m в папку, которая не находится на вашем текущем MATLAB path, например, /users/heidelberg/.matlab/_overload,Для меня расширение тильды поддерживается, но я бы на него не полагался.Однако вы также можете поместить его в подпапку сценария запуска MATLAB (см. Ниже).
  2. Используйте startup.m, чтобы добавить папку переопределения в путь.Чтобы избежать предупреждения, убедитесь, что оно выключено, а затем восстановите его исходное состояние

    % save the current state while switching it off
    warningState = warning('off', 'MATLAB:dispatcher:nameConflict'); 
    
    addpath('/users/heidelberg/.matlab/_overload');
    
    % restore the saved state
    warning(warningState);
    
    % cleanup
    clear('warningState');
    

    Разница здесь в том, что если, например, ваш администратор в любом случае отключил предупреждение,вы не включите его случайно.

  3. В вашей реализации рисунка в какой-то момент вам, вероятно, придется вызвать встроенную версию. vicvicvic предложил cd для каталога, однако есть также функция MATLAB builtin, которая выполняет эту работу за вас:

    function fig = figure(varargin)
    % overload function
    
    % call builtin figure
    varargout = cell(1, nargout);
    [varargout{:}] = builtin('figure', varargin{:});
    
    % do you magic here
    % ...
    
    end
    

    Также используйте varargout иnargout для сохранения произвольного числа выходных аргументов (может быть неактуально здесь и сейчас, но для других функций или будущих выпусков это может быть важно).


Аннотация

Метод, который я предпочитаю, - это иметь подпапку в каталоге, где хранится мой файл startup.m, например, _overload.Для меня это /users/timm/Documents/MATLAB/_overload.Чтобы легко добавить эту папку, используйте следующий скрипт:

Файл /users/timm/Documents/MATLAB/startup.m

    % extract the current directory (pwd can fail if started elsewhere)
    [currentPath, ~, ~] = fileparts(mfilename('fullpath'));

    % add the path, compare above
    warningState = warning('off', 'MATLAB:dispatcher:nameConflict');
    addpath([currentPath, filesep(), '_overload']);
    warning(warningState);

    % cleanup
    clear('currentPath', 'warningState');
...