2012-08-10 11 views
6

eseguirò una serie di esperimenti. Il metodo principale valutato ha la seguente firma:MATLAB: Esiste un metodo per organizzare meglio le funzioni per gli esperimenti?

[Model threshold] = detect(... 
    TrainNeg, TrainPos, nf, nT, factors, ... 
    removeEachStage, applyEstEachStage, removeFeatures); 

dove removeEachStage, applyEstEachStage, e removeFeatures sono booleani. Puoi vedere che se inverto l'ordine di uno di questi parametri booleani, potrei ottenere risultati errati.

Esiste un metodo in MATLAB che consente un'organizzazione migliore per ridurre al minimo questo tipo di errore? O c'è qualche strumento che posso usare per proteggermi da questi errori?

+2

si potrebbe trovare alcune delle risposte da qui utile: [Come comportarsi con coppie nome/valore di argomenti di funzione in MATLAB] (http://stackoverflow.com/q/2775263/97160) – Amro

+1

controlla 'parseArgs' sullo scambio di file. Lo uso tutti i giorni: http://www.mathworks.com/matlabcentral/fileexchange/10670-parseargs-semplifies-input-processing-for-functions-with-multiple-options – slayton

+0

@slayton - Non sapevo questo . Lo proverò. Grazie! : D – Yamaneko

risposta

6

organizzazione con una struttura

è possibile introdurre un struct che ha questi parametri come è campi.

Per esempio una struttura con campi

setts.TrainNeg 
    .TrainPos 
    .nf 
    .nT 
    .factors 
    .removeEachStage 
    .applyEstEachStage 
    .removeFeatures 

In questo modo quando si impostano i campi è chiaro ciò che il campo è, a differenza di una chiamata di funzione in cui si deve ricordare l'ordine dei parametri.

Allora la vostra chiamata di funzione diventa

[Model threshold] = detect(setts); 

e la tua definizione di funzione sarebbe qualcosa di simile

function [model, threshold] = detect(setts) 

Poi basta sostituire le occorrenze di esempio param con setts.param.

approccio misto

Si può anche mescolare questo approccio con quello corrente, se si preferisce, per esempio

[Model threshold] = detect(in1, in2, setts); 

se si voleva ancora includere esplicitamente in1 e in2, e legare il resto in setts.

approccio OOP

Un'altra opzione è quella di trasformare rilevare in una classe. Il vantaggio di questo è che un oggetto detect avrebbe quindi variabili membro con nomi fissi, al contrario delle strutture dove, se si inserisce un errore quando si imposta un campo, si crea semplicemente un nuovo campo con il nome errato.

Per esempio

classdef detect() 
properties 
    TrainNeg = []; 
    TrainPos = []; 
    nf = []; 
    nT = []; 
    factors = []; 
    removeEachStage = []; 
    applyEstEachStage = []; 
    removeFeatures =[]; 
end 
methods 
    function run(self) 
    % Put the old detect code in here, use e.g. self.TrainNeg to access member variables (aka properties) 
    end 
end 
+1

Grazie per la tua risposta! È molto chiaro Ho trovato la soluzione attraverso OOP molto interessante. Inoltre, penso che la [quantità di overhead] (http: // StackOverflow.it/a/1745686/957997) aggiunto non fa molta differenza. – Yamaneko

Problemi correlati