intrododuccion a programacion IDL

28
INTRODUCCIÓN A LA PROGRAMACIÓN EN IDL

description

aprendiendo a usar programación IDL

Transcript of intrododuccion a programacion IDL

INTRODUCCIN A LA PROGRAMACIN EN IDL

2014Introduccin IDL (Interactive Data Language) es un lenguaje interpretado, orientado al anlisis matemtico y al despliegue grco. Interpretado signica que existe un programa intrprete que procesa el cdigo escrito en este lenguaje. Por esta razn no es posible directamente generar un programa ejecutable a partir de un programa hecho en IDL, y los programas entonces dependen de la existencia del intrprete en la plataforma sobre la cual se deseen correr los programas. Un programa realizado en un lenguaje interpretado tiene sus ventajas y desventajas. Una de las principales ventajas es la portabilidad sobre plataformas distintas, es decir, un programa, escrito en IDL por ejemplo, creado en Unix debera correr sin problemas en Windows si se dispone del intrprete. Entre las desventajas ms importantes estn que los programas son ms lentos (comparados con programas ejecutables) y que no es posible proteger el cdigo (cualquier usuario que tenga el programa puede ver cmo est programado). IDL adems posee numerosas rutinas de anlisis numrico y estadstico que evita al programador tener que estarlas programando o usando libreras externas. Entorno de Trabajo en IDL

El entorno de desarrollo de IDL (IDLDE) es una interfaz grfica que provee las herramientas al usuario para la edicin y depuracin de errores para IDL.

Barra de MenLnea de ComandosVisualizacin de ComandosVentana de EdicinVentana de ProyectosBarra de Herramientas

Una breve descripcin de las funcionalidades de las componentes del IDLDE est listada en la siguiente tabla.ComponenteFuncionalidad

Barra de menMens para abrir, editar, compilar y ejecutar los programas en IDL

Barra de herramientasControles grficos con una funcionalidad similar a la barra de men

Ventana de proyectosHerramienta para facilitar un agrupamiento de programas o archivos de datos en IDL

Ventana de edicinDonde los programas en IDL son escritos y editados

Visualizacin de comandosUsado por IDL para retornar a un usuarios informacin sobre las ejecuciones

Lnea de comandosLugar donde se escriben comandos que no son parte del panel de edicin

Ayuda en lnea de IDL

IDL est equipado con un sistema de documentacin extensa, que es denominado IDL Online Help (Ayuda en lnea de IDL). Con esta herramienta, usted tendr documentacin detallada de todas las rutinas en IDL, facilitando una forma de aprendizaje de este lenguaje. Para ejecutar esta herramienta basta con digitar el signo de interrogacin en la lnea de comandos del IDLDE

IDL> ?

Comandos de ejecucin

Los comandos de ejecucin son instrucciones utilizadas para compilar, ejecutar, ejecutar paso a paso o parar los procedimientos, funciones y programas principales.

ComandosDescripcin

.compileCompila los mdulos del programa

.continueContina la ejecucin de un programa que haba sido interrumpida debido a un error, una instruccin de alto, o una interrupcin por teclado.

.editAbre los archivos en un panel de edicin del IDLDE

.goEjecuta un programa previamente compilado

.reset_sessionReinicia el sistema de memoria de IDL, eliminando las variables, funciones y procedimientos compilados por el usuario

.returnContinua la ejecucin hasta encontrar una instruccin de retorno

.runCompila procedimientos, funciones y el programa principal de IDL, ejecuta el programa.

.stepEjecuta un nmero especfico de instrucciones del programa actual, hasta que pare.

.stepoverLlama a otra unidad del programa

.traceSimilar a .continue, le indica cada lnea de cdigo antes de ser ejecutado

Tipos de Programas

IDL soporta tres tipos de programas: Principal, Procedimientos y Funciones. Los Procedimientos y funciones son la clave para modelar una programacin estructurada. Es mejor escribir procedimientos y funciones que escribir todo en un programa principal. Todos los programas precisan de ser compilados antes de ser ejecutados. Compilar es el acto de interpretar las instrucciones del cdigo fuente en un archivo en cdigo byte almacenado en memoria.

Programa principal (main program)

Los programas principales estn incorporados en la lnea de comandos de IDL, son tiles cuando se tienen algunos comandos que se quieren ejecutar sin tener que crear un archivo separado contenindolos. Los programas principales no son explcitamente nombrados; consisten en una serie de instrucciones que no son precedidas por un procedimiento o una funcin. Entretanto, requerimos de una instruccin END. Por no tener un cabecero, el programa no puede ser llamado por otras rutinas y no puede ser pasado como argumento. Cuando IDL encuentra un programa principal como resultado del comando de ejecucin .RUN, compilado en un programa especial nombrado $MAIN$ y ejecutado inmediatamente. Este podr ser ejecutado nuevamente usando el comando de ejecucin .GO.

Un ejemplo a seguir es un programa principal simple que usa la lnea de comandos de IDL:

En la lnea de comandos de IDL, digite: X=2Digite .RUN en la lnea de comandos de IDL.Digite: X = X * 2PRINT, XENDEsta instruccin retorna un valor de X, las instrucciones son compiladas y ejecutadas por el programa especial $MAIN$:% Compiled module: $MAIN$.4Digite .GO en la lnea de comandos. El programa principal ser ejecutado nuevamente, retornando o nuevo valor de X:8

Procedimientos

Un procedimiento ya est contenido en un programa de IDL. Un procedimiento comienza con una instruccin de declaracin de procedimiento, que consiste en la palabra clave reservada PRO, seguidamente el nombre del procedimiento, y cualquier instruccin. Un procedimiento ser terminado con la instruccin de END. Un ejemplo de un procedimiento es el archivo que llamaremos procedimiento.pro, y que ser creado de la siguiente manera:

Abrir un IDLDEArchivo Nuevo Archivo Fuente de IDL o [Ctrl+N]Digite el siguiente cdigoPro procedimientoX=findgen(100)Y=x^2Print,yEndGuarde el archivo con el nombre procedimiento.pro. Compile el procedimiento usando apenas el comando de ejecucin .compile IDL> .compile procedimiento.proEjecute el procedimiento llamndolo por su nombre:IDL> procedimiento

FuncinUna funcin comienza con una instruccin de declaracin de funcin, que consiste en la palabra clave reservada, FUNCTION. El cuerpo de una funcin, incluyen por ultima la instruccin RETURN. Una funcin termina con la instruccin END. Un ejemplo de una funcin es el archivo que llamaremos funcion.pro, y que ser creado de la siguiente manera (siga los pasos que fueron descritos en el ejemplo de procedimiento, apenas substituyendo el cdigo):Function funcion, fReturn, f gt 1EndPara compilar la funcin use el comando de ejecucin .compileIDL> .compile funcionLa sintaxis para llamar esta funcin es:IDL> f = funcion (10)IDL> print, f1

Da la misma forma que en procedimiento, si el archivo que contiene la funcin no se encuentra en el directorio de IDL, podr ser compilado especificando todo el camino en el comando de ejecucin .COMPILE.

Variables

Nombres vlidos. Los nombres de las variables deben comenzar con una letra y puede tener hasta 128 letras, dgitos, sobrescritos, o smbolos de dlar. El tamao de las variables est limitado por el computador y el sistema operativo que est utilizando, y no por IDL. Los nombres de variables son nicos. IDL no diferencia entre maysculas ni minsculas.

Tipos de variables. Existen 15 tipos de variables en IDL, siete enteros, dos flotantes, dos complexas, una de tipo texto, dos de tipo abstracto (objetos y punteros), e indefinido. Las estructuras son consideradas su propio tipo, en cuanto las matrices son del mismo tipo de sus elementos.

TipoTamao(bits)Creacin por EscalaFuncin de Conversin

byte8a = 5BBYTE

integer16b = 0S ; b = 0FIX

unsigned integer16c = 0UUINT

long integer32d = 0LLONG

unsigned long integer32e = 0ULULONG

64-bit integer64f = 0LLLONG64

unsigned 64-bit integer64g = 0ULLULONG64

float32h = 0.0FLOAT

double64i = 0.0DDOUBLE

complex64j = complex(1.0, 0.0)COMPLEX

double complex128k = dcomplex(1.0, 0.0)DCOMPLEX

string

l = helloSTRING/

l = "hello"STRTRIM

pointer32m = ptr_new()

object32n = obj_new()

undefined8

Creacin de variables. En IDL las variables no precisan de ser declaradas. El tipo de variables es determinado por el uso. Antes de la creacin, una variable es de tipo undefined (indefinido); no es permitido utilizar una variable indefinida en una expresin.

IDL> help, varVAR UNDEFINED = IDL> var = 0LIDL> help, varVAR LONG = 0

Existen tres formas de crear una variable de forma que no sea Indefinidas, ellas son: Escalar, Matricial (o Vectorial) y por Estructuras.

Escalar

Las variables escalares son inicializadas de forma que la variable sea de valor escalar (o sea apenas un valor). Por ejemplo:

IDL> image_pixel = 0B ; byteIDL> loopcounter = 0U ; uintIDL> n_elms = 0L ; longIDL> fileoffset = 0ULL ; ulong64IDL> variance = 0.0 ; floatIDL> total = 0.0D ; doubleIDL> complex_var = complex(0.0 , 0.0) ; complexIDL> name = 'Hello World' ; stringIDL> new_image_pixel = image_pixel ; byteIDL> pixel_value = image_pixel + 0.0 ; byte + float = float

Matricial y Vectorial

El IDL es un lenguaje basado en matrices, ya sean unidimensionales (vectores) o bidimensionales.

TIPOFUNCIN DE CREACINNDICE QUE GENERA LA FUNCIN

ByteBYTARRBINDGEN

IntegerINTARRINDGEN

Unsigned integerUINTARRUINDGEN

Long integerLONARRLINDGEN

Unsigned long integerULONARRULINDGEN

64-bit integerLONG64ARRL64INDGEN

Unsigned 64-bit integerULONG64ARRUL64INDGEN

FloatFLTARRFINDGEN

DoubleDBLARRDINDGEN

ComplexCOMPLEXARRCINDGEN

Double complexDCOMPLEXARRDCINDGEN

StringSTRARRSINDGEN

PointerPTRARR

ObjectOBJARR

Undefined

StructureREPLICATE

Los Vectores y matrices con diferentes tipos de variables y datos pueden ser iniciados con rutinas de IDL como las listadas en la tabla de arriba

IDL> vec = fltarr (15)IDL> vec[5] = 4.56IDL> vec[13]= 1234.333

En el ejemplo anterior las posiciones del vector llamado vec comienzan con 0. Los vectores y matrices tambin pueden ser creados atribuyendo a una variable cierto nmero de valores entre corchetes.IDL> temp = [12, 82, 97, 23, 0, 78]. Esta instruccin crea un vector de seis enteros. Una matriz de mltiple dimensin puede ser creada colocando valores dentro de varios corchetes dentro de dos corchetes, observe:

IDL> id4x4 = [ [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1] ]IDL> help, id4x4ID4x4 INT = Array [4, 4]La variable id4x4 es una matriz de dimensin 4 X 4.

Considere la instruccin siguiente: IDL> exemplo_arr = [3.4, 6.7D, 45U, 90L]. Esta instruccin crea un vector con diferentes tipos de variable. En IDL no representa problemas este tipo de declaracin, el ejecuta una conversin por el tipo ms significativo. El tipo ms significativo en esta instruccin es el double (6.7D). Todos los elementos del vector son convertidos a double.

Operaciones de matrices e vectores

Cuando ejecutamos una operacin con matrices o vectores en IDL, ellos son ejecutados en todos los elementos que estn dentro de matriz o vector.

IDL> x = findgen (360) * !dtorIDL> sincurve = sin(x)IDL> plot, sincurve

Matrices multidimensionales

Las matrices en IDL pueden tener hasta 8 dimensiones. En el caso de una matriz bidimensional un elemento se especifica normalmente con el nombre de la variables seguida se [columna, lnea].

IDL> multi = lindgen (4, 6) ; cuatro columnas, seis lneasIDL> print, multiIDL> print, multi [1, 0], multi [3, 5]1 23IDL> print, multi [*, 4] ; imprime la quinta lneaIDL> print, multi [2, *] ; imprime la tercera columnaIDL> print, multi [2: 3, 1: 2] ;?

Multiplicacin de Matrices

El operador # calcula el producto de una matriz, multiplicando las columnas de la primera matriz por las lneas de la segunda. La segunda matriz debe tener el mismo nmero de columnas que la primera en lneas. La matriz resultante ser el nmero de columnas de la primera matriz y el mismo nmero de lneas de la segunda matriz.

IDL> a = indgen(3,2)IDL> print, a0 1 23 4 5IDL> b = indgen(2,3) IDL> print, b0 12 34 5IDL> print, a # b3 4 59 14 1915 24 33

El operador ## calcula el producto de una matriz, multiplicando las lneas de la primera matriz por las columnas de la segunda. La segunda matriz debe tener el mismo nmero de lneas que la primera en columnas. La matriz resultante tendr el nmero de lneas de la primera matriz y el mismo nmero de columnas de la segunda matriz.IDL> print, a ## b10 1328 40

Estructuras lgicas

Bucles

Antes de analizar la forma de estas estructuras en IDL, es importante advertir que su uso ralentiza considerablemente los programas. Por tanto deben usarse solo cuando pensemos que es inevitable. Ms adelante veremos algn ejemplo clasificador. Los bucles en IDL se crean con la sentencia FOR, que tiene dos formas ligeramente diferentes. Si tenemos una nica sentencia es como en este ejemplo:

IDL> a=2.3d & b=1.d-8IDL>; desde i=1 hasta 9, de 2 en 2 hacer:IDL> FOR i=1, 9, 2 DO a=a+b*iIDL> print, format='(d15.10)', a2.3000002500

Comprueba a mano que este es el resultado que esperabas. Naturalmente la variable i puedes sustituirla por otra cualquiera, por ejemplo: for j=1, 9, 2 do a=a+b*j. Por otra parte, por qu hemos puesto formato a la salida por pantalla?

Si tenemos varias sentencias dentro del bucle debemos usar esta otra forma (que solo vale para los programas, no para ejecutarla desde la lnea de comandos):

FOR i=1,9,2 DO BEGINa=a+b*ila=cos(pa)etc.ENDFOR

En muchas ocasiones el incremento es la unidad y puede omitirse pues por defecto se toma ste:

for i=0,4 do begina=a+b*(2*i+1)etc.endfor

Nos har el clculo para i=0, 1, 2, 3,4. En este ejemplo el resultado ser el mismo que antes.

Sentencias condicionales

Supongamos que introducimos por pantalla una variable: IDL>read, a, prompt='entra un nmero:'

El procedimiento read permite introducir variables desde el teclado. Si la variable no est definida previamente, se entiende que es un FLOAT pero si ya est definida mantiene su tipo y estructura. Supongamos tambin que queremos prevenir la raz cuadrada de un nmero real negativo. Podemos poner algo as como:

IDL>IF a ge 0.0 THEN b=sqrt(a) ELSE print,'cuadrado negativo'

Que nos sirve de ejemplo. En el caso ms sencillo, la estructura condicional en IDL es de la siguiente manera:

IF expresin THEN sentencia [ELSE sentencia]

donde los corchetes indican que es una parte opcional de la estructura. La sentencia pueden incluir cualquier comando de IDL pero la expresin debe ser una de tipo lgica (si o no). Para construir sentencias lgicas ten en cuenta los siguientes operadores relacionales: LT, LE, GT, GE, EQ, NE, as como los operadores lgicos: AND, NOT, OR. Consulta la ayuda para obtener ms informacin sobre los distintos operadores (por ejemplo ?relational operators).

Nombre expresinDescripcinSignificado

eqequalIgual

nenot equalNo igual

leless than or equalMenor o igual

ltless thanMenor de

gegreater than or equalMayor o igual

gtgreater thanMayor de

Al igual que ocurre con el for, en el caso de tener varias sentencias la forma anterior para la estructura condicional no es vlida y debemos usar la siguiente (nuevamente se necesita que este dentro de un programa):

IF a ge 0.0 THEN BEGINb=sqrt(a)etc.ENDIF [ELSE BEGINprint,'cuadrado negativo'etc.ENDELSE]

La parte entre corchetes es opcional y puede suprimirse si no es necesaria.Bucles condicionados

Tambin existen los bucles condicionados. En el caso sencillo son de la forma:

WHILE expresin DO sentenciaPor ejemplo:IDL> a=35.4IDL> while a lt 1.e+20 do a=a*a & print, a6.08209e+24

Nota que la sentencia print, a se realiza una vez hemos salido del bucle (es idntico a escribirla en una lnea debajo). Si queremos poner ms de una sentencia dentro del bucle debemos hacer algo como en este otro ejemplo (solo valido en programas):

n=0Lnmax=long(1e+5) ;mx. numero iteracionesa=35.4while a lt 1.e+20 and n lt nmax do begina=a*a & n=n+1endwhileif n eq nmax then print, 'iteracion no completada correctamente'

Fjate que dentro del bucle hay ms de una sentencia aunque por conveniencia las hemos puesto en la misma lnea. Por otra parte, podemos usar los parntesis para mayor claridad y seguridad aunque en los ejemplos que hemos visto no es necesario pues el orden en el que se ejecutan los operadores por defecto es el que queremos:

while ( (a lt 1.e+20) and (n lt nmax) ) do begina=a*a & n=n+1endwhileif(n eq nmax) then print, 'iteracion no completada correctamente'

Resumiendo, en general la forma del bucle condicional de ms de una sentencia es:

WHILE expresin DO BEGINsentencia 1sentencia 2...ENDWHILE

Tambin puede usarse la siguiente estructura para los bucles condicionados:

REPEAT sentencia UNTIL expresin

Por ejemplo:

IDL> n=0 ; ponemos esta lnea para que el procedimiento read : sepa que n es entero. Aunque en este caso : funcionaria de todos modosIDL> repeat read, n, prompt='entra un numero de 0 a 31:' $IDL> until (n ge 0 and n le 31)IDL> window, n

nos asegura que el numero introducido es correcto antes de proseguir (recuerda que las ventanas manuales van de la 0 a la 31). Para ms de una lnea la forma equivalente es:

REPEAT BEGINsentencia 1sentencia 2...ENDREP UNTIL expresin

Constantes IDLValorDescripcin

!PI con precisin simple

!DPI con doble precisin

!DTOR/180Factor para pasar grados a radianes

!RADEG180/Factor para pasar radianes a grados

Algunas funciones internas de IDL

Como ya hemos comentado siempre que sea posible deben evitarse los bucles y las sentencias condicionadas: si se hace bien puede disminuir el tiempo de ejecucin de un programa considerablemente. A parte de estructurar bien los programas para hacer el mnimo nmero de operaciones, debemos tener siempre presente que hay funciones internas que se ejecutan mucho ms rpidamente que si las escribimos en lenguaje IDL. Como ejemplo calcularemos la media de los elementos de un vector. Primero creamos el vector (en este ejemplo con nmeros aleatorios). Luego calculamos la media; por una parte (bsum1) con un bucle y por otra (bsum2) usando una funcin interna de IDL: MEAN. Finalmente vemos que el resultado es el mismo pero por el tiempo de ejecucin, como se aprecia a simple vista, es mucho mejor usar la segunda opcin:

IDL> n=long(10.^7)IDL> b=randomu(seed,n)IDL> bsum1=0.dIDL> for i=0L,n-1L do bsum1=bsum1+b[i] & bsum1=bsum1/nIDL> bsum2=mean(b,/double)% Compiled module: MEAN.% Compiled module: MOMENT.IDL> print,bsum1,bsum20.49996092 0.49996092

Si en lugar de la media se necesita la suma de los elementos de un array debe usarse la funcin interna total, evitando el uso de un bucle. Un poco ms completa que la funcin mean es la funcin MOMENT que permite calcular no solo la media sino tambin la dispersin, etc. de un conjunto de datos. El resultado lo devuelve en un vector (consulta la ayuda para ver que es cada componente):

IDL> stat=moment(b,/double)IDL> print,'media=',stat[0] & print,'varianza=',stat[1] & $IDL> print,'desviacion tipica=',sqrt(stat[1])media= 0.49996092varianza= 0.083304029desviacion tipica= 0.28862437

aunque como se ve es ms lenta y por tanto si solo queremos la media es preferible la anterior. De uso muy frecuente es la funcin WHERE. Consideremos a modo de ejemplo que tenemos el siguiente vector que representa distintos ngulos en el intervalo (0; 3):

IDL> ang=3.*!pi*randomu(seed3,10)IDL> print,ang,format='(10f6.2)'8.91 1.59 3.78 6.96 5.93 7.10 2.80 2.41 3.46 3.10

y supongamos que queremos que todos los ngulos estn en el intervalo [0; 2], donde:

IDL> print,2*!pi6.28319

Entonces empezamos por buscar los elementos del vector que sean mayores que 2. La funcin where nos indica los ndices del vector donde esto ocurre:

IDL> ind=where(ang gt 2.*!pi) & print,ind0 3 5

Vemos que el vector ind contiene no los valores ang[i] sino los ndices i donde ang[i]>2*!pi. Entonces restamos 2 a estos ngulos que se pasan:

IDL> ang[ind]=ang[ind]-2.*!piIDL> print,ang,format='(10f6.2)'2.62 1.59 3.78 0.68 5.93 0.82 2.80 2.41 3.46 3.10

Lectura y escritura de _cheros

PREGUNTA: Tengo un archivo de datos ASCII llamado data.dat con una cabecera de tres lneas y tres columnas de datos. Quiero que cada columna tenga un vector separado en IDL. El nmero de filas en el archivo de datos es variable, pero el nmero est escrito en la segunda lnea de la cabecera. Cmo puedo leer este tipo de archivos de datos en IDL?

Experiment 01-14-97-2b9cNo. of Data Rows: 247Temperature Pressure Relative Humidity 20.43 0.1654 0.243 16.48 0.2398 0.254 17.21 0.3985 0.265 18.40 0.1852 0.236 21.39 0.2998 0.293

RESPUESTA: Hay un gran nmero de formas de leer este tipo de archivo de datos en IDL, pero aqu es una manera. En primer lugar, debe adjuntar el archivo a un nmero de unidad lgica, ya que toda la entrada y salida de archivos se produce en nmeros de unidades lgicas en IDL. Esto se hace con el comando OPENR (para Leer). Que va a utilizar la palabra clave GET_LUN para obtener un nmero disponible de unidad lgica de un conjunto de nmeros IDL gestiona. El nmero de unidad lgica se asigna a la variable de LUN en el comando a continuacin.

OPENR, lun, 'data.dat', /GET_LUN

El siguiente paso consiste en leer el encabezado. Dado que en este caso sabemos que la cabecera es de las tres primeras lneas del archivo, se puede leer la cabecera en una matriz de cadenas de tres elementos. Al leer una variable de cadena, IDL lee hasta el final de la lnea actual en el archivo. Para leer el encabezado, se utiliza el comando READF, as:

header = STRARR(3)READF, lun, header

Si lo desea, puede imprimir el encabezado ahora, as:

PRINT, header

El siguiente paso es leer el nmero de filas en el archivo de datos desde la segunda lnea de la cabecera. He aqu una manera de hacer con el uso del comando READS. El mtodo que se muestra aqu requiere que usted sepa el numero entero que especifica el nmero de filas de datos que hay en el archivo que comienza en la columna 18 en el archivo (consulte la palabra clave FORMAT).

junk = ""; Una variable de cadenarows = 0 ; Una variable enteraREADS, header(1), junk, rows, FORMAT='(A17,x,I0)'

El formato "I0" en el comando READS le permite leer un valor entero con un nmero variable de dgitos. Esto ser til si usted no sabe si el nmero de filas ser de 100 o 10000. A veces no se sabe el nmero de filas de los datos que tiene en el archivo. Qu hacer entonces? Si yo no s cuntas filas se encontraban en el archivo de datos en el ejemplo anterior, podra haber utilizado el comando EOF para leer los datos hasta que llegu al final del archivo. Por ejemplo, supongamos que yo no s cuntas filas de datos que tengo, pero estoy seguro que tengo menos de 10.000. Podra haber puesto mi cdigo de esta manera:

pressure = FLTARR(100) temperature = FLTARR(100) humidity = FLTARR(100)p = 0.0 t = 0.0 h = 0.0count = 0 WHILE (NOT EOF(lun)) DO BEGINREADF, lun, p, t, h pressure(count) = p temperature(count) = thumidity(count) = hcount = count + 1 ENDWHILEpressure = pressure(0:count-1)temperature = temperature(0:count-1)humidity = humidity(0:count-1)print,humidity

El programa final ser:

PRO LEEROPENR, lun, 'C:\data.dat', /GET_LUNheader = STRARR(3)READF, lun, headerPRINT, headerjunk = "" rows = 0 READS, header(1), junk, rows, FORMAT='(A17,x,I0)'pressure = FLTARR(100) temperature = FLTARR(100) humidity = FLTARR(100)p = 0.0 t = 0.0 h = 0.0count = 0 WHILE (NOT EOF(lun)) DO BEGINREADF, lun, p, t, h pressure(count) = p temperature(count) = thumidity(count) = hcount = count + 1 ENDWHILEpressure = pressure(0:count-1)temperature = temperature(0:count-1)humidity = humidity(0:count-1)print, humidityEND

Resultado:

Experiment 01-14-97-2b9c No. of Data Rows: 247 Temperature Pressure Humidity

0.243000 0.254000 0.265000 0.236000 0.293000

La clase ms simple de datos que puede recibir de un experimento simple sera (x, y). Por ejemplo, usted podra tener acceso a una estacin de observacin meteorolgica que registra la fecha, hora, temperatura y la velocidad del viento. En ltima instancia es posible que desee trazar la temperatura en funcin del da o la temperatura vs velocidad del viento, o quin sabe qu. A menudo, estos datos aparecen como ASCII (texto) tablas, el tipo que siempre se puede ver con un editor de texto.

lambda_nm signal_cts 380 0.00143708199983 381 0.00153702295425 382 0.00154965916688 383 0.00130114698519 384 0.00144397447945 385 0.00139113213573 386 0.00167180922229 387 0.00178974720682 388 0.00167602129317 389 0.00188241276610 390 0.00194980590012

Hay una sola lnea de cabecera que describe las columnas, en este caso, la longitud de onda en nm y el nivel de la seal en los conteos del detector por segundo (o algo as). Cmo obtener estos datos en IDL?

La Manera Ms Fcil

El paquete de IDLastro de la NASA's Goddard Space Flight Center tiene una herramienta muy til para leer datos en columnas, es un procedimiento que se llama readcol. El archivo spectrum.txt que se utilizar en este ejercicio se encuentra en la siguiente pgina web: http://www.eg.bucknell.edu/physics/ASTR201/IDLTutorial/spectrum.txt readcol, 'spectrum.txt', lambda, signalreadcol busca datos en columnas y carga los datos en variables de matriz.print, lambdaplot, lambda, signal, xtitle='Wavelength(nm)', ytitle='Counts per second'

There appears to be an overall background level in the count rate; that is, ideally "no signal" means 0 counts per second, but instead there seems to be some constant offset in the count rate. Suppose that instrumental background level were uniformly 0.002 counts per second across the spectrum. We can easily remove that background,signal = signal - 0.002Ahora bien, podra ser til para guardar los datos sustrados de fondo. Hay una bonita herramienta llamada writecol que se comporta de manera similar a readcol.

writecol, 'spectrum_bgsub.txt', lambda, signalY ahora usted debe haber guardado los datos para la posteridad.Entrada con formato readcol (http://idlastro.gsfc.nasa.gov/ftp/pro/misc/readcol.pro)readcol, por defecto, busca los nmeros, pero a veces hay una columna rellena con el texto, los nombres de los objetos celestes, por ejemplo. Se puede decir readcol para buscar texto en una columna determinada mediante la inclusin de la instruccin de formato.readcol, 'data_with_text.txt', x, y, names, format='(f,f,a)'Este comando le dice readcol para buscar nmeros de punto flotante en las dos primeras columnas, pero el texto (ASCII) en la tercera columna.Salida usando writecol (http://www.eg.bucknell.edu/physics/ASTR201/IDLTutorial/writecol.pro). Writecol se comporta de manera similar: la expectativa es que usted est escribiendo columnas de nmeros. Para forzar una columna de salida a ascii.writecol, 'data_with_text.txt', x, y, names, fmt='(f,f,x,a)'Tenga en cuenta que los cambios de palabras clave de format a fmt por ninguna buena razn. El x es la instruccin de formato que solicita writecol para poner en un espacio en blanco entre y y nombres. Pruebe el siguiente experimento:n = n_elements(lambda)goofy = replicate('goofy', n)writecol, 'goofy_file.txt', lambda, signal, goofy, fmt='(f,f,x,a)'Echa un vistazo a 'goofy_file.txt' con un editor de texto. A continuacin, intente:readcol, 'goofy_file.txt', x, y, names, format='(f,f,a)'pro LEERASCCI2

readcol,'C:\VEGETACION.dat',LONG_DE_ONDA,REFLECTprint,LONG_DE_ONDAplot,LONG_DE_ONDA,REFLECT,xtitle='LONG_DE_ONDA',ytitle='REFLECT'LONG_DE_ONDA = LONG_DE_ONDA + 0.002n = n_elements(LONG_DE_ONDA)writecol, 'C:\LONG_DE_ONDA_CORREGIDA.dat', LONG_DE_ONDA,REFLECT, fmt='(f,f,x,a)'end