2010-09-11 18 views
6

Realmente no creo que esto sea un problema de precisión, la respuesta debería ser aproximadamente 0.226. Aquí está el código exacto:división MATLAB ... ¿debería 29/128 devolver 0?

val = I(i,j) 
bucketSize  
pos = val/bucketSize 

I es sólo una matriz que estoy tomando los valores de. Aquí está la salida de MATLAB:

val = 

    29 

bucketSize = 

    128 

pos = 

    0 

¿Qué me falta?

Respuesta

16

Supongo que su matriz I es datos de píxeles cargados desde image file, que tendrán valores que normalmente son unsigned 8-bit integers. Como ya se mencionó, la conversión de ambos valores enteros a un valor de double precision asegurará que MATLAB realice la división de coma flotante en lugar de la división de enteros (lo que redondeará el resultado).

la conversión de un valor a double precision es insuficiente:

Para todas las operaciones binarias en el que un operando es una matriz de número entero tipo de datos (excepto enteros de 64 bits) y el otro es doble un escalar, MATLAB calcula la operación utilizando aritmética de precisión doble con elementos, , y luego convierte el resultado al tipo de datos entero original .

Si desea obtener más información acerca de los diferentes tipos de datos numéricos en MATLAB, puede consultar this documentation.

0

Estas variables son probablemente en lugar de dobles o largos. ¿1/2 regresa .5? ¿Funcionan otras operaciones?

+0

Sí. Por ejemplo, 29/128 da como resultado la respuesta correcta. ¿Estaba bajo la impresión de que Matlab no tenía forma? ¿Cómo configuro las variables para que sean dobles? – jakev

10

intento:

double(val)/double(bucketSize) 
+0

esto hubiera funcionado también, gracias – jakev

1

lo tengo, el problema es que mi matriz, por alguna razón contenía de uint8, no dobles. Simplemente cambié val = I (i, j) a val = double (I (i, j)) y todo está bien. Gracias.

Cuestiones relacionadas