2010-03-02 18 views
17

Pasé parte de ayer y hoy rastreando un error en algún código de Matlab. Creí que mi problema era la indexación (con muchas estructuras que no definí y todavía me estoy acostumbrando), pero resultó ser un error de desbordamiento. Extrañaba esto por una razón muy específica:Cómo reconocer los errores de desbordamiento en Matlab?

>> uint8(2) - uint8(1) 

ans = 

    1 

>> uint8(2) - uint8(2) 

ans = 

    0 

>> uint8(2) - uint8(3) 

ans = 

    0 

lo que habría esperado el último en ser algo así como -1 (o 255). En el medio de un gran vector, los erróneos 0 s eran difíciles de detectar, pero un 255 se habría destacado fácilmente.

¿Algún consejo sobre cómo detectar estos problemas fácilmente en el futuro? (Idealmente, me gustaría desactivar la verificación de desbordamiento para que funcione como C.) Cambiar a double funciona, por supuesto, pero si no me doy cuenta de que es un uint8 para empezar, eso no ayuda.

+1

¿De dónde sacas estos números a partir de? Si los carga desde un archivo, simplemente puede agregar una línea al cargador para devolverlos todos como uint8 o como dobles. Aparte de leer archivos, no debe esperar uint8 en Matlab. – Jonas

+0

En realidad, no sé exactamente de dónde vienen. Me estoy integrando con el código de otra persona, por lo que no sé los detalles. –

Respuesta

13

Usted puede comenzar mediante la activación de las advertencias enteros:

intwarning('on') 

Esto le dará una advertencia cuando se desborda aritmética de enteros.

Sin embargo, tenga cuidado, como se indica en here, esto ralentiza la aritmética entera, así que solo use esto durante la depuración.

+3

Nota: [Se ha eliminado INTWARNING] (http://www.mathworks.com/help/techdoc/rn/bsdgysw-1.html#bseu09o-1), y el enlace anterior ahora no es válido. – gnovice

+0

¿Ustedes saben por qué se eliminó y qué usar en su lugar? – Lupocci

6

partir de la versión R2010b y más tarde, la función INTWARNING has been removed, junto con these warning messages for integer math and conversion:

  • MATLAB:intConvertNaN
  • MATLAB:intConvertNonIntVal
  • MATLAB:intConvertOverflow
  • MATLAB:intMathOverflow

Por lo tanto, el uso de INTWARNING ya no es una opción viable para determinar cuándo se producen desbordamientos de enteros. Una alternativa es utilizar la función CLASS para probar la clase de sus datos y volver a convertirla en consecuencia antes de realizar la operación. He aquí un ejemplo:

if strcmp(class(data),'uint8') %# Check if data is a uint8 
    data = double(data);   %# Convert data to a double 
end 

También es posible usar la función ISA así:

if ~isa(data,'single') %# Check if data is not a single 
    data = single(data); %# Convert data to a single 
end 
+2

Si no sabe de dónde provienen sus datos, definitivamente debe hacer pruebas de entrada muy cuidadosas como esta. – Jonas

+0

@gnovice Me acabo de topar con el mismo problema, pero su enfoque de lanzar al doble o solo me parece muy extraño. ¿Qué pasa si necesito esos consejos? No quiero ser forzado a hacer todo en dobles. No es una pregunta para usted, por supuesto, pero ¿por qué MATLAB no puede usar operaciones enteras sin signo estándar? – angainor

Cuestiones relacionadas