Подтвердить что ты не робот

Вызовите функцию, которая не находится на пути Matlab БЕЗ ДОБАВЛЕНИЯ, ЧТО ПУТЬ

Я искал целый день и не нашел решения для вызова функции matlab, указав его путь и не добавляя его каталог в путь.

Этот вопрос очень похож на Можно ли вызвать функцию, которая не находится в пути в MATLAB?, но в моем случае я не хочу вызовите встроенную функцию, но только обычную функцию, определенную в m файле.

Я думаю, что дескрипторы могут быть решением (потому что, видимо, они могут ссылаться на функции не на пути), но я снова не нашел способа создать дескриптор без cd -ing в каталог, создав его там, а cd назад. Попытка "исследовать", что представляет собой объект с функцией функции, и как сделать ссылку со ссылкой на определенную функцию, а не на путь, ни к чему не привела.

Таким образом, решение может иметь два угла:
1) Вы знаете, как создать дескриптор для m файла в определенном каталоге.
2) Вы знаете способ вызова функции не по пути matlab.

EDIT: Я только что открыл функцию functions(myhandle), которая фактически позволяет вам увидеть путь к файлу, к которому обращается дескриптор. Но до сих пор нет возможности изменить его, хотя...

4b9b3361

Ответ 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
  • создает дескриптор функции
  • восстанавливает исходный рабочий каталог

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