Matriz 5: Mediana de una matriz

La mediana de una matriz se calcula obteniendo todos los números dentro de la matriz y pasarlos a un vector. Dentro del vector se ordenan todos los datos (Forma ascendente) y se saca el número del valor medio. Una vez obtenido este número (La mediana) se coloca en medio de la matriz y se hace el cambio de posición por el número que se encontraba en esa posición.

 

 

Supongamos que tenemos una matriz con los siguientes valores.

Matriz 1

 

Entonces sacamos todos los valores de la matriz y los pasamos a un vector, quedaría de la siguiente manera.

Vector_Matriz

 

Siguiente paso es ordenar los valores en forma ascendente (Para ello usamos el método de Burbuja).

Vector_Matriz2

 

Buscamos el valor medio del vector, en este caso el 5 y lo intercambiamos por el valor que estaba en su posición, el 12, el vector quedaría.

Vector_Matriz3

 

Al final se devuelven los datos a la matriz quedando de la siguiente manera.

Matriz_Mediana

Mediana de una matriz con dos valores medios

 

Una matriz siempre tendrá un valor medio cuando el total de sus elementos sea un número impar, pero cuando los elementos son un número par, la matriz tiene dos elementos medios.

Matriz_mediana_doble

 

Pasamos los elementos a un vector.

vector_mediana_doble

 

Ordenamos los datos.

Vector_mediana_doble

 

Obtenemos los dos valores medios, en este caso los números 8 y 9, y los intercambiamos por las posiciones de los números que antes estaban ahí, el cual son el 5 y 4, el vector quedaría.

Vector_mediana_doble

 

Al final pasamos los valores a la matriz, el resultado sería. 

Matriz_mediana_doble2

 

Nota: Este tipo de operaciones sobre matrices es aplicado para el tratamiento de imágenes, ¿Interesante verdad?.

 

Limitaciones: Los números dentro de la matriz deben ser diferente, si hay números repetidos y resultan ser la mediana de la matriz se intercambiarán más de un valor.

Código completo utilizado

package pqtMatricesTres;

import javax.swing.JOptionPane;

public class Mediana {

        public static void main(String[] args) {
                int filas=Integer.parseInt(JOptionPane.showInputDialog("Digita las filas de la matriz"));
                int columnas=Integer.parseInt(JOptionPane.showInputDialog("Digita las columnas de la matriz"));
                int matriz[][]=new int[filas][columnas];
                for(int i=0;i<filas;i++){
                        for(int j=0;j<columnas;j++){
                                matriz[i][j]=Integer.parseInt(JOptionPane.showInputDialog("Digita un número para la posición: a["+i+"]["+j+"]"+" de la matriz"));
                                System.out.print(matriz[i][j]+" ");
                        }
                        System.out.println();
                }
                //Creando el vector
                int vec[]=new int[filas*columnas];
                int cont=0;
                System.out.print("El vector tiene ");
                for(int i=0;i<filas;i++){
                        for(int j=0;j<columnas;j++){
                                vec[cont]=matriz[i][j];
                                System.out.print(vec[cont]+" ");
                                cont++;
                        }
                }
                
                //Sacamos los valores medios
                int val1=0, val2=0;
                for(int e=0;e<vec.length;e++){
                         //Si vec.length%2==0 entonces los elementos son par y tiene 2 valores medios
                         if(vec.length%2==0){
                                 val1=vec[(vec.length/2)-1];
                                 val2=vec[vec.length/2];
                         }else{
                                  val1=vec[vec.length/2];
                         }
                }
                System.out.println();
                System.out.println("Valores medios, val1= "+val1+" , val2= "+val2);
                //Hacemos una copia del vector para ordenarlo y sacar los valores medios ordenados
                int vecAux[]=vec.clone(); //clone() copia todo el contenido del vector.

                //Ordenamos datos con burbuja
                for(int i=1;i<vecAux.length;i++){
                           for(int j=0;j<vecAux.length-1;j++){
                                   if(vecAux[j]>vecAux[j+1]){
                                           int aux;
                                                aux=vecAux[j+1];
                                                vecAux[j+1]=vecAux[j];
                                                vecAux[j]=aux;
                                   }
                           }
                 }
                
                //Sacamos los valores medios del vector ordenado
                System.out.print("Vector ordenado: ");
                int val3=0, val4=0;
                for(int e=0;e<vecAux.length;e++){
                         System.out.print(vecAux[e]+" ");
                         //Si vec.length%2==0 entonces los elementos son par y tiene 2 valores medios
                         if(vecAux.length%2==0){
                                 val3=vecAux[(vecAux.length/2)-1];
                                 val4=vecAux[vecAux.length/2];
                         }else{
                                  val3=vecAux[vecAux.length/2];
                         }
                }
                
                System.out.println("\nValores medios, val3= "+val3+" , val4= "+val4);
                
                //Cambiamos el valor medio del vector auxiliar en el vector original
                for(int pos=0;pos<vec.length;pos++){
                         if(vec.length%2==0){
                                 if(val3==vec[pos]){
                                         vec[pos]=val1;
                                         vec[(vec.length/2)-1]=val3; 
                                 }else if(val4==vec[pos]){
                                         vec[pos]=val2;
                                         vec[vec.length/2]=val4; 
                                 }
                         }else if(val3==vec[pos]){
                                 vec[pos]=val1;
                                 vec[vec.length/2]=val3; 
                         }
                                  
                }
                
                //Intercambiamos datos del vector a la matriz
                cont=0;
                for(int i=0;i<filas;i++){
                           for(int j=0;j<columnas;j++){
                                   matriz[i][j]=vec[cont];
                                   cont++;
                           } 
                 }
                
                //Imprimimos la matriz para comprobar el cambio de números
                System.out.println("Datos de la matriz con cambio");
                   for(int m=0;m<filas;m++){
                           for(int n=0;n<columnas;n++){
                                  System.out.print(matriz[m][n]+" ");
                           } 
                           System.out.println();
                   }
                   
        }

}