Mostrando las entradas con la etiqueta Matrices. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Matrices. Mostrar todas las entradas

martes, 9 de agosto de 2016

Rotar matrices en MATLAB


La rotación de matrices consiste en redefinir la posición de sus elementos mediante una modificación que no afecta el valor de sus elementos. Para comenzar, suponga que se tiene un vector v definido como sigue:

v = [v1, v2, v3, ⋯, vn − 1, vn]

Y sea vea v' el vector cuyas componentes son las mismas que v pero dispuestas en un orden inverso, es decir:

v′=[vn, vn − 1, ⋯, v3, v2, v1]

En MATLAB invertir el orden de los elementos de un vector resulta una tarea muy sencilla, esto puede lograrse indexando los elementos de la forma que a continuación se muestra:

>> v=[-2 5 8 7 3 0] % Vector original
v =
    -2     5     8     7     3     0
>> vp=v(end:-1:1) % Vector con elementos invertidos
vp =
     0     3     7     8     5    -2

La anterior es una forma muy simple de realizar dicha tarea, pero si usted prefiere el uso de funciones existe para tal fin la función fliplr cuya tarea es exactamente esa, extendiéndose su uso también a matrices, véase el ejemplo utilizando el mismo vector definido anteriormente:

>> vp=fliplr(v)
vp =
     0     3     7     8     5    -2

La función fliplr rota una matriz en un eje vertical, de tal modo que las columnas situadas a la izquierda queden en la parte derecha. Véase el ejemplo a continuación:

>> A=randi(10,3)
A =
     4     5     3
     2     2     4
     5     6     6
>> Ar=fliplr(A)
Ar =
     3     5     4
     4     2     2
     6     6     5

Está claro que fliplr ejecuta una rotación basada en las columnas, pero MATLAB dispone también de la función flipud que ejerce una rotación en un eje horizontal o basada en las filas, enseguida se muestra un ejemplo:

>> A=randi(10,4)
A =
     5     6     8     2
     9     4     5     3
     8     2     1     5
    10     7     3     6
>> Ar=flipud(A)
Ar =
    10     7     3     6
     8     2     1     5
     9     4     5     3
     5     6     8     2

Además de las anteriores MATLAB proporciona la función rot90 que permite girar la matriz en un ángulo múltiplo de 90° en el sentido contrario a las manecillas del reloj, de manera informal es como si la matriz rodase en dirección izquierda. Los argumentos de entrada de la función son primeramente la matriz a rotar y como segundo argumento un escalar entero que indica el múltiplo de 90° con el cual habrá de ejecutarse la rotación, si no se introduce un segundo argumento se asume que este será unitario. Véanse los ejemplos a continuación:

>> A=randi(20,3)
A =
    14     8    10
     1    19     9
    13     1    10
>> A90=rot90(A)  % Matriz rotada 90°
A90 =
    10     9    10
     8    19     1
    14     1    13
>> A180=rot90(A,2)  % Matriz  rotada en 180°
A180 =
    10     1    13
     9    19     1
    10     8    14
>> A270=rot90(A,3)   % Matriz rotada 270°

A270 =

    13     1    14
     1    19     8
    10     9    10

lunes, 4 de enero de 2016

Ordenar matrices en MATLAB


El ordenamiento de datos es una tarea muy común dentro del mundo de la informática y en la programación científica. Se ordenan datos para realizar análisis cualitativos, para la visualización gráfica o cualquier otro procedimiento que requiera datos organizados. Los datos se pueden organizar por criterios diversos, pero en esta sección veremos simplemente como ordenarlos de acuerdo a su valor numérico, en orden ascendente o descendente.

Generalmente los algoritmos de ordenamiento forman parte de los cursos básicos de programación y algorítmica, dada su importancia mencionada con anterioridad. Se estudian por lo general métodos tradicionales como: el método de ordenamiento por selección, ordenamiento por inserción y ordenamiento por combinación.

Ahora, enseguida sólo veremos cómo implementar el método de ordenamiento por selección, puesto que resulta muy didáctico y fácil de programar, y como no estamos en disposición de reinventar la rueda,  entonces, para el ordenamiento de las matrices y/o vectores utilizaremos la función sort incluida en el núcleo de MATLAB, y el resto de métodos de ordenamiento tradicionales se propondrán como ejercicios al final de este capítulo.

Así pues, puede revisar el siguiente código:

X=input('Inserte un vector: ');
for i=1:length(X)
   [menor,k]=min(X(i:end));
   X((i-1)+k)=X(i);
   X(i)=menor;
end
disp(X); % Vector ordenado

El programa anterior tiene como punto de entrada un vector introducido por el usuario de forma interactiva y que puede contener valores numéricos cualesquiera. Una vez se ha introducido el vector, se utiliza un bucle for cuyo recorrido está determinado por la longitud del vector, y en cada iteración se busca el elemento de menor valor ubicado en el sub-arreglo $X(i,i+1,...,n-1,n)$ donde i es el i-ésimo elemento dado por el número de iteración actual, y n el último elemento del arreglo, la función min de MATLAB devuelve dos resultados: el valor y la posición del mínimo encontrado, con ello se procede a intercambiar el valor mínimo encontrado con aquel ubicado en la i-ésima posición del arreglo. Y así, cuando se hayan ejecutado tantas iteraciones como elementos tenga el vector, se habrán ordenado en forma ascendente dichos valores. Si por el contrario necesita ordenar un vector en forma descendente, simplemente habrá de sustituir la función min por max, es decir, buscar un valor máximo en lugar del mínimo en cada iteración, o bien, reutilizar el mismo algoritmo y audazmente rotar el vector resultante mediante la función fliplr.

Como se mencionó, en MATLAB todo lo anterior puede reemplazarse utilizando la función sort.
cuya sintaxis más general es:

>> sort(X, dim, mod);

Donde X es la matriz o vector a ordenar, dim es un escalar que puede ser 1 (columnas) o 2 (filas) y que representa la dimensión de referencia sobre la cual se ordenará, y mod es el modo de ordenamiento, que puede ser 'ascend' (menor a mayor) o 'descend' (mayor a menor), por defecto las matrices o vectores se ordenan en forma ascendente. 

Véanse los ejemplos siguientes:

>> X=[10 2 8 17 20 1 4 8 9];
>> sort(X)
ans =
    1     2     4     8     8     9    10    17    20
>> M=randi(10,5)
M =
    3    10     3     2     8
    8     7     2    10     6
    9     4     9     5     5
    1    10     8     3    10
    4     8     4     5     6
>> sort(M,1) % Ordenada por columnas
ans =
    1     4     2     2     5
    3     7     3     3     6
    4     8     4     5     6
    8    10     8     5     8
    9    10     9    10    10
>> sort(M,2) % Ordenada por filas
ans =
    2     3     3     8    10
    2     6     7     8    10
    4     5     5     9     9
    1     3     8    10    10
    4     4     5     6     8

miércoles, 3 de diciembre de 2014

Intercambiar filas y columnas de una matriz en MATLAB


El hecho de intercambiar filas y columnas de una matriz suele ser un tema muy importante en álgebra lineal. Aquí vamos a explicar con ejemplos cómo lograr esto mediante la indexación de matrices utilizando el operador dos puntos.

Para ejemplificar vamos a utilizar la matriz A, definida por:

$$A=\begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6  \\ 7 & 8 & 9 \end{bmatrix}$$

Creando la matriz en MATLAB:

>> A=[1,2,3;4,5,6;7,8,9]
A =
     1     2     3
     4     5     6
     7     8     9

Intercambiar filas

Suponga que se pide intercambiar las filas 1 y 2, entonces se procedería como sigue:

>> A([1 2],:)=A([2 1],:)
A =
     4     5     6
     1     2     3
     7     8     9

Básicamente le estamos "diciendo" a MATLAB que de la matriz A sustituya todas las columnas de las filas 1 y 2 por las filas 2 y 1, es decir, "invirtiendo" el orden.


Intercambiar columnas

La lógica usada es prácticamente la misma que en el caso anterior, con la única diferencia que el operador dos puntos lo utilizaremos en el índice de las filas. Por ejemplo, de la matriz A original vamos a intercambiar las filas 2 y 3:

>> A(:,[2 3])=A(:,[3 2])
A =
     1     3     2
     4     6     5
     7     9     8


Definiendo funciones propias

Finalmente, si lo anterior le parece un poco confuso, puede utilizar las siguientes funciones: swaprows y swapcols, que intercambian filas y columnas respectivamente:

function X = swaprows(A,m1,m2)
X = A;
X(m1,:) = A(m2,:);
X(m2,:) = A(m1,:);
end

function X = swapcols(A,n1,n2)
X = A;
X(:,n1) = A(:,n2);
X(:,n2) = A(:,n1);
end

La sintaxis para ambas es similar, simplemente necesita pasar como argumento la matriz y las filas y/o columnas a intercambiar de posición. Desde luego las funciones anteriores no están incluidas en MATLAB por defecto, por lo que habrá de colocarlas a su directorio de trabajo o bien añadirlas al PATH de MATLAB.


miércoles, 20 de agosto de 2014

Calculo de un determinante mediante recursividad en MATLAB


El calculo de un determinante mediante recursividad o formalmente conocido como Teorema o Desarrollo de Laplace, consiste en calcular el determinante de una matriz cuadrada de $nxn$ mediante una descomposición en suma de determinantes menores, es decir, ir reduciendo en $n-1$ dimensiones. El desarrollo se puede hacer por filas o columnas.

La función recursiva para calcular el determinante utilizando el desarrollo en la primera fila puede expresarse como sigue:

Fuente: Wikipedia

Donde $a_{1,k}$ hace referencia al elemento ubicado en la primera fila y k-ésima columna, y $\alpha_{1,k}$ es el adjunto del elemento mencionado anteriormente.

Basado en la referencia anterior se implementó la siguiente función en MATLAB:




Ahora veamos un poco más detallado lo que implica cada línea de la función anterior: en la línea 2 se crea una vector idx cuyos valores son los números en el intervalo [1  n]  y que servirá para obtener, mediante un masking, los indices en fila y columna pertenecientes al adjunto correspondiente (véase linea 7 y 8). El ciclo for se implementa desde un valor unitario hasta el número de filas/columnas de la matriz de entrada X, y enseguida con la sentencia if  se comprueba si la matriz de entrada es de dimensiones unitarias (con lo cual se retorna la entrada misma) o bien si es de dimensiones mayores, con lo cual se implementa el algoritmo recursivo. Finalmente, habrán de sumarse todos los valores obtenidos en cada iteración del ciclo for, para ello se utiliza la función sum.


El costo de la recursividad

Por regla general, un algoritmo recursivo suele ser lento en ejecución. Por lo cual siempre es recomendable buscar o implementar otras técnicas de programación. En este caso, el ejemplo que hemos dado es puramente con fines didácticos, pero para mostrar un "poco" de lo ya dicho he decido "contar" el número de "llamadas" que se hacen a la función durante la ejecución para matrices de diversos tamaños. En la siguiente tabla se muestran las "llamadas" correspondientes para una matriz de $nxn$:

Dimensión de la matriz
Número de llamadas
1
1
2
3
3
10
4
41
5
206
6
1237
7
8660
8
69281

Como se observa el número de "llamadas" a la función crece de forma exponencial, lo cual se traduce en un gasto computacional considerable cuando las dimensiones de la matriz son mayores a un par de decenas e incluso menos. Se adjunta una gráfica correspondiente a la tabla anterior.


viernes, 26 de abril de 2013

Inversa de una matriz en MATLAB


Comenzaremos por definir una matriz A de 2x2.

>> A=[1 5;-3 2]

A =

     1     5
    -3     2

Enseguida, lo único que debemos hacer es utilizar el comando "inv" y Matlab nos devolverá en la línea de comandos la matriz inversa de A, claro, siempre y cuando la matriz sea invertible.

>> Inv_A=inv(A)

Inv_A =

    0.1176   -0.2941
    0.1765    0.0588

En este caso hemos guardado en "Inv_A" la matriz inversa de A. 

A modo de comprobación, recordar que dada una matriz $A$, el producto $A\,A^{-1}=I$, donde $I$ es la matriz identidad de las dimensiones correspondientes. Ejecutaremos este producto en la línea de comandos y podremos comprobar que efectivamente Matlab nos devuelve ese resultado:

>> A*Inv_A

ans =

    1.0000    0.0000
         0    1.0000





domingo, 21 de abril de 2013

Operaciones básicas con matrices en MATLAB


Antes de comenzar se deben tener en cuenta las propiedades básicas de las matrices y todas esos fundamentos que alguna vez se aprendieron en el curso de precálculo o de álgebra lineal.

Bueno, considerando que se han tomado las precauciones necesarias, comenzaremos por definir dos matrices A y B, ambas con las mismas dimensiones, usaremos el caso más sencillo (matrices de 2x2). Sean entonces A y B las que se definen enseguida:

>> A=[-1 3;2 5]

A =

    -1     3
     2     5

>> B=[0 2;4 1]

B =

     0     2
     4     1



+++ SUMA DE MATRICES +++

Calcular la suma de ambas matrices en Matlab es tan sencillo como solo adicionar el operador  "+" entre el nombre de ambas matrices, tal como se muestra enseguida:


>> A+B

ans =

    -1     5
     6     6


Incluso podemos guardar la matriz resultante en una nueva variable, por ejemplo:

>> Suma=A+B

Suma =

    -1     5
     6     6



--- RESTA DE MATRICES ---

Como posiblemente se intuye, la ejecución de la resta es similar a la suma, claro recordando que A-B difiere de B-A, tal como se muestra:

>> Resta1=A-B

Resta1 =

    -1     1
    -2     4


>> Resta2=B-A

Resta2 =

     1    -1
     2    -4


*** MULTIPLICACIÓN DE MATRICES ***

Creo que ya resulta un poco obvio que para efectuar la multiplicación de matrices habrá que usar el operador "*" tal como se hizo para la suma y resta, veamos el ejemplo:

>> Mult=A*B

Mult =

    12     1
    20     9

^^^ POTENCIACIÓN ^^^

Para poder elevar una matriz a una potencia determinada habrá de recordarse que está debe ser cuadrada, puesto que implica una multiplicación sucesiva por ella misma. La manera de indicar a Matlab que necesitamos elevar a una potencia a una matriz determinada es usando el operador de potenciación "^" tal como si fuese un numero cualesquiera, veamos algunos ejemplos:


>> Pot2=A^2

Pot2 =

     7    12
     8    31

>> Pot7=A^7

Pot7 =

       27089       93369
       62246      213827



Con esto se concluye esta entrada de operaciones básicas, posteriormente se verá como calcular determinantes e inversa de una matriz.

Ingresar una matriz en MATLAB



Es bien sabido que Matlab basa sus cálculos en matrices, de hecho de ahí su nombre. Una forma de ingresar una matriz en la "ventana de comandos" de Matlab es la siguiente:

>> A=[1 -2 3;2 3 9;-10 0 5]

A =

     1    -2     3
     2     3     9
   -10     0     5


La instrucción anterior nos guarda en la variable A una matriz de 3x3 en este caso y nos arroja un resultado como el mostrado. Podemos ahora definir una nueva matriz B de igual dimensión que A, por ejemplo:


>> B=[5,3,1;-8,13,7;9,-1,0]

B =

     5     3     1
    -8    13     7
     9    -1     0

Nótese que la manera de ingresar la matriz difiere un poco, de lo cual podemos intuir que la separación entre elementos de una misma fila podemos hacerla mediante "espacios" o bien poniendo "comas" entre cada uno de ellos, y claro, para insertar una nueva fila es necesario  escribir el punto y coma como se ve para cada caso.