2010-10-02 23 views
10

Puedo redondear los elementos de A a los enteros más próximos mayores o iguales a Atecho a 50 más cercano

ceil(A) 

Pero ¿qué pasa si quiero redondea a los 50 más cercano mayor o igual a A ?

Por ejemplo, dada la siguiente A matriz,

A=[24, 35, 78, 101, 199]; 

Una subrutina debe devolver la siguiente

B=Subroutine(A)=[50, 50, 100, 150, 200]; 

Respuesta

15

Se podía dividir por 50, tome ceil(), y se multiplica por 50 de nuevo :

octave:1> A=[24, 35, 78, 101, 199]; 
    octave:2> ceil(A) 
    ans = 

    24 35 78 101 199 

    octave:3> 50*(ceil(A/50.)) 
    ans = 

    50 50 100 150 200 
+1

Tenga en cuenta que esto podría introducir concebiblemente de punto flotante errores de redondeo, para valores grandes en A. –

+0

Meh, así que deshazte del punto decimal después de los 50 en la división. O los números ya son valores de punto flotante, en cuyo caso ese problema ya ha aparecido en otro lugar del código, o los números son enteros, en cuyo caso simplemente elimine el punto decimal y ahora está haciendo una división y suma de enteros , en cuyo caso no hay puntos flotantes. Entonces no veo el problema aquí. –

+0

El problema es que los resultados serán incorrectos. :-) Por ejemplo, intente con '77777777777777777' como entrada: este método da el resultado incorrecto' 77777777777777792', mientras que el método del módulo da correctamente '77777777777777800'. –

8

Una manera fácil es simplemente agregar el módulo de complemento de cada número 50:

octave> A = [24, 35, 78, 101, 199] 

octave> mod(-A, 50)  # Complement (mod 50) 
ans = 

    26 15 22 49 1 

octave> A + mod(-A, 50) # Sum to "next higher" zero (mod 50) 
ans = 

    50 50 100 150 200 

octave> A - mod(A, 50) # Can also sum to "next lower" zero (mod 50) 
ans = 

    0  0 50 100 150 

(Tenga en cuenta que esto sólo depende de la aritmética de enteros, lo que evita errores debidos a la de punto flotante de redondeo.)

+2

Me gusta esto porque explota la suma/resta del módulo, es decir, sin multiplicación/división. Sin embargo, si tiene una expresión compleja en lugar de A, es posible que desee volver a la solución que usa la función ceil porque la expresión solo se invocará una vez en ese enfoque. Todo hacia el objetivo de la simplicidad del código. – user36800