Uploaded by Lucho Diaz

Apuntes IDL

advertisement
9/22/2023
Comandos y sintaxis en IDL
Este documento cubre varios aspectos de la estructura del lenguaje IDL. está
organizado en las siguientes secciones:
Tipos de variables
o Procedimientos y Funciones
o Operadores lógicos
o Operadores matemáticos
Funciones Matemáticas
o Declaraciones de comando
Arreglos
I/O y archivos
Gráficos y desarrollo
Tipos de variable (2)
 Una variable entera (long integer) larga es lo mismo que una variable
entera, excepto que ocupa 32 bits de memoria y, por lo tanto, abarca el
rango de aproximadamente -2, 000,000,000 a +2, 000,000,000.
 Una variable de punto flotante (floating point) es un número de precisión
simple de 32 bits en el rango de ±1038, con aproximadamente seis o siete
decimales de significado.
 Una variable de punto flotante de precisión doble (double precision
floating point) es un número de punto flotante de precisión doble de 64
bits en el rango de ±1038 en sistemas VMS y ±10308 en máquinas
compatibles con el estándar IEEE, con aproximadamente 14 lugares
decimales de importancia.
Tipos de variable
 Una variable se usa en IDL para representar simbólicamente un valor. El
valor de una variable está sujeto a cambio (como su nombre indica). Las
variables vienen en diferentes tipos. Deben ser declarados como ciertos
tipo, y luego se le asigna un valor consistente con el tipo declarado.
 Los tipos de variables que admite IDL son: Boolean, Integer, Long Integer,
Floating Point Decimal, Decimal de punto flotante (floating point) de
doble precisión, Complejo, Caracteres y strings.
 Las variables booleanas solo pueden ser 0 o 1. Se utilizan en lógica
binaria.
 Las variables enteras pueden ser cualquier número entero. Con un rango
de -32,768 a +32,767. Una variable entera tiene 16 bits de largo.
Tipos de variable (3)
 Una variable compleja es un par real-imaginario de números de punto
flotante de precisión simple. Los números complejos son útiles para el
procesamiento de señales y el filtrado en el dominio de la frecuencia.
También viene en una variedad de doble precisión.
 Un string es una secuencia de caracteres, de 0 a 32.767 caracteres de
longitud, que se interpreta como texto. Un carácter tiene 8 bits de
longitud. Es por tanto un número entre 0 y 255 que se interpreta como un
símbolo alfanumérico.
1
9/22/2023
Tipos de variable (4)
Integer: a = 5
Long Integer: a = 5L (minúscula l es aceptable pero parece un 1)
Floating Point: a = 5.0
Double Precision a = 5.0D
Complex a = complex(5,0)
String a = ’5’
 También se pueden crear matrices que consisten en cualquiera de los
tipos de variables anteriores. La creación de arreglos se explica en la
sección Arreglos de este documento.
 Las variables en IDL se "emiten dinámicamente", lo que significa que las
operaciones en ese tipo de variable pueden cambiar el tipo de variable.
Tipos de variable (5)
a=5
print, a
b=a/2
print, b
b = a / 2.0
print, b
Tipos de variable (6)
print, 1024 * 768
print, long(1024 * 768)
print, 1024 * 768L
 Vemos que la primera vez que dividimos a por 2 obtenemos 2 porque se supone que
b es un número entero. Pero si dividimos a por 2.0, luego b se cambiará
automáticamente a una variable flotante.
 También puede cambiar explícitamente el tipo de una variable usando los comandos
fix, long, round, float y otros. Se justifica una precaución al forzar el tipo de una
declaración matemática. IDL siempre evaluará la declaración primero y luego
intentará cambiar el tipo del resultado. Esta a menudo conduce a resultados no
deseados.
2
9/22/2023
Operadores y Expresiones
IDL define un número de operaciones en cada tipo de datos
Operadores lógicos (2)
 Considere los siguientes ejemplos:
1 and 1 = 1, 1 and 0 = 0, 0 and 1 = 0, 0 and 0 = 0
1 or 1 = 1, 1 or 0 = 1, 0 or 1 = 1, 0 or 0 = 0
1 xor 1 = 0, 1 xor 0 = 1, 0 xor 1 = 1, 0 xor 0 = 0
not 1 = 0, not 0 = 1
Operadores lógicos
 Los operadores lógicos se utilizan a menudo en bucles de comandos y
también en sentencias matemáticas. Estos operadores devuelven un
valor de 1 si la declaración que evalúan es verdadera o 0 si es falsa.
 Existen dos tipos de operadores lógicos: operadores booleanos y
operadores relacionales.
Operadores booleanos
 Hay cuatro operadores booleanos en IDL. Toman argumentos de 1
(verdadero) o 0 (falso) y devuelven ya sea un 1 o un 0. Los operadores
son:
 AND, OR, XOR, NOT. Todos estos son sencillos con la posible excepción
de XOR que significa OR eXclusivo, lo que significa que uno y solo uno de
los argumentos puede ser verdadero para que XOR sea verdadero.
Operadores lógicos (3)
Operadores relacionales
 Hay seis operadores relacionales en IDL. Comparan números que pueden
ser enteros o decimales.
 Estos devuelven 1 para verdadero y 0 para falso. Los operadores
relacionales son: EQ, NE, LE, LT, GE, GT.
EQ es ‘equals’ 5 eq 5 = 1, 5 eq 4 = 0
NE es ‘not equal’ 5 ne 5 = 0, 5 ne 4 = 1
LE es ‘less than or equal’ 5 le 5 = 1, 5 le 4 = 0, 5 le 6 = 1
LT es ‘less than’ 5 lt 5 = 0, 5 lt 4 = 0, 5 lt 6 = 1
GE es ‘greater than or equal’ 5 ge 5 = 1, 5 ge 4 = 1, 5 ge 6 = 0
GT es ‘greater than’ 5 gt 5 = 0, 5 gt 4 = 1, 5 gt 6 = 0
3
9/22/2023
Operadores lógicos (4)
Estos operadores se pueden utilizar conjuntamente entre sí.
(A le 50) and (A ge 25) solo será verdadera si A está entre 25 y 50. Si A es
una matriz de números, entonces el resultado será una matriz de la misma
dimensión que consistirá en 0 y 1 apropiados para el declaración.
Operadores matemáticos
 IDL tiene todos los operadores matemáticos familiares (^*/+-) y algunos
adicionales para matemáticas de matrices.
 Estos operadores en combinación con los operadores lógicos detallados
arriba siguen un sistema de precedencia algebraica.
Operadores lógicos (5)
 La precedencia es lo que determina en qué orden actúan los operadores
dentro de una declaración.
 Las operaciones del mismo orden de precedencia son generalmente
conmutativas, de modo que la ambigüedad en su orden de ejecución
suele ser irrelevante.
 Se recomienda que para declaraciones complejas en las que el orden de
operación no está claro, se deben usar paréntesis, incluso si no es
explícitamente necesario. Los operadores se enumerarán y explicarán
brevemente en el orden de su precedencia.
Operadores lógicos (6)
Operadores lógicos (6)
 Highest Precedence
Parentesis ()
Los paréntesis anulan cualquiera de las precedencias algebraicas. Usar estos
tan a menudo como sea necesario para estar seguro de que IDL evalúa su
declaración como usted pretende.
 PRIMERA Precedencia
Exponenciación ^
El símbolo (^) eleva un número a la potencia de otro. Para ejemplo: 96
se expresaría en IDL como 9^6
 SEGUNDA Precedencia
Multiplicación *
El asterisco (*) es el operador de multiplicación: 9*6 = 54
División/
La barra diagonal (/) es el operador de división. Si los argumentos de este
operador son ambos enteros, el resultado será entero también. Si uno o dos
de los operadores son decimales, el resultado también será un decimal
flotante: 9/6 = 1, 9.0/6 = 1.5, 9/6.0 = 1.5
MODULO
La palabra MOD es el operador Modulo. El resultado de A mod B es el resto
de A dividido por B. Esto funciona para la división de enteros y también para
división flotante. 9 mod 6 = 3, 9.1 mod 6 = 3.1, 9 mod 6.1 = 2.9
4
9/22/2023
Operadores lógicos (7)
 TERCERA Precedencia
Adición+
(+) es el operador de suma. Es sencillo. 9+6 = 15
Resta (-) es el operador de resta. También es sencillo. 9-6 = 3
NO lógico
El operador not también se asigna al tercer nivel de precedencia.
 CUARTA Precedencia
Operadores Relacionales
Los operadores relacionales (eq,ne,ge,gt,le,lt) están todos asignados al
Cuarto nivel de precedencia algebraica.
Operadores lógicos (8)
 QUINTAPrecedencia
Operadores booleanos
Los tres operadores booleanos restantes se asignan al quinto nivel
de precedencia algebraica.
Como se indicó anteriormente, estos niveles de precedencia pueden ser
anulados por paréntesis.
5 + 2 / 2 + 5 = 11
(5 + 2)/(2 + 5) = 1
Siempre es preferible utilizar paréntesis cuando se desee forzar el orden de
las operaciones en un manera establecida.
Procedimientos y funciones
Procedimientos y funciones (2)
 En el lenguaje IDL existen dos tipos de subdivisiones de código:
procedimientos y funciones. Una vez creadas, estas estructuras se
pueden llamar desde cualquier lugar dentro de un programa IDL.
Generalmente, ambos procedimientos y funciones aceptan parámetros,
realizan cálculos, ejecutan tareas y luego regresan los resultados
especificados. Es importante usarlos si…
 Esto es seguido por el nombre del procedimiento. El procedimiento
principal debe tener el mismo nombre que el archivo en el que está
guardado. Por ejemplo, si mi programa se guardó como decay.pro , luego
la primera línea del procedimiento principal tendría que ser PRO decay.
• desea que el código de su programa sea legible,
• desea que su código sea más pequeño,
• su programa necesita repetir los mismos comandos a menudo,
• desea reutilizar instrucciones similares en otros programas.
 Los procedimientos, incluidos el procedimiento principal, comienzan con
la palabra PRO.
 En muchos procedimientos, deseará pasar información del procedimiento
que la invocó. Existen dos maneras de hacer esto. Una es usar
directamente las mismas variables que el procedimiento de invocación. El
otro es para pasar las variables como parámetros del procedimiento. El
último de estos es generalmente preferible a la primera opción por
razones de estilo y claridad.
5
9/22/2023
Procedimientos y funciones (3)
 Para pasar información que sea un parámetro para el procedimiento, la
primera línea del procedimiento debe enumerar aquellas variables que
espera como entrada. Un buen ejemplo de esto es el procedimiento de
'inicializar' del documento tutorial:
pro initialize, nuclei, t, tau, dt
 Esto define que 'inicializar' puede aceptar cuatro argumentos como se
indica arriba. Entonces cuando el procedimiento es llamado se le deben
enviar cuatro parámetros del mismo tipo que espera el procedimiento.
Esto es lo que el comando de invocación puede verse así:
inicializar, núcleos, t, tau, dt
Procedimientos y funciones (5)
Digamos que deseo crear una función:
radius(x,y,z) = sqrt(x^2 + y^2 + z^2)
Comenzaría declarando ‘radius’ con la palabra function, y luego la lista de
parámetros esperados separados por comas. Luego podría definir la
función con una serie de comandos. Antes de terminar la función con el
comando end, es necesario devolver el argumento de salida de las
funciones usando el comando return.
Procedimientos y funciones (4)
 Tenga en cuenta que los nombres de las variables que se pasan no tienen
que ser las mismas que las del procedimiento, pero pueden serlo.
 Después que la primera línea define el nombre y los parámetros de
entrada del procedimiento, sigue el resto como comandos IDL normales.
Puede invocar bucles de comandos y otros procedimientos. Con
precaución puede incluso invocar el mismo procedimiento desde dentro
de sí mismo, lo que se llama recursividad. Todos los procedimientos
deben terminar con el comando fin.
 Las funciones son como procedimientos excepto que devuelven un
argumento y aceptan su entrada parámetros entre paréntesis en lugar de
separarlos por comas.
Procedimientos y funciones (6)
Luego, en el código IDL podríamos invocar esta función escribiendo:.
x1 = 5.76
x2 = 4.2
x3 = 8.0
hypotenuse = radius(x1,x2,x3)
print, hypotenuse
function radius,x,y,z
r = sqrt(x^2 + y^2 + z^2)
return, r
end
6
9/22/2023
Procedimientos y funciones (7)
Funciones Matemáticas
 En los procedimientos de IDL, las variables y las matrices se pasan por
referencia cuando se especifican como parámetros para el
procedimiento. Esto significa que si modifica el valor de los parámetros
dentro del procedimiento, la alteración se trasladará también al
procedimiento de llamada.
 Tenga esto en cuenta, ya que puede ser la fuente de molestos errores de
programación, que a menudo son muy difíciles de rastrear.
 Una importante excepción a esta regla es el uso de elementos de
estructuras o arreglos. Los elementos de la matriz siempre serán pasados
por valor, lo que significa que si usa un elemento de matriz como
parámetro de una función o procedimiento, la estructura puede ser
usada pero no cambiarse el valor de ese parámetro. Un ejemplo de esto
es leer entrada desde el teclado a una matriz.
Además de los operadores básicos, IDL ha implementado numerosas
funciones matemáticas.
Para obtener una lista completa, invoque la ayuda de IDL desde la barra de
menú, seleccione contenido y luego índice. Escriba mathematics, seleccione
‘Alphabetical list of Mathematics Routines' y pulsar display. Verá una lista
que es similar pero más larga que esta.
En los siguientes ejemplos, 'a' es una matriz [1,3,5,2,4]
Funciones Matemáticas (2)
ABS Absolute Value abs(-6)=6
ACOS Inverse Cosine (in radians) acos(0)= 1.57080
ALOG Natural Log ( ln(x) ) alog(2.71828) = 1
ALOG10 Log Base 10 alog(100)=2
ASIN Inverse Sine (in radians) asin(1)= 1.57080
ATAN Inverse Tangent (in radians) atan(1)= 0.785398
Funciones Matemáticas (3)
COS Cosine (argument in radians) cos(1.57080)=0
ROUND Rounds a Number round(2.7) = 3
COSH Hyperbolic Cosine cosh(.5) = 1.12763
SIN Sine (argument in radians) sin(1.57080)=1
EXP Natural Exponent ( e ) exp(1)= 2.71828
FACTORIAL Factorial ( ! ) factorial(4) = 24
SINH Hyperbolic Sine sinh(1.5) = 2.12928
FIX Truncates Decimal to Integer fix(3.8) = 3
SQRT Square Root sqrt(16) = 4
FLOAT Changes Integer to Decimal float(3) = 3.000
TAN Tangent (argument in radians) tan(0.785398)=1
MAX Maximum Value of an Array max(a) = 5
TANH Hyperbolic Tangent tanh(1.5)= 0.905148
TOTAL Sum of Matrix Operations see IDL help on TOTAL
MEAN The Mean of an Array mean(a) = 3
MIN Minimum Value of an Array min(a) = 1
!PI System Constant for pi !PI = 3.141593
PRIMES Computes First n Prime #’s primes(5)= 2,3,5,7,11
RANDOMU Generates a Uniformly Distributed Random # Between 0 and 1
randomu(1) = .04234
RANDOMN Generates a Normally Distributed Random #
7
9/22/2023
Declaraciones de comando
Hay cuatro declaraciones que se pueden usar para ejecutar o crear un bucle
a través de un bloque de instrucciones hasta que se cumpla una condición
especificada.
Estas declaraciones son FOR, IF, REPEAT, WHILE.
Declaraciones de comando (2)
i es el contador. 1,4 son los valores inicial y final de i. do es el encabezado
de los comandos a ser ejecutados. print muestra el contador i e i2. El bucle
se ejecuta con i = 1,2,3,4 y luego termina
Si desea que el bucle cuente hasta un número mayor que 32000, es
necesario especificar que i es long integer. Esto se puede hacer
especificando los límites como números enteros largos. Por ejemplo, lo
anterior podría ser escrito:
for i = 1L,50000 do print, i, i^2 . No se recomienda ejecutar esto porque
toma mucho tiempo! La 'L' después del 1 en los límites del contador le dice
a IDL que i es un número entero largo.
Si desea que el ciclo ejecute un bloque de instrucciones, entonces en lugar
de escribir comando do, debe comenzar un bloque que se repetirá
escribiendo 'do begin'.
Luego terminará el bloque con una declaración 'end' o 'endfor'. Cualquiera
de los dos funcionará, aunque al final endfor por estilo.
Declaraciones de comando (2)
Declaraciones de comando (3)
FOR-DO
El bucle FOR repite su bloque de instrucciones e incrementa su contador en
uno cada vez que se ejecuta el bucle.
for i = 1,4 do print, i, i^2 generará
1 1 2 4 3 9 4 16
Por ejemplo:
for i = 0, 98 do begin
nuclei[i+1]=nuclei[i]-(nuclei[i]*(dt/tau))
t[i+1]=t[i]+dt
endfor
for i = 4,1,-1 do print, i, i^2 generará
4 16 3 9 2 4 1 1
Esta vez el ciclo se ejecuta con i = 4,3,2,1 y luego termina. El tercer
argumento (-1) especifica que el incremento sea -1
Repetirá 99 veces y calculará (método de Euler) la desintegración radiactiva
de los "núcleos" hasta 99 pasos de tiempo.
Si se tiene cuidado, también puede usar contadores flotantes (decimales).
Pero esto no es recomendable.
También es posible especificar que el incremento sea un número distinto de
uno. El siguiente código se ejecuta en reversa:
8
9/22/2023
Declaraciones de comando (5)
IF-THEN statement
La declaración IF se usa junto con los operadores lógicos para ejecutar solo
un comando o un bloque de comandos cuando una determinada condición
es VERDADERA. Por ejemplo:
if a eq 1 then print, ‘ a equals one’
También puede proporcionar alternativas con el comando ELSE
if a eq 1 then print, ‘ a equals one’ else print, ‘ a is not one’
Puede usar bloques con declaraciones IF. Después de THEN ponga BEGIN.
Esto inicia el bloque de comandos .Termina el bloque con END o ENDIF.
Nuevamente preferimos el ENDIF por razones de estilo.
Las declaraciones IF pueden hacer que el código se ejecute muy
lentamente. A menudo querrá evitarlos y usar más métodos eficientes
Declaraciones de comando (7)
Declaraciones de comando (6)
Considere el siguiente código:
print, 'La computadora quiere saber el producto de 3 por 2'
read,i
if (i ne 6) then begin
print, ' Respondiste un numero diferente a 6'
print, ' Estamos decepcionados '
endif else begin
print, ‘Seleccionaste el numero 6'
print, ‘bien hecho!!'
endelse
Declaraciones de comando (8)
REPEAT bucle
Considere el siguiente código:
El bucle REPEAT repetirá un comando o un bloque de comandos hasta que
se cumpla una condición para detener el círculo. La sintaxis es REPEATComando-UNTIL (condición). Un ejemplo sería:
a = 1
b = 1000
repeat begin
a = 2*a
print, 'El valor de a vale',a
endrep until a gt b
a = 1
b = 10
repeat a = a * 2 until a gt b
Al igual que con todos los otros bucles de control, un bloque de
comandos puede sustituirse por el único comando insertando un BEGIN
después de REPEAT y un ENDREP al final del bloque seguido por UNTIL
(condición).
Al igual que con todos los otros bucles de control, un bloque de
comandos puede sustituirse por el único comando insertando un BEGIN
después de REPEAT y un ENDREP al final del bloque seguido por UNTIL
(condición).
9
9/22/2023
Declaraciones de comando (9)
Declaraciones de comando (9)
WHILE bucle
WHILE bucle
El bucle WHILE es como el bucle REPEAT excepto que analiza la condición de
ejecución antes de ejecutar el comando o bloque de comandos que
controla.
Aquí un ejemplo que repite un cálculo hasta que la diferencia en el resultado
de los cálculos actuales y anteriores sea inferior a un error permitido. Esta es
una buena manera de probar la convergencia en su método numérico.
a = 1
b = 1000
WHILE (a LT b) DO BEGIN
a = 2*a
PRINT, 'El valor de a vale',a
ENDWHILE
while (delta_result ge err) do begin
old_result = new_result
new_result = somefunction(old_result)
delta_result = new_result - old_result
endwhile
Arreglos
• Los arreglos son listas de números con índices enteros.
• En física computacional, a menudo se desea calcular una lista de números
que representan alguna cantidad en varios intervalos de tiempo. Una
matriz es perfectamente adecuado para esto.
• Hay tantos tipos de arreglos como variables. Se puede crear un matriz de
enteros o caracteres o números de coma flotante o variables booleanas.
Para crear una matriz (o vector) unidimensional de números flotantes, escriba:
nuclei = fltarr(100).Esto crea una lista de 100 números indexados del 0
al 99.
Un arreglo tri-dimensional se puede crear así:
V3D = fltarr(10,7,5).
Arreglos (2)
Este sería un tensor de 10x7x5 indexado desde (0-9,0-6,0-4). Para poner
información en una matriz, se debe establecer la matriz con el índice
apropiado para ese valor. Por ejemplo:
nuclei[7] = 6.8
nuclei[i+1] = nuclei[i] + c
nuclei = nuclei * 0
nuclei[*] = 0
 Estas últimas líneas establecen todos los elementos de 'nuclei' en cero.
 Para crear una matriz de enteros, el comando es intarr(dim). Se usa
igual que el comando fltarr explicado anteriormente.
 Para crear una matriz de enteros largos, use lonarr(dim).
 El comando dblarr(dim) crea una matriz de números flotantes de doble
precisión.
10
9/22/2023
Arreglos (3)
Arreglos (4)
 El comando strarr(dim) crea una matriz de strings.
 Todos estos comandos establecen los elementos de las matrices creadas
en cero de forma predeterminada.
 A veces no querrá que los elementos de su matriz sean cero.
 El comando indgen(dim) crea una matriz de las dimensiones
especificadas, con cada elemento establecido en el mismo número que su
índice correspondiente.
 También es útil poder determinar el tamaño de una matriz, especialmente
si desea acceder a cada elemento sin exceder los límites de la matriz.
 El comando N_ELEMENTS devolverá el tamaño de una matriz especificada.
for i = 0, (n_elements(t)-1) do begin
.
endfor
Este código se repetirá exactamente tantas veces como elementos haya en 't'.
Para definir un arreglo se puede:
M = INTARR(3,4)
M = MAKE_ARRAY(3, 4, /INTEGER, VALUE = 5)
M = INDGEN(3,4)
Secciones de Arrays (5)
1
Función WHERE
4
idx = WHERE( A EQ 2, nc )
A = indgen(6,6)
0
1
2
3
4
5
0
0
6
12
18
24
30
1
1
7
13
19
25
31
2
2
8
14
20
26
32
3
3
9
15
21
27
33
4
4
10
16
22
28
34
5
5
11
17
23
29
35
A[0:2,0:2]
2
A[[1,3,5,1,3,5,1,3,5],[0,0,0,2,2,2,4,4,4]]
3
0
1
2
3
4
5
0
2
6
12
18
2
30
1
1
7
13
2
25
31
2
2
8
14
20
26
2
3
3
9
15
21
27
2
4
4
2
16
2
28
34
5
5
11
17
23
2
35
Result = WHERE( Array_Expression [, Count] [, COMPLEMENT=variable] [, NCOMPLEMENT=variable] )
A[4,1:4]
A[[0,2,4],1:4]
11
9/22/2023
VARIABLES Y CONSTANTES ALFANUMERICAS
ASCII (American Standard Code for Information Interchange)
• Las variables y constantes alfanuméricas constan de texto y caracteres
especiales.
• Los valores se asignan a una variable o constante alfanumérica encerrando
el texto entre comillas simples o dobles.
• ASCII es una forma de representar caracteres de texto mediante números.
Si su texto necesita incluir comillas, repita las comillas dentro de la cadena
o use otro tipo de comillas para definir su cadena.
Ejemplo:
“Alex’s text”
• Es posible que no todos los caracteres ASCII disponibles se impriman en la
pantalla. Depende de qué tipo de letra utilice su sistema.
• Las variables alfanuméricas pueden tener hasta 32.767 caracteres de
longitud
Funciones para operar con variables alfanuméricas
• Puede convertir un carácter de cadena a su valor ASCII usando el carácter
como argumento para la función BYTE.
print, string(102b) => “f”
print, string(102) => “102”
print, byte(“f”) => 102
Funciones para operar con variables alfanuméricas
Funciones
Funciones
strcompress()
• Puede asignar caracteres ASCII a una cadena IDL utilizando la función
string() y utilizando el código ASCII en formato byte como argumento.
Elimina o comprime los espacios en blanco.
La palabra clave /remove_all elimina todos los espacios en blanco.
Sin la palabra clave /remove_all , todos los espacios en blanco se comprimen en un solo
espacio.
Ejemplo: a = “
String with
whitespace
” strcompress(a) => “
String with whitespace ” strcompress(a, /remove_all) =>
“Stringwithwhitespace”
•
•
•
Elimina los espacios en blanco iniciales, los espacios en blanco finales o ambos, según el
carácter de bandera opcional.
A diferencia de strcompress, que elimina o comprime todos los espacios en blanco
strtrim()
•
strcmp()
• Compara dos cadenas para ver si son equivalentes.
• Devuelve un valor BYTE de 1 si es verdadero y un valor BYTE de 0 si es falso.
• Se puede utilizar para comparar cadenas completas o solo los primeros ncaracteres de las
cadenas.
• La palabra clave opcional /FOLD_CASE se puede utilizar para comparaciones que no distinguen
entre mayúsculas y minúsculas..
•
strlowcase()/
strupcase()
Convierte el contenido de una cadena a minúsculas o mayúsculas, respectivamente.
Example: a = “hi”; b = “Hi”; c = “Hilo”
strlowcase(b) => “hi”
strupcase(c) => “HILO”
strmatch()
strmid()
strpos
strput()
strlen()
strsplit
•
Esta función puede comparar dos cadenas usando comodines
•
Devuelve una subcadena de una cadena, especificando el primer carácter y la longitud de la
subcadena que se va a xtraer.
•
Devuelve la posición de la primera aparición de una cadena de búsqueda dentro de una cadena
de destino
•
Inserta caracteres en una cadena existente
•
Devuelve la longitud de la cadena
•
Divide una cadena según un delimitador determinado
Ejemplo: a = “hi”; b = “Hi”; c = “Hilo”
strcmp(a, b) => 0
strcmp(a, b, /FOLD_CASE) => 1 strcmp(a, c) => 0
strcmp(b, c, 2) => 1
12
9/22/2023
Entrada/salida (I/O) y archivos
En física computacional, diseñamos código que toma ciertos argumentos y
genera resultados. Esto requiere entradas y salidas. La entrada puede ser
desde el teclado o desde un archivo.
Las salida pueden ser resultados impresos en la pantalla, datos guardados en
un archivo o dibujados en un dispositivo.
Primero repasaremos la E/S del teclado.
El comando PRINT se utiliza para enviar la salida al registro de salida (la
ventana de texto cerca de la parte inferior de la interfaz IDLDE).
Por ejemplo, si escribimos
PRINT, ‘hola mundo’ en la línea de comando veremos ‘hola mundo’ en
el registro de salida.
Entrada/salida (I/O) y archivos (3)
 El comando PRINT envía el mensaje al registro de salida especificando qué
información se requiere del usuario, y el comando de lectura toma la
siguiente entrada del teclado y la almacena en la variable tau.
 A menudo, es preferible leer la entrada de un archivo y guardar la salida
de una simulación en otro archivo para análisis mas extenso.
 Antes de que se pueda realizar cualquier entrada o salida de archivos, es
necesario abrir un archivo.
 Esto se hace usando ya sea OPENR (abrir un archivo existente solo para
lectura), OPENW (abrir y crear un archivo vacío para escribir) u OPENU (abrir
un archivo existente para actualizar).
 Cuando se abre un archivo, éste es asociado con un número de unidad
lógica o LUN (Logical Unit Number).
Entrada/salida (I/O) y archivos (2)
• PRINT también puede ser usado para desplegar variables y comandos.
• Si x=2.5, el comando PRINT, x produciría la salida '2.5' en el registro
de salida.
• El comando PRINT, alog(x)
• producirá la salida 0.916291.
• Puede dar al comando PRINT varios argumentos separados por comas.
Esto generará múltiples salidas en la misma línea.
El comando READ se usa para tomar entradas desde el teclado. Es útil usar el
comando PRINT para solicitar entrada y el comando READ para recibir la
entrada. Por ejemplo, el siguiente código:
print, "Time Constant (tau):"
read, tau
Entrada/salida (I/O) y archivos (4)
 Todas las rutinas de entrada y salida de archivos en IDL usan el LUN en
lugar del nombre de archivo, y la mayoría requiere que el LUN se
especifique explícitamente.
 No use -2, -1 o 0 como LUN ya que están reservados por el sistema.
 Una vez que el archivo se abre correctamente, hay varios comandos para
leer y escribir datos.
 El comando PRINTF funciona como imprimir, excepto que dirige su salida
al archivo especificado por el LUN.
 También hay un comando READF que leerá datos de un archivo específico,
de la misma manera que READ tomará la entrada del teclado.
13
9/22/2023
Entrada/salida (I/O) y archivos (5)
Aquí hay un programa de ejemplo:
OPENW, 1, 'hello.dat' ;Abre LUN 1 para hello.dat para escribir.
PRINTF, 1, 'Hello World.' ;Escribe en el archivo.
CLOSE, 1 ;Cierra el archivo.
OPENR, 1, 'hello.dat' ;Reabre el archivo.
READF, 1, message ;Lee el string
PRINT, message ; Imprime al Output Log.
CLOSE, 1 ; Cierra el archivo.
Entrada/salida (I/O) y archivos (6)
FORMATOS estilo FORTRAN
La sintaxis de los formatos es: [n]FC[+][-][width]
n
es un recuento de repeticiones opcional (1 ≤ n) que especifica el número de veces que se debe
procesar el código de formato. Si no se especifica n, se utiliza un recuento repetido de uno.
FC
es el código de formato. Consulte Códigos de formato disponibles a continuación.
+
es un indicador opcional que especifica que los números positivos deben generarse con un prefijo “+”. El
indicador “+” solo es válido para códigos de formato numérico. Normalmente, los números negativos se
generan con un prefijo “-” y los números positivos no tienen prefijo de signo. Los códigos numéricos no
decimales (B, O y Z) permiten la especificación del indicador “+”, pero lo ignoran.
-
es una bandera opcional que especifica que los valores numéricos o de cadena deben generarse con el
texto justificado a la izquierda. Normalmente, la salida está justificada a la derecha.
width
es una especificación de ancho opcional. Las especificaciones de ancho y los valores predeterminados
son específicos del código de formato y se describen en detalle junto con el código de formato.
Entrada/salida (I/O) y archivos (7)
Formato de relleno y ancho natural
El valor al que se le da formato puede ser más corto que el ancho de salida especificado
por el parámetro de ancho. Cuando esto sucede, IDL ajustará el contenido del valor de
salida o el ancho del campo, utilizando los siguientes mecanismos:
Entrada/salida (I/O) y archivos (8)
Relleno cero
Para códigos de formato numérico, si el primer dígito del parámetro de ancho es cero, IDL
rellenará el valor con ceros en lugar de espacios en blanco. Por ejemplo:
PRINT, FORMATO='(I08)', 300
produce el siguiente resultado:
Relleno de espacios en blanco
De forma predeterminada, si el valor al que se le da formato utiliza menos caracteres de
los especificados por el parámetro de ancho, IDL rellena el valor con espacios en blanco a
la izquierda para crear una cadena del ancho especificado.
Por ejemplo, la siguiente declaración IDL
PRINT, FORMATO='(I12)', 300
produce el siguiente resultado:
bbbbbbbbb300
donde b representa un carácter de espacio.
00000300
Al rellenar valores con ceros, tenga en cuenta lo siguiente: Si especifica el indicador "-"
para justificar a la izquierda la salida, especificar un cero a la izquierda en el parámetro de
ancho no tiene ningún efecto, ya que no hay espacios no utilizados a la izquierda del valor
de salida.
Si especifica un valor de ancho mínimo explícito (a través del parámetro de ancho m) para
un código de formato entero, especificar un cero a la izquierda en el parámetro de ancho
no tiene ningún efecto, ya que el valor de salida ya está rellenado con ceros a la izquierda
para crear un valor de salida. del ancho mínimo especificado.
14
9/22/2023
Entrada/salida (I/O) y archivos (8)
Entrada/salida (I/O) y archivos (9)
Formato de ancho natural
Si se especifica el número cero para el parámetro de ancho, IDL utiliza el ancho "natural"
para el valor. El valor se lee o se genera utilizando un formato predeterminado sin
espacios en blanco al principio o al final, al estilo de la función printf() de la biblioteca C
estándar.
Usar un valor de cero para el parámetro de ancho es útil al leer tablas de datos en las que
los elementos individuales pueden tener diferentes longitudes. Por ejemplo, si sus datos
residen en tablas del siguiente formulario:
Códigos Disponibles
26.01 92.555 344.2
Quoted String and H Format Codes Valores de cadena de salida directamente
101.0 6.123 99.845
23.723 200.02 141.93
T Format Code
Especifica la posición absoluta dentro de un registro.
TL Format Code
Mueve la posición con un registro hacia la izquierda.
Establecer el formato en:
TR and X Format Codes
Mover la posición dentro de un registro hacia la derecha
FORMAT = '(3F0)'
C() Format Code
Transfiere datos del calendario
garantiza que se lea o emita el número correcto de dígitos para cada elemento.
Código
Descripción
A Format Code
Transfiere caracteres alfanuméricos
: Format Code
Termina el proceso
$ Format Code
Suprime nuevas líneas en la salida
F, D, E, and G Format Codes
Transfiere valores de punto flotante
B, I, O, and Z Format Codes
Transfiere valores enteros
Q Format Code
Devuelve el número de caracteres que quedan por transferir durante una
operación de lectura
https://www.irya.unam.mx/computo/sites/manuales/IDL/Content/Creating%20IDL%20Programs/Components%20of%20the%20IDL%20Language/Format_Codes.html
Entrada/salida (I/O) y archivos (10)
Aquí hay un programa de ejemplo:
OPENR, unit, nombre_archivo, ERROR=error, /GET_LUN
IF error EQ 0 THEN BEGIN
; leemos los datos
PRINT, 'Encontre los datos'
encabezado = ''
lista = STRARR(4,24)
READF, unit, encabezado
READF, unit, lista, FORMAT='(A15,2X,F10.2,I5)'
FREE_LUN, unit
ENDIF ELSE BEGIN
PRINT, 'No puedo encontrar el archivo: ', nombre_archivo
ENDELSE
Entrada/salida (I/O) y archivos (11)
For example, the IDL statement,
PRINT, FORMAT = '(A6)', '123456789'
generates the following output:
123456
: Format Code
Available Format Codes
The colon format code terminates format processing if there are no more data
remaining in the argument list.
The syntax is:
:
For example, the IDL statement,
PRINT, FORMAT = '(6(I1, :, ", "))', INDGEN(6)
will output the following comma-separated list of integer values:
0, 1, 2, 3, 4, 5
The use of the colon format code prevented a comma from being output following the
final item in the argument list.
15
9/22/2023
Entrada/salida (I/O) y archivos (12)
$ Format Code
Available Format Codes
When IDL completes output format processing, it normally outputs a
newline to terminate the output operation. However, if a “$” format code
is found in the format specification, this default newline is not output.
The “$” format code is only used on output; it is ignored during input
formatting.
The syntax is:
$
One use for the “$” format code is in prompting for user input in
programs that run in a tty rather than in the graphical IDL Workbench.
For example, the following simple program show the difference between
strings formatted with and without the “$” format code. The first PRINT
statement prompts the user for input without forcing the user’s response
to appear on a separate line from the prompt; the second PRINT statement
makes the user enter the response on a separate line.
Entrada/salida (I/O) y archivos (13)
IDL> .run
PRO format_test
name=''
age=0
PRINT, FORMAT='($, "Enter name")'
READ, name
PRINT, FORMAT='("Enter age")'
READ, age
PRINT, FORMAT='("You are ", I0, " years old, ", A0)', age, name
END
% Compiled module: FORMAT_TEST.
Running the procedure looks like this:
IDL> format_test
Enter name: Pat
Enter age
: 29
You are 29 years old, Pat
IDL>
Entrada/salida (I/O) y archivos (14)
F, D, E, and G Format Codes
Available Format Codes
The F, D, E, and G format codes are used to transfer floating-point
values between memory and the specified file.
The syntax is:
[n]F[+][-][w][.d]
[n]D[+][-][w][.d]
[n]E[+][-][w][.d][Ee]
[n]G[+][-][w][.d][Ee]
where the parameters “n”, “+”, and “-” are as described in Syntax of
Format Codes and the width specification is as follows:
w
is an optional width specification (0 ≤ w ≤ 255). The variable w
specifies the number of digits to be transferred. See Padding and Natural
Width Formatting for additional details on the output width of a
formatted value.
Entrada/salida (I/O) y archivos (15)
d
is an optional width specification (1 ≤ d < w). For the F, D, and E
format codes, d specifies the number of positions after the decimal
point. For the G format code, d specifies the number of significant
digits displayed.
e
is an optional width (1 ≤ e ≤ 255) specifying the width of exponent part
of the field. IDL ignores this value—it is allowed for compatibility with
FORTRAN.
On input, the F, D, E, and G format codes all transfer w characters from
the external field and assign them as a real value to the corresponding
input/output argument list datum.
16
9/22/2023
Entrada/salida (I/O) y archivos (16)
The F and D format codes are used to output values using fixed-point
notation. The value is rounded to d decimal positions and right-justified
into an external field that is w characters wide. The value of w must be
large enough to include a minus sign when necessary, at least one digit
to the left of the decimal point, the decimal point, and d digits to the
right of the decimal point. The code D is identical to F (except for its
default values for w and d) and exists in IDL primarily for compatibility
with FORTRAN.
The E format code is used for scientific (exponential) notation. The
value is rounded to d decimal positions and right-justified into an
external field that is w characters wide. The value of w must be large
enough to include a minus sign when necessary, at least one digit to the
left of the decimal point, the decimal point, d digits to the right of
the decimal point, a plus or minus sign for the exponent, the character
“e” or “E”, and at least two characters for the exponent.
Entrada/salida (I/O) y archivos (17)
The G format code uses the F output style when reasonable and E for other
values, but displays exactly d significant digits rather than d digits
following the decimal point.
Overflow
On output, if the field provided is not wide enough, it is filled with
asterisks (*) to indicate the overflow condition.
Default Values of the w, d, and e Parameters
If w, d, or e are omitted, the values specified in the following table
are used.
Note: IDL uses the standard C library function snprintf() to format numbers and
their exponents. As a result, different platforms may print different numbers of
exponent digits.
Entrada/salida (I/O) y archivos (10)
If w, d, or e are omitted, the values specified in the following table
are used.
Entrada/salida (I/O) y archivos (10)
If w, d, or e are omitted, the values specified in the following table
are used.
Floating Format Defaults
Floating-Point Output Examples (“b” represents a blank space)
Format
Internal Value
Format Code Examples
The following table shows the results of the application of various
format codes to given data values. Note that normally, the case of the
format code is ignored by IDL. However, the case of the E and G format
codes determines the case used to output the exponent in scientific
notation.
Formatted Output
Floating-Point Output Examples (“b” represents a blank space)
bbbb100.0000000
F
100.0
17
9/22/2023
Gráficos y dispositivos
Gráficos y dispositivos (2)
• Los problemas que resolvemos en Física Computacional rara vez son
aquellos en los que simplemente obtienes "una respuesta".
• A veces se dará el caso que nuestro programa se ejecutará a través de sus
algoritmos y al final generará un número que es 'la respuesta'.
• Sin embargo, más a menudo, generaremos muchos números y
desearemos verlos en alguna relación entre sí. Estos problemas se
adaptan naturalmente a interpretación gráfica.
• Una de las mayores fortalezas de IDL como lenguaje de programación es la
facilidad con la que puede mostrar datos en una amplia variedad de
representaciones gráficas.
• Por razones prácticas solo se explicará un diagrama x-y simple, con
referencias posteriores para estudio adicional.
Ya sea que IDL opere en el entorno de Microsoft Windows o Unix-X, IDL utiliza
' ventanas' para su salida gráfica. Puede haber varias ventanas abiertas
simultáneamente. A las ventanas se le asignan números.
Se puede asignar y acceder a estas ventanas de la siguiente manera:
window, 0 ;abre la ventana #0
wset, 0 ;hace la ventana #0 la ventana seleccionada
Si no especifica una ventana, IDL abrirá automáticamente una cuando
invoque un comando gráfico como PLOT.
PLOT es una rutina de gráficos IDL que trazará dos matrices de tamaño similar
entre sí. El formato para graficar x versus y es:
plot, x, y ;donde x ^ y son arreglos 1-D de la misma dimensión.
Gráficos y dispositivos (3)
Esta es el comando gráfico más básico que se puede escribir. IDL debería
escalar automáticamente la figura para que todos sus puntos de datos
quepen dentro de la ventana especificada.
Hay muchos parámetros adicionales que pueden especificarse en PLOT. Estos
incluyen: title, xtitle, ytitle, xrange, yrange, psym y color.
PERSONAS
Codigo Nombre
Ciudad
001
Velarde Juan
LP
002
Moreno Amparo
EA
003
Ticona Jose
EA
004
Gutierrez Andres
LP
005
Mamani Carla
LP
006
Conde Luis
EA
007
Santana Virginia
LP
PAGOS
Codigo Mes Monto Cod_Per
P001
Ene
90.53
001
P002
Feb
38.99
001
P003
Ene
13.11
002
P004
Ene
24.46
007
P005
Ene
5.06
004
P006
Feb
23.65
004
P007
Mar
70.72
004
P008
Ene
34.61
003
P009
Ene
94.38
005
P010
Ene
7.13
006
P011
Feb
61.65
002
P012
Mar
36.38
002
P013
Mar
66.55
001
P014
Feb
74.53
003
P015
Feb
53.89
005
P016
Feb
93.90
007
P017
Feb
35.14
006
P018
Mar
42.95
007
P019
Mar
33.01
006
P020
Mar
43.39
005
P021
Mar
24.47
003
Preguntas:
¿Cuánto se pagó por:
 Cliente
 Mes
 Ciudad
 Mes y por ciudad
18
9/22/2023
x
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
y
-15.42
21.64
-9.65
6.35
2.58
25.95
30.88
21.69
41.6
51.54
44.82
68.73
69.43
59.66
76.31
68.31
74.15
93.21
104.19
89.87
Ajuste de curvas (aproximaciones)
Ajuste de curvas (aproximaciones)
y
y = 5.6536x - 13.071
120
s =
100
y −y
=
80
+
60
y
40
Linear ( y)
20
0
0
5
10
15
20
25
-20
-40
19
Download