Можно ли вызвать функцию, которая не находится в пути в MATLAB?

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

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

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

4 ответов


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

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

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

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


использовать 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

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

libpath = '/home/user/mylib';
% move mylib to the end of the path
addpath(libpath, '-end');
% now call some built-in functions that mylib overwrites
reshape(rand(100),10,10);
% return mylib to the top
addpath(libpath)

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


ответ Андрея не идеален для меня, но это и предложение Лорена "cd в каталог, создать ваш дескриптор функции, а затем 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: я рекомендую осторожность с этим подходом! Это может быть очень полезно в некоторых обстоятельства, но в целом я бы спросил себя, нет ли лучшего способа справиться с проблемой, которую вы пытаетесь решить. Это может создать больше проблем, чем решает.