jueves, 19 de junio de 2008

Pedime arreglo

Ayer estaba tratando de programar el algoritmo bit-reverse order que se usa en la fft y primeramente lo había hecho a pata, bien "a lo bruto", después me puse a mirar acá y vi que si lo hacía de manera implícita era una boludez.
Lo hice con una función recursiva, así sirve para cualquier arreglo de longitud potencia de 2, en fin, la parte del algoritmo que pone en la primer mitad los elementos de índice par y en la segunda los de índice impar, se puede hacer en dos lineas, y así economizar código. Si c es nuestro arreglo auxiliar y x el arreglo de entrada, y ambos van de 0 a N-1,

c(0:N/2 -1)=x(0:N-1:2) !-- pares
c(N/2:N-1)=x(1:N-1:2) !-- impares


Como decía arriba, si a esto lo pongo en una función a la que llamo recursivamente pasandole la primera mitad del vector c y luego la segunda mitad, el bit-reverse order sale por un tubo.

miércoles, 11 de junio de 2008

Arreglos implícitos

No se si el título realmente identifica lo que quiero mostrar, pero no importa...
El tema es así, para generar un vector -llamemoslo X- que vaya desde un valor determinado -límite inferior (li)- hasta otro -límite superior- con un incremento dx solíamos hacer -antes de ver la luz- un ciclo do de la siguiente manera:

do i=0,K
x(i)= li + real(i)*dx
end do


Esto me resultaba bastante incómodo, porque por cada inicialización de una variable independiente debíamos reccorrer todo un cliclo y hacer tres lineas de código, cuando en lenguajes interpretados esto se hace en una sola.

Bien, acá el tema es que fortran (ya empiezo a sentir cosas por él) es un lenguaje ecléctico entre aquelos interpretados y compilados, caracterísctica que a mi modo de ver lo destaca.

Para evitar las tediosas tres lineas anteriores, basta con definir el vector X de la siguiente manera:

X=(/(i*dx, i=li,ls)/)


Por ejemplo, si quisieramos tener valores entre -0.5 y 0.5 con un dx=0.1:

X= (/(i*0.1,i=-5,5)/)


Esto nos daría,

-0.5000000
-0.4000000
-0.3000000
-0.2000000
-0.1000000
0.000000
0.1000000
0.2000000
0.3000000
0.4000000
0.5000000

Muy útil para tener programas más limpios...
Hasta la próxima

sábado, 7 de junio de 2008

Fortran no ha muerto

Sinceramente pensaba que fortran era de esos lenguajes viejísimos, muertos, que nunca en mi perra vida iba a ver. Una vez más me equivoqué feo.
Estoy encontrando funcionalidades en fortran que a mi modo de ver lo destacan de otros lenguajes, obviamente que depende mucho del objetivo de la aplicación que estamos programando.
En fin, yendo a los bifes les menciono algunos detalles modernos destacables relacionados con el manejo de arreglos,

  • Permite índices desde cualquier rango
    real :: x(-10:10)
    real :: y(0:10)

  • Trabajar con vectores de modo vectorizado
    write(*,*) x(0:10)
    y=x(-10:0)


  • Extraer algunos elementos del vector

    x((/1,8,5,6/)) -> esto nos devuelve una sección del arreglo con elementos x(1), x(8), x(5), x(6)


Ya volveré con algunos detalles más sobre este lenguaje que cada vez me gusta más.