Mostrando las entradas con la etiqueta Algebra Lineal. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Algebra Lineal. Mostrar todas las entradas

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.