Todos como hijo de la tierra estamos destinados a protegerla. valora cada espacio en el que habitats, siembra conciencia en los demas y haz parte del cambio.
Continuando con matrices, la
importancia de esta forma matemática de representar objeto, cosas, variables es
muy amplio que si nos pusiéramos a profundizar sobre el tema tocaría escribir
un sinnúmero de artículos más, pero lo
que haremos es dar una breve información. La teoría matriz es ampliamente
utilizada en la informática. Las bibliotecas gráficas como por ejemplo OpenGL
se valen de transformaciones espaciales y de las matrices para representar
gráficos 3D a 2D que luego se traducen a imagen en los monitores.
También son muy útiles para
agilizar algunas operaciones algebraicas que de otro modo serían tediosas de
resolver de otro modo. Por ejemplo, calcular el valor n-ésimo (para un n muy
grande) de la serie de fibonacci es impráctico por algoritmos recursivos, e
iterativos. Lo mejor es optar por algoritmos basados en el principio divide y
vencerás y en las matrices.
Los sistemas de detección de
rostros no podrían concebirse sin el aporte de las transformaciones espaciales,
vectoriales y de las matrices. En la
programación lineal se emplea ampliamente los sistemas de ecuaciones e
inecuaciones. Estos, como ya he dicho se resuelven velozmente mediante
matrices.
En los videos juegos y sistemas
de simulación se emplean muchas veces para representar de forma abstracta
ciertas estructuras de datos que puedan representar algunas entidades del
dominio en estudio. Por ejemplo, se puede representar o concebir el mapa de un
terreno de un juego como una matriz. Como es el caso del juego buscaminas que
se ha dado como ejemplo en clases de algoritmo para la temática de matrices.
Pero como no vamos a profundizar
en el tema, veremos como se utilizan técnicas en Matlab para resolver distintos
tipos de matrices; como sabemos Matlab está fundamentalmente orientado al trabajo
y el cálculo matricial. Veremos que las operaciones están definidas para el
trabajo con este tipo de elementos.
Por ejemplo, el siguiente comando
define una matriz A de dimensión (3x3):
>> A=[1 2 3; 4 5 6; 7 8 9]
La respuesta del programa es:
1 2 3
4 5 6
7 8 9
Podemos hacer las operaciones, suma
(+), resta (-), multiplicación (*), producto punto (.*), exponencial (^), división
(/) (\), inversa (‘).
inv(A) da como resultado la
matriz inversa de A.
det(A) da como resultado el
determinante de A.
trace(A) da como resultado
la traza de A.
rank(A) da el rango de A
eye(n) forma la matriz
identidad de tamaño (nxn)
zeros(m,n) forma una matriz
de ceros de tamaño (mxn)
zeros(n) forma una matriz
de ceros de tamaño (nxn)
ones(n) forma una matriz de
unos de tamaño (nxn)
ones(m,n) forma una matriz
de unos de tamaño (mxn)
rand: este comando genera
números pseudoaleatorios distribuidos uniformemente entre 0 y 1. Cada llamada
proporciona un nuevo número.
rand(n): genera una matriz
de números pseudoaleatorios entre 0 y 1, con distribución uniforme, de tamaño
nxn.
rand(m,n): igual que en el caso anterior pero de tamaño
mxn.
El operador (:) es de gran importancia en Matlab. Puede decirse que
es un operador que respeta el rango. Veamos su utilidad con algunos ejemplos:
>> x=1:10
x =
1 2
3 4 5
6 7 8
9 10
>> x=[0:2:10]
x = 0 2
4 6 8
10
A continuación veamos cómo
podemos mostrar los elementos de T en el orden en que es almacenado. En primer lugar,
asignemos un valor a T:
T=rand(4,2,3);
En el vector columna
correspondiente, los elementos vienen dados en el orden en que son almacenados
por:
for p=1:3
for n=1:2
for m=1:4
disp(T(m,n,p));
end
end
end
Para obtener ayuda acerca de
estas funciones, en la ventana de MatLab escribe help sub2indo help ind2sub.
Para obtener ayuda mas detallada, escribe doc sub2ind o doc ind2sub.
Ejemplo
Escriba una matriz que de los
puntos intercalados dentro de la matriz como se realiza en una tabla de ajedrez.
Como ya sea definido los arreglos
es decir los vectores, en este escrito se enfatizara en las matrices que son
unos de los temas más importantes en la programación, para una definición precisa
en la programación las matrices son un
conjunto de variables, también llamado bloque, del mismo tipo que el
considerado en matemática, y cuyo acceso se realiza por índices o líneas.
Una matriz puede almacenar
distintas variables del mismo tipo en una estructura de datos de matriz. Para
declarar una matriz hay que especificar
el tipo de sus elementos. Su manejo es igual que los vectores anteriormente
tratados, los valores de las variables se llaman elementos, de la misma forma
que en los arreglos y sus índices están compuestos por dos caracteres que
indican su posición. Para poder acceder a un elemento se debe poner su posición
compuesta de los dos índices.
Por ejemplo para la matriz A y la
posición en la fila 1 y columna 2 se debe poner A[1][2], denotándose que el
primer índice indica la posición de la fila y el segundo la posición de la
columna.
Para acceder a todos los
componentes de una matriz solo basta con utilizar una variable que sirva como
índice sobre las filas cuyo valor cambie entre 1 y el número total de filas, y
usar una variable que sirva como índice de las comunas, cuyo valor cambie entre
1 el número de columnas. Para esto nos valemos dos ciclos para anidados
5 3 1
4 4 2
3 5 5
for fila=1:3
for columna =1:3
notas(fila,
columna)=input(‘Ingrese dato: ’);
end
end
Ejemplo
La universidad de Antioquia desea
controlar los resultados de los alumnos en las distintas asignaturas de la
facultad de Ingeniería. El programa debe ingresar las calificaciones de los
alumnos y visualizar en pantalla la media de notas por alumno y la media de
notas por asignatura. Las asignaturas están codificadas de 1 a 6 y hay 30
alumnos.
Solución: debemos trabajar con una
tabla o matriz o arreglo bidimensional.
Suponga que quiero hacer la
siguiente operación entra las matrices a y b. Cabe aclarar que las matrices tienen
que ser de las mismas dimensiones, para este ejemplo se definieron dos matrices
de 2x2.
Código en Matlab
>> a=[2 .5;13];b=[21;.5 3]; %Declaración de las matrices.
>> a+b
ans =
4.00001.5000
1.50006.0000
Para una mejor profundización del tema chequéate el
siguiente video.
En el escrito anterior habíamos
definido que es un vector que es analógicamente es un arreglo en programación,
se continuara con otros conceptos de vectores, así como la definición de una
bandera y su función en una estructura, además se desarrollara algunas
aplicaciones de problemas en que se podrá evidenciar el uso de vectores como la
mejor alternativa para el desarrollo de los programas.
Lo habitual es que un vector tenga una
cantidad fija de memoria asignada, aunque dependiendo del tipo de vector y del
lenguaje de programación un vector podría tener una cantidad variable de datos
en el mismo programa. En este caso, se les denomina vectores dinámicos, en
oposición, a los vectores con una cantidad fija de memoria asignada se los
denomina vectores estáticos. El uso de vectores dinámicos requiere realizar una
apropiada gestión de memoria dinámica. Un uso incorrecto de los vectores
dinámicos, o mejor dicho, una mala gestión de la memoria dinámica, puede
conducir a una fuga de memoria. Al utilizar vectores dinámicos siempre habrá
que liberar la memoria utilizada cuando ésta ya no se vaya a seguir utilizando.
Habiendo definido los vectores de una
forma general, aunque existen libros que definen muchos tipos de vectores,
hasta el momento nos conformaremos con los conceptos que hemos visto, ya que en
todos los artículos hemos hablado de programación en una forma básica y en
paralelo con el lenguaje de programación de MATLAB.
Ahora bien. Cuando se diseñan
algoritmos que incluyen estructuras de control repetitivas, existen ciertas
variables que cumplen una función específica en cada iteración del ciclo; las
más comunes son: las variables contadoras, las variables acumuladoras y las
variables bandera.
¿Pero que es una Variables bandera?
¡Pues fácil! Una variable bandera es
utilizada dentro de la condición del ciclo, ya sea sin negar, negada o
conectada con una expresión booleana, ¿Cómo así booleana?, ¡pues fácil! En datos
lógicos que puede representar valores de lógica binaria. Para determinar cuándo un ciclo se sigue
iterando o cuando no. De esta manera una variable bandera debe ser de tipo
booleano.
Ejemplo. Realizar un programa que lea
una serie de números reales y los sume. El programa debe preguntar al usuario
cuando desea ingresar un siguiente dato y si el usuario responde que no desea
ingresar más datos el programa debe confirmar la respuesta. Si el usuario desea
continuar ingresando datos se debe seguir solicitando datos y si el usuario
confirma su deseo de salir, el programa debe mostrar la suma de los datos
leídos y terminar.
Especificación:
Donde,
datos es la colección de n números reales que el usuario ingresa hasta que
decide no continuar ingresando datos y sumaÎ R es la suma de dichos números.
Algoritmo
Solución
bandera:
booleano
suma:
real
dato:
real
c:
caracter
bandera
:= verdadero
suma
:= 0.0
mientras
(bandera) hacer
escriba(
“Ingrese un dato:” )
leer
(dato)
suma
:= suma + dato
escriba(
“Desea continuar ingresando datos (S/N):” )
lea(
c )
si
(c = ‘N’ | c = ‘n’) entonces
escriba(
“Realmente desea salir (S/N):” )
lea(
c )
si
(c = ‘S’ | c = ‘s’) entonces
bandera
:= falso
Fin
(si)
Fin
(si)
Fin_mientras
escriba(
“La suma es:”)
escriba(
suma )
Vale la pena recordar que una variable
del tipo booleano toma valores de verdad y por lo tanto, por sí sola es una
expresión lógica. Adicionalmente, la expresión lógica bandera = verdadero es
equivalente a la expresión lógica bandera.
A continuación vas a ver una serie de
aplicaciones donde se evidencia la utilización de vectores para dar solución a
cada problema.
Ejercicio
1
Escriba un algoritmo que muestre por
pantalla el contenido de un vector. Los valores de las componentes de vector se
introducen por teclado (hasta que introduzca el numero 0).
Algoritmo
Variables
Entero: i, num
Vector Entero: a
Inicio
i = 0
Escriba(“Introduzca un valor de una
componente del vector o 0
para
finalizar”)
Lea (num)
Mientras (num <> 0) hacer ¡Relleno el
vector con los valores
leídos
desde teclado
a[i] = num
i = i+1
Fin (Mientras)
i
= i - 1
Mientras
(i >= 0) hacer
Escriba a[i]
i = i-1
Fin (Mientras)
Fin
Ejercicio 2
Considere una encriptación de mensajes
muy antigua inventada por Isaac newton, la cual se basa en que a cada letra de
un mensaje se le asocia un número (el orden en el abecedario), luego se suma al
número de cada letra otro número la
clave y el resultado es una nueva letra, mira en el abecedario. Por ejemplo, el
mensaje “cruzad el rubicon”, se transformaría en “dsvabeUfmUsvcjdpo” si le sumo
el número clave 1 a cada letra (ya que la
primera letra del mensaje cifrado, la ‘d’, es la que va tras la ‘c’, etc.).
Note que la ch, ll, ñ no existen, y que después de la ‘z’ va la ‘a’. Además los
espacios en blanco se convierten en letras U
si la clave es 1, en V si es 2, etc.
Para ello, elabore en pseudocódigo un algoritmo que a partir de un texto
(cadena de caracteres leída por teclado)
imprima texto cifrado con la clave entera, también leída desde teclado. Pista:
Dentro del bucle que debe recorrer todas las letras del texto, use la siguiente
fórmula para encriptar:
Texto_encriptado[i] =(texto_original[i]-'a'+clave)%26+'a';
/*26 es el número de letras del alfabeto
ASCII*/
Algoritmo Encriptación
Constante
Entero: LetrasASCII, N ¡N es la longitud del
texto
Hasta el momento hemos visto una serie
de estructuras de control, por lo tanto vamos a partir de un concepto que
realmente implícitamente se ha trabajado
y continuaremos el enfoque a los vectores es decir empezaremos a aplicar las
distintas estructuras a estos algoritmos. Cuando se procesa un algoritmo con
muchos datos y le pedimos a este una información que se ha escrito hace un
tiempo y queremos que este lleve un
orden establecido internamente, pues esto se puede lograr con las estructuras
de arreglo, una estructura de este tipo es una manera de almacenar información
en un computador de manera que puedan ser usados de una manera eficiente. Una
selección cuidadosa de la estructura permitirá usar un algoritmo más eficiente.
Una estructura bien diseñada permitirá efectuar una variedad de operaciones,
usando un mínimo de tiempo de ejecución y espacio de memoria. Con una definición
más concisa de la estructura de arreglo es el área de memoria con una variedad
de posiciones y cada posiciones tiene un valor asociado (numero). El arreglo de
una dimensión se conoce como vector. Realmente los arreglos pueden ser de
muchas dimensiones, pero también de diferentes tipos así como se pueden hacer
diferentes operaciones con ellas, pero por ahora nos quedaremos con lo que hemos
definido.
En la siguiente figura se muestra
un arreglo de enteros con 10 elementos.
Como nuestra estructura va estar contenida
por vectores de diversas dimensiones, entonces definiremos que es un vector en
algoritmo, aun básicamente este cumple las misma funciones matemáticas que se
pueden hacer en operaciones de geometría vectorial y álgebra lineal, pero en la
programación se tiene una definición propia, es un arreglo, generalmente
asociados a los arreglos unidimensionales; Es una zona de almacenamiento
contiguo, que contiene una serie de elementos del mismo tipo y se distinguen
entre sí por un índice. En palabras más simples los vectores son arreglos.
Para acceder a todos los
componentes de un vector solo basta con utilizar una variable que sirva como
índice cuyo valor cambie entre 1 y el número total de elementos en el vector,
para esto nos valemos de un simple ciclo PARA
for i=1:4
disp( notas(i) )
end
A continuación se muestran
algunos ejemplos de algoritmos con vectores simples. Realice un programa que
genere un vector u, constituido por los números enteros pares del vector v,
donde v=1:1:50. Utilice la estructura for-end
v=1:1:50;
for i=2:2:50
u(i/2)=v(i);
end
disp('Los números pares son:')
disp(u').
Desarrolle un programa que sume
los números almacenados en un vector hasta que encuentre el número cero. Por
ejemplo, para el vector v=[1 4 3 0 5 1] el resultado será 1+4+3=8. Utilice la
estructura while-end
v=input('Ingrese los elementos del vector: ');
25
i=1;
suma=0;
n=length(v);
while v(i)~=0
suma=suma+v(i);
i=i+1;
if i==n+1;
break
end
end
Suma
Aclaración cuando se tiene subprogramas
como tipo void de funciones de debe
colocar function- para que matlab lo lea como un subprograma, además, functions
s=algo-operación(vector,n) donde (s=) le esta indicando a Matlab retorne(s).
si te interesa profundizar un poco mas pásate por el siguiente vídeo.
Continuando con los objetivos de
seguimiento de los anteriores escritos, se sigue con nuevos conceptos que
derivan de los anteriores tipo de algoritmos que se han dado a conocer hasta el
momento, si bien haciendo una analogía en la vida cotidiana hemos demostrado
que los problemas complejos se facilita
considerablemente si se dividen en problemas más pequeños (subproblemas). La solución
de estos subproblemas se realiza con sub algoritmos. El uso de subalgoritmos
permite al programador desarrollar programas de problemas complejos utilizando
un método decente introducido en los capítulos anteriores.
En una definición más clara los subalgoritmos
son unidades de programas o módulos que están diseñados para ejecutar alguna
tarea específica. Estas funciones y procedimientos se escriben solamente de una
vez, pero pueden ser referenciados en diferentes puntos de un programa, de modo
que se pueda evitar la duplicación innecesaria del código. Las unidades de
programa en estilo de programación modular son independientes; El programador
puede escribir cada módulo y verificarlo sin preocuparse de los detalles de
otros módulos. Esto facilita considerablemente la localización de un error
cuando se produce. Los programadores más desarrollados de este modo son
normalmente también más fáciles de comprender, ya que la estructura de cada unidad
de programa puede ser estudiada independientemente.
El objetivo del uso de
subalgoritmos es modularizar un algoritmo, es decir dividir al problema en subproblemas,
resolver el problema con un algoritmo y a los subproblemas con subalgoritmos.
De esta forma cuando resuelvo un problema me abstraigo de los pequeños detalles
que no hacen en sí al problema llamando a acciones (Subalgoritmos) que una vez
resuelto el problema principal tendré que solucionar.
La ventaja más importante de modularizar es que los
subprogramas se pueden reutilizar en el mismo algoritmo o en otros.
La clasificación de los sub programas se definen las
funciones y los void.
Funciones: Es una que toma una o más valores llamados
argumentos y produce un valor llamado resultado.
Ejemplo:
F(x)
=x/i+x*x
Para evaluar
f debemos darle un valor a x.
Las funciones requieren de una serie de pasos que la definen.
Consta de un inicio, seguido de la palabra (función) y del nombre del argumento
de la función después ira el cuerpo que es una serie de acciones cuya ejecución
hará que se asigne un valor al nombre de la función, esto determina el
resultado que ha de devolver al programa.
Ejemplo:
F(x,y)=x/1+x*x
Se define como :
Real función f(x)
Inicio
Devolver (x/(1+x*x))
Fin (función).
Void: son los subprogramas que solo ejecutan tareas y no
devuelven ningún valor