Можно ли вызвать функцию, которая не находится в пути в MATLAB?
Я установил библиотеку с некоторыми функциями с тем же именем, что и MATLAB. И, установив lib, я имею в виду addpath. Когда я пытаюсь вызвать эту функцию, он будет использовать эту реализацию lib, но я хочу назвать реализацию MATLAB.
Чтобы упростить: как я могу указать, какую функцию вызывать, если у меня есть абсолютный адрес обеих функций?
Я искал ответ, но я не нашел его на веб-сайте.
Ответы
Ответ 1
Если вы перегружаете любую из встроенных функций MATLAB для обработки определенного класса, MATLAB всегда вызывает перегруженную функцию этого типа. Если по какой-то причине вам нужно вызвать встроенную версию, вы можете переопределить обычный механизм вызова с помощью встроенной функции. Выражение
builtin('reshape', arg1, arg2, ..., argN);
заставляет вызов встроенной функции MATLAB, переформатировать, передать показанные аргументы, даже если существует перегрузка для класса в этом списке аргументов.
http://www.mathworks.com/help/techdoc/matlab_prog/br65lhj-1.html
Ответ 2
используйте run
, он позволит вам использовать ваши собственные функции вместо встроенных модулей, не добавляя их в путь.
Получено с помощью:
Запустите script, который не находится на текущем пути Синтаксис
запустить сценарий
Как правильно сказал @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
Ответ 3
Еще одно решение вашего вопроса, которое мне нравится, когда я буду называть множество встроенных функций подряд, - это временно переместить мою библиотеку в конец пути.
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)
Конечно, если вы используете встроенные функции чаще, чем ваши библиотеки, вы можете сохранить библиотеку в конце пути и перенести ее вверх, когда вы ее используете. Будьте осторожны с вашим текущим каталогом, однако он всегда будет принимать приоритет по порядку пути.
Ответ 4
Ответ Andrey не идеален для меня, но он и предложение Лорен "cd в каталог, создают
ваш дескриптор функции, а затем cd back "заставил меня подумать о следующем:
Определите функцию, которая выполняет то, что описывает Лорен:
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: я рекомендую соблюдать осторожность при таком подходе! Это может быть очень полезно при определенных обстоятельствах, но в целом я спрашиваю себя, нет ли лучшего способа решить проблему, которую вы пытаетесь решить. Это может создать больше головных болей, чем решает.