2012-10-25 10 views
11

Szukałem przez całe popołudnie i nie znalazłem żadnego rozwiązania, aby wywołać w Matlab funkcję, określając jej ścieżkę i nie dodając jej katalogu do ścieżki.Wywołanie funkcji, która nie znajduje się na ścieżce Matlaba BEZ DODAWANIA TEGO PATH

To pytanie jest bardzo podobne do Is it possible to call a function that is not in the path in MATLAB?, ale w moim przypadku nie chcę wywoływać funkcji wbudowanej, ale zwykłą funkcję zdefiniowaną w pliku m.

myślę uchwyty mogą być rozwiązaniem (bo podobno mogą odnosić się do funkcji nie na drodze), ale znowu nie znalazła sposób, aby utworzyć uchwyt bez cd -ing do katalogu, tworząc go tam i cd - z powrotem. Próba "zbadania", czym jest obiekt funkcji funkcji i jak go utworzyć z odniesieniem do określonej funkcji, która nie znajduje się na ścieżce, doprowadziła mnie do nikąd.

Rozwiązanie może więc pochodzić z dwóch perspektyw:
1) Wiesz, jak utworzyć uchwyt dla pliku m w określonym katalogu.
2) Znasz sposób wywołania funkcji spoza ścieżki MATLAB.

EDYCJA: Właśnie odkryłem funkcję functions(myhandle), która faktycznie pozwala zobaczyć ścieżkę do pliku, do którego odnosi się uchwyt. Ale nadal nie można go zmodyfikować ...

+0

FWIW, polecenie 'feval', które jest najbardziej naturalnym miejscem dla tej możliwości, wyraźnie wyklucza określenie katalogu. "Parametr' fname' musi być prostą nazwą funkcji, nie może zawierać informacji o ścieżce. " –

+1

Tak samo jak w ogólnym interesie: czy pamiętasz * dlaczego * nie chcesz umieścić katalogu na swojej ścieżce? –

+0

@RodyOldenhuis W firmie, w której pracuję, pracujemy z kilkoma użytkownikami na tym samym serwerze z RDP z jednym programem matlab instal (a więc jeden matlabrc, jedna ścieżka itd.) Użytkownicy zazwyczaj nie są ostrożni ze ścieżką i ciągle ją rzeźnią. Wielu użytkowników nieprawidłowo nadaje nazwy swoim funkcjom, a shadow czasami nawet funkcje core matlab, a następnie dodaje ich folder do ścieżki. Widzę kod wszędzie za pomocą 'removepath (...); function(); addpath (...)' i tym podobne ... Dzieje się to, gdy 2 użytkowników robi to w tym samym czasie. Tak więc najprostszym rozwiązaniem byłoby móc wywołać konkretną funkcję bezpośrednio, nie martwiąc się o ścieżkę –

Odpowiedz

1

Komenda run może uruchomić plik skryptu z dowolnego katalogu, ale nie może wywołać funkcji (z argumentami wejściowymi i wyjściowymi).

Ani feval ani str2func nie zezwala na informacje katalogowe w łańcuchu funkcji.

Proponuję pisanie własnego opakowania dla str2func że:

  • zapisuje katalog roboczy
  • zmienia katalog na skrypcie
  • tworzy funkcję obsługi
  • przywraca pierwotny katalog roboczy

Należy jednak pamiętać, że uchwyt funkcji, której nie ma w t ścieżka może się zepsuć, ponieważ funkcja nie będzie mogła wywołać kodu pomocniczego zapisanego w innych plikach w swoim katalogu.

+0

Dziękuję za odpowiedź. Znam polecenie "run" już i rzeczywiście jest to coś takiego, czego potrzebuję, ale funkcje zamiast skryptów. Zadzwoniłem do pomocy technicznej matlab i nie ma takiego wbudowanego rozwiązania. –

9

Jest to możliwe, ale wymaga trochę analizy i wywołania do evalin.

dodałem (wiele lat temu!) Funkcja do Centralnej MATLAB File Exchange nazywany externalFcn

http://www.mathworks.com/matlabcentral/fileexchange/4361-externalfcn

który zarządza wywołań funkcji poza ścieżką. Na przykład mam funkcję o nazwie offpathFcn, która po prostu zwraca strukturę z komunikatem o powodzeniu i wartością wejścia.Przechowywanie tę funkcję wyłączyć mojej ścieżce MATLAB, mogę nazwać używając:

externalfcn('out = C:\MFILES_OffPath\offpathFcn(''this is a test'')'); 

ta zwraca:

out = 
    success: 1 
    input: 'this is a test' 

(Zauważ, że moja realizacja jest ograniczona, a improvable; trzeba to wyjście z znak równości dla tej pracy. Ale to powinno pokazać, jak osiągnąć to, co chcesz.)

(MathWorks inżynier aplikacji)

+2

Dziękuję za odpowiedź. Tak, znalazłem 'externalfcn' podczas szukania rozwiązania, ale to rzeczywiście' cd's do katalogu i 'cd's z powrotem. Jest to niedopuszczalnie powolne dla moich celów. Jedyne rozwiązanie, które znalazłem, polega na utworzeniu uchwytu przez 'cd'ing i' cd'ing back ... Po uzyskaniu obsługi wywołania funkcji są szybkie. –

+0

@reverse_engineer: Jeśli wymyśliłeś ulepszoną metodę, taką jak uchwyty, możesz ją opublikować jako odpowiedź? Otrzymasz moje +1. – strpeter

+2

@strpeter Nie, rozwiązaniem, którego użyłem na końcu, było 'cd' do katalogu, stworzenie tam uchwytu i powrót' cd'. Następnie uchwyt nadal odnosi się do funkcji w określonym folderze, który nie znajduje się na ścieżce, i możesz wywołać ten uchwyt. Ale nie znalazłem sposobu, aby wywołać funkcję nie znajdującą się na ścieżce z jakąkolwiek inną metodą ... –

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); 
+0

Czy możesz podać jakieś wyjaśnienie? – Undo

+0

Dzięki za odpowiedź, ale to oznacza 'cd'-ing do katalogu funkcji, które chciałbym uniknąć ... –

+0

Nie znam innego sposobu: Matlab musi znać funkcję, którą masz na myśli. Do tego, o ile wiem, istnieją tylko dwie możliwości: albo jest w ścieżce Matlaba, albo w bieżącym katalogu. –

2

Zmodyfikowałem kod Thierry'ego Dalona, ​​aby uniknąć użycia feval, z którym zawsze czuję się nieswojo. Zauważ, że to nadal nie omija katalogu z danym katalogiem, ale cóż, dzieje się to za kulisami, więc udawaj, że tak się nie dzieje :-) Zwróć też uwagę na to, co Ben Voigt wskazał powyżej: wywołania funkcji pomocniczych poza ścieżką zakończy się niepowodzeniem.

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 

i nazywając to będzie wyglądać

Output = funeval(@MyFunction, 'c:\SomeDirOffMatlabsPath\', InputArgToMyFunc) 
+0

w jaki sposób ta odpowiedź różni się od [nazwa Dalona] (http://stackoverflow.com/a/16903404/1714410)? nie dupkuj odpowiedzi ... – Shai