jueves, 17 de noviembre de 2011

CÓMO SE ALAMCENAN MATRICES EN MATLAB

I. Cómo se almacenan las matrices

MatLab almacena vectores y matrices, sin importar su dimensión, como vectores columna.
Por ejemplo, la siguiente matriz:
(2 7 4)
(5 8 3)


Es almacenada en un vector columna formado por las columnas de la matriz (una columna después de otra).
(2)
(5)
(7)
(8)
(4)
(3)

II. La indexación lineal
Esta manera de almacenar en MatLab implica que es posible acceder a los elementos de una matriz con un solo índice (que va de 1 hasta el número total de elementos de la matriz).

II.1. Acceder a un elemento de una matriz utilizando la indexación lineal
Para el caso de las matrices, acabamos de ver que el vector columna correspondiente estaba compuesto simplemente por las columnas de la matriz puestas una a continuación de otra. Sin embargo, es más difícil de ver lo que pasa cuando manipulamos matrices de más de 2 dimensiones.
Veamos el caso particular de una matriz T de tres dimensiones, de 4X2X3.

Por lo tanto, estos elementos están organizados en el vector columna que corresponde a la matriz incrementando el primer índice de la matriz, luego el segundo, luego el tercero (y los siguientes si trabajáramos con más de 3 dimensiones).

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


Dicho de otro modo, partiendo de un vector columna correspondiente al almacenamiento de una matriz, este es ordenado en la matriz dividiéndolo según la última dimensión, luego la precedente y así sucesivamente. Por lo tanto, la división es hacha de esta manera:



Finalmente, en nuestro ejemplo, podemos acceder al décimo primer elemento de la matriz T de dos maneras:
T(3,1,2)

O
T(11)

Tan solo hay que escribir las siguientes líneas para ver que los elementos aparezcan en el mismo orden como en las 3 bucles imbricadas precedentes.
for q=1:24
    disp(T(q));
end

II.2. Pasar de una indexación a otra
Dependiendo de cada caso, una u otra de las indexaciones puede ser más práctica. Existen funciones MatLab que simplifican la manipulación de esta indexación:
  • sub2ind permite pasar de la indexación lineal a la indexación múltiple.
  • ind2sub permite pasar de la indexación múltiple a la indexación lineal.


Para obtener ayuda acerca de estas funciones, en la ventana de MatLab escribe help sub2indo help ind2sub. Para obtener ayuda más detallada, escribe doc. sub2ind o doc ind2sub.

En lugar de mostrar el uso de estas funciones en el caso general de una matriz de N dimensiones, veremos un caso particular.
II.2.1. La función ind2sub
Para conocer la indexación múltiple correspondiente a los índices 3, 8, 17, 23 de una tabla de 4x2x3 tan solo hay que hacer:
v=[3;8;17;23];
[m n p]=ind2sub([4 2 3],v);
  • El primer argumento de la función ind2sub es el tamaño de la matriz a la cual queremos efectuar la conversión “indexación lineal --> indexación múltiple”.
  • El segundo argumento v de la función ind2sub es el vector de los índices que queremos convertir.
  • El miembro de la izquierda [m n p] recibirá los vectores correspondientes a la indexación múltiple.
Concretamente, para toda matriz T de 4x2x3 tendremos:
T(m(1),n(1),p(1))=T(v(1))=T(3)
T(m(2),n(2),p(2))=T(v(2))=T(8)
T(m(3),n(3),p(3))=T(v(3))=T(17)
T(m(4),n(4),p(4))=T(v(4))=T(23)


Ahora podremos probar estas líneas:
T=rand(4,2,3);
v=[3;8;17;23];
[m n p]=ind2sub([4 2 3],v);
for q=1:4
disp([T(m(q),n(q),p(q)), T(v(q))]);
end


Para ver que hayamos obtenido el resultado esperado.
II.2.2. La función sub2ind
Supongamos que queramos convertir en indexación lineal los multi-índices (2,2,1), (1,2,3), (4,1,2), (3,1,3) de una matriz de 4x2x3, entonces será suficiente hacer:
m=[2;1;4;3];
n=[2;2;1;1];
p=[1;3;2;3];
v=sub2ind([4 2 3],m,n,p);
  • El primer argumento de la función sub2ind es el tamaño de la matriz a la cual queremos efectuar la conversión “indexación múltiple --> indexación lineal”
  • Los siguientes argumentos son las columnas m, n, p, conteniendo los índices de la primera dimensión, los índices de la segunda dimensión, los índices de la tercera dimensión respectivamente.
  • El miembro de la izquierda v recibirá el vector correspondiente a la indexación lineal.
Concretamente, para toda matriz T de 4x2x3 tendremos:
T(v(1))=T(m(1),n(1),p(1))=T(2,1,1)
T(v(2))=T(m(2),n(2),p(2))=T(1,2,3)
T(v(3))=T(m(3),n(3),p(3))=T(4,1,2)
T(v(4))=T(m(4),n(4),p(4))=T(3,1,3)


Ahora podemos probar estas líneas:
T=rand(4,2,3);
m=[2;1;4;3];
n=[2;2;1;1];
p=[1;3;2;3];
v=sub2ind([4 2 3],m,n,p);
for q=1:4
    disp([T(v(q)), T(m(q),n(q),p(q))]);
end


para comprobar que hayamos obtenido el resultado esperado.
III. La función reshape
Teniendo en cuenta como se almacena una matriz en MatLab, fácilmente podemos comprender que el tamaño de una matriz no es importante y que solo es necesario una pequeña función para dar a una matriz la forma que queramos (siempre que el número de elementos no cambie). La función MatLab que permite redimensionar una matriz es reshape.
Como con las otras funciones, para obtener ayuda acerca de esta función escribe en la ventana de MatLab help reshape o doc reshape para obtener ayuda más detallada.

Para comprender la acción de la instrucción reshape, tan solo debemos saber que redimensionando una matriz T en una matriz M, los elementos de T son tomados en orden creciente de su indexación lineal y son colocados en M en el mismo orden.

Veamos nuevamente el ejemplo de la matriz T precedente (T es de 4x2x3). Como ya lo hemos dicho, el numero de elementos de esta matriz es 24. Vemos también que es el numero de elementos de una matriz M de 6X4. Esto es lo que ocurre cuando se escribe el siguiente código:
M=reshape(T,[6 4]);


Cabe mencionar que fácilmente podemos obtener la matriz inicial T con la ayuda de M redimensionándola adecuadamente:
TT=reshape(M,[4 2 3]);


La matriz TT es idéntica a la matriz T inicial.
 

jueves, 10 de noviembre de 2011

CALCULO DEL AREA ENTRE 2 CURVAS

Introducción

Recordemos que el desarrollo del Cálculo Integral se originó en parte para calcular el área bajo una curva.
El cálculo de áreas entre una curva dada por y=f(x) y el eje x en el intervalo [a,b] nos llevó a definir una sumatoria de Riemann y el área entre la curva y el eje horizontal se calculó tomando el límite de la suma de Riemann cuando n--->Infinito.gif (163 bytes). Todo esto fue para f(x)>0 en [a,b].



Utilizaremos el mismo procedimiento que se usó para encontrar el área bajo una curva. Se aproximará el área entre las dos curvas haciendo una partición del intervalo [a,b] en n subintervalos de longitud (b-a)/n. En cada subintervalo escogemos un valor particular de x, al que llamaremos x*.  

  1. Evaluamos f(x*) y g(x*) y formamos rectángulos de base (b-a)/n y de altura f(x*)-g(x*) (si f(x*)>g(x*)).
  2.  
  3. El área de dicho rectángulo es (f(x*)-g(x*))((b-a)/n). Al sumar las áreas de los rectángulos obtenemos una aproximación al valor del área entre las curvas.
  4.  
  5. Tomando el límite cuando n--->Infinito obtendremos el valor exacto del área buscada.
  6.  
  7. Por definición, el límite de la sumatoria de Riemann es la integral definida de f(x)-g(x) en [a,b].
  8.  
  9. Si g(x)>f(x) en alguna parte del intervalo, entonces la altura de los rectángulos es g(x*)-f(x*).

 En cualquier caso la altura de los rectángulos es |f-g| (valor absoluto de la diferencia)
Definición de área entre dos gráficas:
El área entre las gráficas de y=f(x) , y=g(x) en el intervalo [a,b] está dado por el valor de la Integral Definida de |f-g| en [a,b].
Enseguida se calculará el área de la región entre dos curvas.

Otros métodos: Rectángulos horizontales.

El procedimiento anterior depende de que, en cada intervalo de integración, la curva "de arriba" es la misma y la curva "de abajo" también. A continuación se muestra una situación en donde esto no se cumple. Observa las siguientes gráficas.
 Observa que en el intervalo [-1,3] no se cumple que la curva "de arriba" sea la misma. En [-1,2] la curva de arriba es y=x-1 , mientras que en [2,3] la curva de arriba es y=(3-x)1/2.
En la gráfica anterior dibujamos un rectángulo horizontal de base X2 - X1 y de altura Delta.gif (151 bytes)y.
X2
es elvalor de x dado por la curva de la derecha (x=3-y2) y X1 es el valor de x dado por la curva de la izquierda (x=y+1). En esta situación la curva de la derecha siempre es la misma y la curva de la izquierda también es la misma para todos los rectángulos horizontales desde y=-2 hasta y=1.
Integral.gif (265 bytes) y=1
Entonces el área entre las curvas es igual a [3 - y2 - (y+1)] dy
y=-2
 Si integramos con respecto a "y" la diferencia (3-y2) - (y+1) entre y=-2 hasta y=1, entonces encontramos que:

                                                 9
Area entre las curvas =

2





Bibliografía:
http://centros5.pntic.mec.es/ies.de.melilla/area_entre_dosC.htm