2012-02-09 9 views
12

Zainstalowałem bibliotekę, która ma kilka funkcji o tej samej nazwie, co biblioteka MATLAB. Instalując bibliotekę mam na myśli addpath. Kiedy spróbuję wywołać tę funkcję, użyje ona implementacji biblioteki, ale chcę zadzwonić do implementacji MATLAB.Czy można wywołać funkcję, która nie znajduje się w ścieżce w MATLAB?

Aby było prostsze: jak mogę określić, która funkcja ma zostać wywołana, biorąc pod uwagę, że mam bezwzględny adres obu funkcji?

Szukałem odpowiedzi, ale nie znalazłem jej na stronie internetowej.

+1

Jak duża jest biblioteka i ile pracy zamierzasz z nią zrobić? Jak często chcesz wywoływać jego funkcje z kodu? Czy w bibliotece jest kod OO? –

Odpowiedz

10

W przypadku przeciążenia dowolnej wbudowanej funkcji MATLAB, aby obsłużyć określoną klasę, MATLAB zawsze wywołuje funkcję przeciążenia dla tego typu. Jeśli z jakiegoś powodu musisz wywołać wbudowaną wersję, możesz zastąpić zwykły mechanizm wywołujący za pomocą wbudowanej funkcji. Wyrażenie

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

wymusza wywołanie funkcji wbudowanej w MATLAB, przekształcenia, przekazując argumenty przedstawione choć istnieje przeciążenie dla klasy w tym liście argumentów.

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

8

użycie run, pozwoli Ci wykorzystać własne funkcje zamiast wbudowanych ins bez dodając je do ścieżki.

Zrobione z pomocy

:

Uruchom skrypt, który nie znajduje się na bieżącej ścieżce Składnia

run scriptname

Jak @Cheery słusznie powiedział, że nie może być wykorzystywane do funkcji, które akceptują argumenty. Jednak plik run.m jest plikiem modyfikowalnym, dlatego stworzyłem wersję rozszerzoną, która może akceptować argumenty. Można go również łatwo zmodyfikować dla argumentów wyjściowych.

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 
+1

dotyczy to SCRIPTS, a nie funkcji! próbowałeś tego? w ten sposób nie będziesz w stanie podać argumentów funkcji. a wynikiem tego wywołania dla pliku funkcji będzie coś takiego "??? Argument wejściowy "x" jest niezdefiniowany. "Gdzie" x "jest argumentem funkcji. – Cheery

+0

Oczywiście. Spróbuj tego - plik funkcji 'function y = myfunc (x) (nowa linia jest tutaj) y = x; disp (y); 'zapisz go jako' myfunc.m' gdzieś i spróbuj 'run path/myfunc.m' w wierszu poleceń Matlaba. Wynik będzie "??? Argument wejściowy "x" jest niezdefiniowany. "Matlab ma dwa typy plików - dla funkcji i dla skryptów. Nie można uruchomić pliku funkcji bezpośrednio z edytora lub wiersza poleceń. Plik funkcji powinien znajdować się na ścieżce, a program Matlab będzie próbował go zlokalizować podczas rozmowy. – Cheery

+0

@Cheery, sporządzono aktualizację :) jeszcze raz dziękuję. –

2

Innym rozwiązaniem na pytanie co lubię kiedy będę nazywając wiele wbudowanych funkcji w jednym rzędzie jest przenieść moją bibliotekę na końcu ścieżki tymczasowo.

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) 

Oczywiście jeśli częściej korzystać z wbudowanych funkcji niż swoimi libary-tych, można zachować bibliotekę na końcu ścieżki i przenieść go na górę, kiedy go używać. Uważaj na bieżący katalog, ale zawsze będzie to oznaczać precedence w kolejności ścieżki.

1

odpowiedź Andrey nie jest idealny dla mnie, ale i sugestia Loren na „cd do katalogu, tworzyć swój uchwyt funkcji, a następnie cd Back” mi się z poniższym:

zdefiniować funkcję, która robi to, co opisuje Loren:

function functionHandle = getFunctionHandleFromFile(fullFileName) 

[pathstr, name, ext] = fileparts(fullFileName); 

prevDir = pwd; 

cd(pathstr); 
functionHandle = str2func(name); 
cd(prevDir); 

To wystarczy, aby uzyskać uchwyt. Za pomocą uchwytu można wywołać funkcję:

nameOf = getFunctionHandleFromFile('/Users/sage/matlab-utilities/nameOf.m') 
nameOf(output) 

Uwaga dla nowszych użytkowników MATLAB: zalecam ostrożność przy takim podejściu!Może być bardzo pomocna w pewnych okolicznościach, ale generalnie zadaję sobie pytanie, czy nie ma lepszego sposobu rozwiązania problemu, który próbujesz rozwiązać. Może to spowodować więcej bólów głowy niż rozwiązuje.

+0

Problem polega na tym, że funkcja chce odczytać/zapisać plik z/do bieżącego katalogu roboczego, twoja metoda zrywa. –

+0

Zobacz także powiązane pytanie http://stackoverflow.com/questions/13072470/call-a-function-that-is-on-the-matlab-path-without-adding-that-path/22532918#22532918 i FEX Wkład: http://www.mathworks.com/matlabcentral/fileexchange/45941-constructor-for-functionhandles –

Powiązane problemy