Matrices en Java
Matrices en Java
Matrices en Java
Un array en Java puede tener más de una dimensión. El caso más general son los arrays
bidimensionales también llamados matrices o tablas.
La dimensión de un array la determina el número de índices necesarios para acceder a sus
elementos.
Los vectores que hemos visto en otra entrada anterior son arrays unidimensionales porque
solo utilizan un índice para acceder a cada elemento.
Una matriz necesita dos índices para acceder a sus elementos. Gráficamente podemos
representar una matriz como una tabla de n filas y m columnas cuyos elementos son todos del
mismo tipo.
La siguiente figura representa un array M de 3 filas y 5 columnas:
RECORRER MATRICES
Para recorrer una matriz se anidan dos bucles for. En general para recorrer un array
multidimensional se anidan tantas instrucciones for como dimensiones tenga el array.
Ejemplo de recorrido de una matriz en Java:
Programa que lee por teclado números enteros y los guarda en una matriz de 5 filas y 4
columnas. A continuación muestra los valores leídos, el mayor y el menor y las posiciones que
ocupan.
import java.util.*;
En este ejemplo se han utilizado dos formas distintas para recorrer la matriz:
- utilizando en el for el número de filas y columnas
- utilizando en el for el atributo length
Para recorrer arrays irregulares como el siguiente:
int [][] a = {{6,7,5,0,4}, {3, 8, 4}, {1,0,2,7}, {9,5}};
Usaremos siempre length para obtener el número de columnas que tiene cada fila:
Vamos a realizar un repaso sobre conocimientos que debemos tener relativos a arrays multidimensionales.
En Java es posible crear arrays con más de una dimensión, pasando de la idea de lista, vector o matriz de
una sola fila a la idea de matriz de m x n elementos, estructuras tridimensionales, tetradimensionales, etc.
La sintaxis será:
Tipo_de_variable[ ][ ]… [ ] Nombre_del_array = new Tipo_de_variable[dimensión1][dimensión2]…[dimensiónN];
Tipo_de_variable[ ][ ] … [ ] Nombre_del_array;
Nombre_del_array = new Tipo_de_variable[dimensión1][dimensión2]…[dimensiónN];
El tipo de variable puede ser cualquiera de los admitidos por Java y que ya ha sido explicado. Ejemplos de
declaración e inicialización con valores por defecto de arrays, usando los distintos tipos de variables Java,
serían:
Hay que recordar que los elementos empiezan a numerarse por 0. Así, la esquina superior izquierda de la
matriz será el elemento [0][0] y la esquina inferior derecha será el [2][1]. Hay que prestar atención a esto
porque en otros lenguajes de programación la numeración puede empezar por 1 en vez de por 0.
También se pueden cargar directamente los elementos, durante la declaración de la matriz de la siguiente
manera:
donde {1,2} corresponde a la fila 1, {3,4} a la fila 2 y {5,6} a la fila 3, y los números separados por coma
dentro de cada fila, corresponden a las columnas. En este caso, los números (1, 3, 5) de cada una de las
filas corresponden a la primera columna y los números (2, 4, 6) atañen a la segunda columna.
Para obtener el número de filas de la matriz, podemos recurrir a la propiedad “length” de los arrays, de la
siguiente manera:
También Java nos permite la posibilidad de clonar una matriz, es decir, crear una matriz nueva a partir de
otra matriz, siguiendo esta sintaxis:
donde clone() es un método especial, que permite la clonación de arrays de cualquier dimensión en Java.
De esta manera “nuevaMatriz” y “matriz” son 2 matrices distintas pero con los mismos valores. Hablaremos
del método clone más adelante.
EJERCICIO RESUELTO
Vamos a plantear y resolver un ejercicio: queremos almacenar en una matriz el número de alumnos con el
que cuenta una academia, ordenados en función del nivel y del idioma que se estudia. Tendremos 3 filas
que representarán al Nivel básico, medio y de perfeccionamiento y 4 columnas en las que figurarán los
idiomas (0 = Inglés, 1 = Francés, 2 = Alemán y 3 = Ruso). Se pide realizar la declaración de la matriz y
asignarle unos valores de ejemplo a cada elemento.
SOLUCIÓN
alumnosfxniveleidioma[0][2]= 8; alumnosfxniveleidioma[0][3] = 3;
alumnosfxniveleidioma[1][2] = 7; alumnosfxniveleidioma[1][3] = 2
alumnosfxniveleidioma[2][2] = 4; alumnosfxniveleidioma[2][3] = 1
También, podríamos asignar contenido de esta otra forma, como ya se ha explicado anteriormente:
La representación gráfica que podríamos asociar a esta asignación de datos sería esta matriz:
La organización de la información en matrices, nos generará importantes ventajas a la hora del tratamiento
de datos en nuestros programas.
Veamos lo que sería un ejemplo de programa con array multidimensional, usando un tipo String.
El resultado del programa es la aparición del mensaje “El alumno número 24 del curso tercero se llama
Pedro Hernández González.
En este ejemplo, [5] representa a los cursos. Hablamos de 5 cursos que son identificados con 0, 1, 2, 3, 4,
por lo que [2] hace mención al tercer curso;lo mismo podemos decir de [23], que corresponde al alumno
número 24. Hay que recordar que siempre en Java tenemos que contar el cero, ya que si no lo hacemos
podemos cometer errores.
EJERCICIO
Crea un programa que pida por pantalla cuatro países y a continuación tres ciudades de cada uno de estos
países. Los nombres de ciudades deben almacenarse en un array multidimensional cuyo primer índice sea el
número asignado a cada país y el segundo índice el número asignado a cada ciudad.
El tercer y último método, nos mostrará los datos introducidos por pantalla:
public void mostrar_matriz() {
System.out.println("La matriz es: ");
for(int j=0; j<filas; j++){
for(int i=0; i<columnas; i++){
System.out.print(matriz[j][i]+" ");
}
System.out.println();
}
}
En esta página, definiremos la clase Vector y la clase Matriz cuadrada, las operaciones
entre matrices, suma y producto de dos matrices, el producto de una matriz por un vector,
el producto de una matriz por un escalar, la traza de una matriz y la matriz traspuesta de
una matriz dada.
Vectores y matrices
Un vector es un array unidimensional de números. Se define la clase Vector con dos
miembros dato, el número de datos que guarda y el array unidimensional que guarda
dichos datos.
Una matriz es un array bidimensional de números. En general, decimos que una matriz
tiene una dimensión m x n, cuando los números están dispuestos en m filas y n columnas.
Se denominan matrices cuadradas a aquellas que tienen el mismo número de filas que de
columnas. Estas matrices tienen especial importancia y serán las que tratemos en estas
páginas.
Los constructores
Vamos a definir dos constructores en la clase Vector, al primero se le pasa el número de
elementos que va a guardar e inicializan a cero todos sus elementos.
public Vector(int n) {
this.n=n;
x=new double[n];
for(int i=0; i<n; i++){
x[i]=0.0;
}
}
public Vector(double[] x) {
this.x=x;
n=x.length;
}
Para crear un vector v que guarde los datos del array v1 se escribe
public Matriz(int n) {
this.n=n;
x=new double[n][n];
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
x[i][j]=0.0;
}
}
}
Para crear una matriz a de dimensión tres cuyos elementos son todos ceros, se escribe.
public Matriz(double[][] x) {
this.x=x;
n=x.length;
}
Vamos añadiendo al string texto, los elementos del vector y el carácter separador entre
elementos, limitamos el número de decimales a tres mediante la función Math.round.
Para concluir la fila y pasar a la siguiente en la pantalla de texto, añadimos un carácter
retorno de carro '\n'. Mediante la operación + definida en la clase String podemos
concatenar fácilmente los distintos elementos y crear la representación textual del vector
que devuelve la función toString
Mostrar una matriz en la pantalla de texto es difícil, ya que Java no dispone de una
función que sitúe el cursor de texto en una posición de la pantalla, como lo hace la
función gotoxy disponible en los lenguajes C/C++. La única alternativa que nos queda es
mostrar los elementos de una fila unos a continuación de los otros separados por un
tabulador, después otra fila y así hasta mostrar todos los elementos de la matriz.
Para mostrar los elementos de la matriz, redefinimos la función toString de la clase base
Object, de la cual deriva implícitamente Matriz. Separamos los elementos de una fila
mediante el carácter tabulador '\t', y limitamos el número de decimales a tres mediante la
función Math.round. Cuando se acaba una fila se inserta un retorno de carro '\n' y se
continua con la siguiente fila, y así sucesivamente.
Vamos añadiendo al string texto, los elementos de la matriz y los caracteres separadores
entre elementos y entre filas de elementos.
Si queremos mantener la matriz original, hacemos una copia de dicha matriz en el cuerpo
de la función y realizamos las operaciones con la matriz copia dejando la original sin
modificar.
Matriz a=(Matriz)d.clone();
double traza=a.traza();
Se obtiene otra matriz c en la que sus elementos cij son las suma de los correspondientes
elementos de las matrices a y b, es decir
cij=aij+bij
Para sumar dos matrices, se define una función miembro estática denominada suma.
Dentro de la función, se crea una matriz temporal resultado, con la misma dimensión de
las matrices que intervienen en la operación, y se guardan en sus elementos el resultado
de la suma de las matrices a y b. Finalmente, la función suma devuelve la matriz
resultado.
Los elementos cij se obtienen multiplicando los elementos aik de la fila i por los elementos
akj de la columna j, y sumando los resultados.
Al multiplicar un vector fila por una matriz cuadrada de la misma dimensión obtenemos
otro vector fila. El código es semejante al de la función producto definida previamente.
Matriz traspuesta
Una matriz traspuesta de otra matriz es aquella que tiene los mismos elementos pero
dispuestos en forma distinta. Las columnas de la matriz original se transforman en filas
de la matriz traspuesta. La definición de la función estática traspuesta no reviste
dificultad alguna