2012-08-10 17 views
6

Voy a ejecutar una serie de experimentos. El principal método evaluado tiene la siguiente firma:MATLAB: ¿Existe algún método para organizar mejor las funciones de los experimentos?

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

donde removeEachStage, applyEstEachStage, y removeFeatures son booleanos. Puede ver que si invierto el orden de cualquiera de estos parámetros booleanos, puedo obtener resultados incorrectos.

¿Hay algún método en MATLAB que permita una mejor organización para minimizar este tipo de error? ¿O hay alguna herramienta que pueda usar para protegerme contra estos errores?

+2

es posible encontrar algunas de las respuestas de aquí útil: [¿Cómo lidiar con los pares nombre/valor de los argumentos de funciones de MATLAB] (http://stackoverflow.com/q/2775263/97160) – Amro

+1

echa un vistazo a 'parseArgs' en el intercambio de archivos. Lo uso todos los días: http://www.mathworks.com/matlabcentral/fileexchange/10670-parseargs-simplifica-input-processing-for-functions-with-multiple-options – slayton

+0

@slayton - No sabía esto . Lo probaré. ¡Gracias! : D – Yamaneko

Respuesta

6

Organización con una estructura

puede ingresar un struct que tiene estos parámetros, ya que es campos.

Por ejemplo, una estructura con campos

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

de esa manera al configurar los campos está claro lo que el campo es, a diferencia de una llamada a la función donde usted tiene que recordar el orden de los parámetros.

Luego, su llamada a la función se convierte en

[Model threshold] = detect(setts); 

y su definición de función sería algo así como

function [model, threshold] = detect(setts) 

Después, simplemente reemplazar las ocurrencias de ejemplo param con setts.param.

Enfoque mixto

También puede mezclar este enfoque con su actual, si lo prefiere, por ejemplo,

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

si querían todavía explícitamente incluir in1 y in2, y el paquete el resto en setts.

enfoque de programación orientada a objetos

Otra opción es convertir a detectar en una clase. El beneficio de esto es que un objeto detect tendría variables miembro con nombres fijos, en oposición a las estructuras donde si crea un error tipográfico al configurar un campo, simplemente crea un nuevo campo con el nombre mal escrito.

Por ejemplo

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

¡Gracias por su respuesta! Está muy claro. He encontrado la solución a través de OOP muy interesante. Además, creo que [cantidad de gastos generales] (http: // stackoverflow.com/a/1745686/957997) agregado no hace mucha diferencia. – Yamaneko

Cuestiones relacionadas