student - matlab tutorial
¿Cómo reconocer los errores de desbordamiento en Matlab? (3)
Puedes comenzar activando las advertencias de enteros:
intwarning(''on'')
Esto le dará una advertencia cuando la aritmética entera se desborde.
Sin embargo, ten cuidado, como se describe aquí , esto ralentiza la aritmética de enteros, así que solo usa esto durante la depuración.
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. Me perdí esto por una razón muy específica:
>> uint8(2) - uint8(1)
ans =
1
>> uint8(2) - uint8(2)
ans =
0
>> uint8(2) - uint8(3)
ans =
0
Hubiera esperado que el último fuera algo así como -1
(o 255
). En medio de un gran vector, los 0
erróneos fueron 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
comienzo, eso no ayuda.
Vea la función INTWARNING para controlar las advertencias en operaciones enteras.
http://www.mathworks.com/access/helpdesk/help/techdoc/ref/intwarning.html
Comenzando con la versión R2010b y posterior, se ha eliminado la función INTWARNING , junto con estos mensajes de advertencia para la conversión y matemática entera :
-
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 usar la función CLASS para probar la clase de sus datos y volver a convertirla en consecuencia antes de realizar la operación. Aquí hay un ejemplo:
if strcmp(class(data),''uint8'') %# Check if data is a uint8
data = double(data); %# Convert data to a double
end
También podría usar la función ISA :
if ~isa(data,''single'') %# Check if data is not a single
data = single(data); %# Convert data to a single
end