Можно ли вызвать функцию, которой нет в пути в MATLAB? - PullRequest
12 голосов
/ 09 февраля 2012

Я установил библиотеку, которая имеет некоторые функции с тем же именем, что и MATLAB. Под установкой lib я имею в виду addpath. Когда я пытаюсь вызвать эту функцию, она использует реализацию этой библиотеки, но я хочу вызвать реализацию MATLAB.

Чтобы упростить задачу: как указать, какую функцию вызывать, если у меня есть абсолютный адрес обеих функций?

Я искал ответ, но не нашел его на сайте.

Ответы [ 4 ]

10 голосов
/ 09 февраля 2012

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

builtin('reshape', arg1, arg2, ..., argN);

принудительно вызывает встроенную функцию MATLAB, изменяя форму, передавая показанные аргументы, даже если существует перегрузка для класса в этом списке аргументов.

http://www.mathworks.com/help/techdoc/matlab_prog/br65lhj-1.html

8 голосов
/ 09 февраля 2012

используйте run, это позволит вам использовать ваши собственные функции вместо встроенных без добавления к пути.

Взято из справки:

Запустить скрипт, который не находится на текущем пути Синтаксис

run scriptname

Как правильно сказал @Cheery, его нельзя использовать для функций, принимающих аргументы. Однако run.m является изменяемым файлом, поэтому я сделал расширенную версию, которая может принимать аргументы. Его также можно легко изменить для выходных аргументов.

function runExtended(script,varargin)

    cur = cd;

    if isempty(script), return, end
    if ispc, script(script=='/')='\'; end
    [p,s,ext] = fileparts(script);
    if ~isempty(p),
        if exist(p,'dir'),
            cd(p)
            w = which(s);
            if ~isempty(w),
                % Check to make sure everything matches
                [wp,ws,wext] = fileparts(w);
                % Allow users to choose the .m file and run a .p
                if strcmp(wext,'.p') && strcmp(ext,'.m'),
                    wext = '.m';
                end

                if ispc
                    cont = ~strcmpi(wp,pwd) | ~strcmpi(ws,s) | ...
                        (~isempty(ext) & ~strcmpi(wext,ext));
                else
                    cont = ~isequal(wp,pwd) | ~isequal(ws,s) | ...
                        (~isempty(ext) & ~isequal(wext,ext));
                end
                if cont
                    if exist([s ext],'file')
                        cd(cur)
                        rehash;
                        error('MATLAB:run:CannotExecute','Can''t run %s.',[s ext]);
                    else
                        cd(cur)
                        rehash;
                        error('MATLAB:run:FileNotFound','Can''t find %s.',[s ext]);
                    end
                end
                try
                    feval(s,varargin{:});
                    %           evalin('caller', [s ';']);
                catch e
                    cd(cur);
                    rethrow(e);
                end
            else
                cd(cur)
                rehash;
                error('MATLAB:run:FileNotFound','%s not found.',script)
            end
            cd(cur)
            rehash;
        else
            error('MATLAB:run:FileNotFound','%s not found.',script)
        end
    else
        if exist(script,'file')
            evalin('caller',[script ';']);
        else
            error('MATLAB:run:FileNotFound','%s not found.',script)
        end
    end

end
2 голосов
/ 10 февраля 2012

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

1 голос
/ 08 сентября 2013

Ответ Андрея не идеален для меня, но это и предложение Лорен "СД в каталог, создай ваш дескриптор функции, а затем cd "заставил меня подумать о следующем:

Определите функцию, которая выполняет то, что описывает Лорен:

function functionHandle = getFunctionHandleFromFile( fullFileName )

[pathstr, name, ext] = fileparts(fullFileName);

prevDir = pwd;

cd(pathstr);
functionHandle = str2func(name);
cd(prevDir);

Тогда вы можете просто использовать это, чтобы получить ручку. С помощью ручки вы можете вызвать функцию:

nameOf = getFunctionHandleFromFile('/Users/sage/matlab-utilities/nameOf.m')
nameOf(output)

Примечание для новых пользователей MATLAB: я рекомендую соблюдать осторожность при таком подходе! Это может быть очень полезно в определенных обстоятельствах, но в целом я бы спросил себя, не существует ли лучшего способа решить проблему, которую вы пытаетесь решить. Это может создать больше головной боли, чем решить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...