2013-10-16 14 views
5

Ecco il problema: ho un file .m da testare in cui c'è una funzione principale e diverse funzioni interne chiamate da quella principale.Come chiamare la funzione interna di un file .m dal prompt dei comandi?

Come posso chiamare questa funzione interna (per testarli), dalla console?

esempio:

function main 
    function_1; 
    function_1; 
end 

function_1 
disp('this is'); 
end 

function_2 
    disp(' an example'); 
end 

Come posso testare direttamente dalla console?

+0

possibile duplicato di [Matlab: chiamata funzioni locali dalla riga di comando] (http://stackoverflow.com/questions/15461157/matlab-calling-local-functions-from-command-line) –

+1

Se le funzioni locali sono tali coinvolti in modo da richiedere i propri test unitari separati, forse c'è motivo di metterli nei loro file separati, magari come funzioni private? È possibile trovare [questa domanda in qualche modo correlata] (http: // StackOverflow.it/q/3569933/52738) utile. – gnovice

+0

L'altra risposta di cui sopra di H.Muster è molto simile, ma la mia risposta introduce l'utile comando 'localfunctions' che sembra essere costruito per questo scopo. Mi chiedo se sia sempre stato in MATLAB. Non ricordo di averlo visto sempre nei documenti. – chappjc

risposta

2

Secondo help function (vedi anche la online doc):

Sottofunzioni non sono visibili al di fuori del file in cui sono definite.

quindi è necessario un punto di interruzione , che vi permetterà di accedere alla funzione interna come se si stesse facendo all'interno del file .m:

  1. Impostare un punto di interruzione a un certo punto all'interno del funzione principale del file .m
  2. Eseguire il file .m
  3. Quando viene visualizzato il prompt K>>, è possibile chiamare la funzione interna dalla console.
0

Potrebbe essere possibile creare il pacchetto se si adatta al progetto e mantenere tutte le funzioni lì e chiamarlo da quel pacchetto. Questo articolo potrebbe hep si: http://www.mathworks.se/help/matlab/matlab_oop/scoping-classes-with-packages.html

+0

Grazie, ma questo non è ciò di cui ho bisogno ... Ho bisogno di testare un codice Matlab usando unit test e questo codice Matlab è composto da diverse funzioni. ho bisogno di testare le funzioni e le sottofunzioni ... esempio: funzione principale function_1; function_1; fine function_1 disp ('questo è'); fine function_2 disp ('un esempio'); fine – Bobo87

2

È effettivamente possibile utilizzare un internal (local) function al di fuori del file M in cui è definito, se si dispone è maniglia. Ad esempio, la seguente funzione restituisce le maniglie a tutte le sottofunzioni con the localfunctions command,

% internalHandlesTest.m 
function [out,hl] = internalHandlesTest(in) 

out = subfun1(in); 

% hl = @subfun1; % just to get one internal function handle 
hl = localfunctions; % to get all internal function handles 

end 

function subout = subfun1(subin) 
% still internalHandlesTest.m 
fprintf('You are using internalHandlesTest>subfun1!\n'); 
subout = subin; 
end 

function subfun2() 
% still internalHandlesTest.m 
fprintf('You are using internalHandlesTest>subfun2!\n'); 
end 

Proviamo:

>> [out,hl] = internalHandlesTest(0); 
You are using internalHandlesTest>subfun1! 
>> disp(hl) 
    @subfun1 
    @subfun2 
>> hl{1}(1) 
You are using internalHandlesTest>subfun1! 
ans = 
    1 
>> hl{2}() 
You are using internalHandlesTest>subfun2! 
>> 

Quindi, siamo in grado di utilizzare le funzioni interne al di fuori del file M. Queste funzioni sono di tipo scopedfunctions e siamo in grado di farlo perché MATLAB tiene traccia di esso è parentage e il file di origine. Vedere l'uscita di the functions command su queste maniglie:

>> functions(hl{1}) 
ans = 
    function: 'subfun1' 
     type: 'scopedfunction' 
     file: 'E:\Users\jchappelow\Documents\MATLAB\internalHandlesTest.m' 
    parentage: {'subfun1' 'internalHandlesTest'} 

Naturalmente, è possibile consultare la guida per le funzioni interne abbastanza facilmente:

>> help internalHandlesTest>subfun1 
    still internalHandlesTest.m 

Ma per eseguire funzioni locali, è necessario ottenere un handle funzione , che può essere ottenuto solo tramite un argomento di output della funzione canonica.