Вызовите функцию, которая не находится на пути Matlab БЕЗ ДОБАВЛЕНИЯ, ЧТО ПУТЬ
Я искал целый день и не нашел решения для вызова функции matlab, указав его путь и не добавляя его каталог в путь.
Этот вопрос очень похож на Можно ли вызвать функцию, которая не находится в пути в MATLAB?, но в моем случае я не хочу вызовите встроенную функцию, но только обычную функцию, определенную в m файле.
Я думаю, что дескрипторы могут быть решением (потому что, видимо, они могут ссылаться на функции не на пути), но я снова не нашел способа создать дескриптор без cd
-ing в каталог, создав его там, а cd
назад. Попытка "исследовать", что представляет собой объект с функцией функции, и как сделать ссылку со ссылкой на определенную функцию, а не на путь, ни к чему не привела.
Таким образом, решение может иметь два угла:
1) Вы знаете, как создать дескриптор для m файла в определенном каталоге.
2) Вы знаете способ вызова функции не по пути matlab.
EDIT: Я только что открыл функцию functions(myhandle)
, которая фактически позволяет вам увидеть путь к файлу, к которому обращается дескриптор. Но до сих пор нет возможности изменить его, хотя...
Ответы
Ответ 1
Решение, указанное в комментарии 1, чтобы создать дескриптор функции перед вызовом функции, прекрасно реализовано с помощью @Rody Oldenhuis 'FEX Contribution:
http://www.mathworks.com/matlabcentral/fileexchange/45941-constructor-for-functionhandles
Ответ 2
Это выполнимо, но требует немного разбора и вызова evalin
.
Я добавил (много лет назад!) функцию к центральному файловому обмену MATLAB под названием externalFcn
http://www.mathworks.com/matlabcentral/fileexchange/4361-externalfcn
который управляет вызовами внедорожных функций. Например, у меня есть функция с именем offpathFcn
, которая просто возвращает структуру с сообщением об успешном завершении и значение ввода. Сохраняя эту функцию с моего пути MATLAB, я могу вызвать ее, используя:
externalfcn('out = C:\MFILES_OffPath\offpathFcn(''this is a test'')');
Это возвращает:
out =
success: 1
input: 'this is a test'
(Обратите внимание, что моя реализация ограничена и улучшена, вы должны включить вывод с равным знаком, чтобы это работало, но оно должно показать вам, как добиться того, чего вы хотите.)
(инженер-программист MathWorks)
Ответ 3
function [varargout]=funeval(fun,varargin)
% INPUT:
% fun: (char) full path to function file
curdir=cd;
[fundir,funname]=fileparts(fun);
cd(fundir);
[varargout{1:nargout}] =feval(funname,varargin{:})
cd(curdir);
Ответ 4
Я изменил код Тьерри Далона, чтобы избежать использования feval, с которым мне всегда неуютно. Обратите внимание, что это все еще не обойти cd-ing для рассматриваемой директории, но, что ж, это происходит за кулисами, поэтому притворяйтесь, что этого не происходит:-)
Также обратите внимание на то, что указал Бен Фойгт выше: вызовы вспомогательных функций с пути не сработают.
function [varargout]=funeval(FunctionHandle, FunctionPath, varargin)
% INPUT:
% FunctionHandle: handle to the function to be called; eg @MyFunction
% FunctionPath: the path to that function
% varargin: the arguments to be passed to Myfunction
curdir=cd;
cd(FunctionPath)
[varargout{1:nargout}] = FunctionHandle(varargin{:});
cd(curdir);
end
и его вызов будет выглядеть как
Output = funeval(@MyFunction, 'c:\SomeDirOffMatlabsPath\', InputArgToMyFunc)
Ответ 5
Команда run
может запускать файл script из любого каталога, но не может вызывать функцию (с входными и вывода).
Ни в feval
, ни str2func
разрешить информацию каталога в строке функции.
Я предлагаю написать собственную обертку для str2func
, которая:
- сохраняет рабочий каталог
- изменяет каталог в каталог script
- создает дескриптор функции
- восстанавливает исходный рабочий каталог
Остерегайтесь, однако, что дескриптор функции, не входящей в этот путь, может сломаться, потому что функция не сможет вызвать какой-либо вспомогательный код, хранящийся в других файлах в его каталоге.