Suma de los 4 vecinos en una matriz
De Ejercicios
Contenido |
Enunciado
Diseña un módulo al que se le dé como parámetro de entrada una matriz M de números y devuelva en una matriz de dos filas las coordenadas de aquellos valores de M que sean mayores a la suma de sus cuatro vecinos (arriba, abajo, derecha e izquierda). En la primera fila de la matriz de salida se almacenarán las coordenadas de las filas de los valores y en la segunda fila las coordenadas de las columnas.
Ejemplo:
Si la matriz M es: El módulo devolvería la matriz: 1 7 -8 7 1 1 2 2 3 5 0 9 8 2 4 1 3 2 1 14 3 5
Observe que el primer valor que es mayor a la suma de sus vecinos es 7 (fila 1, columna 2). Sus vecinos valen 1 (izquierda), 0 (abajo) y -8 (derecha), arriba no tiene vecino.
Usando el módulo anterior diseña un algoritmo que lea una matriz de un archivo y muestre en la pantalla la suma de los valores de la matriz que son mayores a la suma de sus cuatro vecinos. El formato del fichero tiene en la primera fila el número de filas y columnas de la matriz y en las filas siguientes los elementos de la matriz por filas.
Ejemplo: Para el caso de la matriz anterior, el fichero contendría lo siguiente:
3 4 1 7 -8 7 5 0 9 8 1 14 3 5
Para el fichero de ejemplo el algoritmo debe mostrar 42, que es la suma de los valores mayores a sus vecinos (7+7+5+9+14).
Soluciones
Programa en Matlab
Apartado a
function coord = mayorVecinos (m) % Funcion coord = mayorVecinos (m) % Descripción: calcula las coordenadas de los valores de m que son mayores % a la suma de sus 4 vecinos (arriba, abajo, izquierda y derecha) % Parámetros de entrada: % m: matriz de números % Parámetros de salida: % coord: matriz con las coordenadas de los valores de m mayores que sus vecinos. % Tiene dos filas: en la primera se guarda las filas de las coordenadas % y en la segunda las columnas de las coordenadas coord = []; [nf,nc] = size (m); calculados = 0; for f = 1:nf for c = 1:nc suma = 0; if f > 1 suma = suma + m(f-1,c); % suma vecino arriba end if f < nf suma = suma + m(f+1,c); % suma vecino abajo end if c > 1 suma = suma + m(f,c-1); % suma vecino izqda end if c < nc suma = suma + m(f,c+1); % suma vecino derecha end if m(f,c) > suma calculados = calculados + 1; coord(:,calculados) = [f c]; end end end
Apartado b
% Programa Ejer2Principal % Entradas: el nombre de un fichero que contiene una matriz con % el formato especificado en el enunciado del ejercicio. % Salidas: Suma de los elementos de la matriz que verifican la % siguiente condición: el valor es mayor a la suma de sus % 4 vecinos (arriba,abajo,izquierda y derecha) nombref = input('Introduce el nombre del fichero: ', 's'); fid = fopen (nombref, 'r'); if fid == -1 disp(['No se pudo abrir el fichero ',nombref]); else nf = fscanf (fid,'%f', 1); nc = fscanf (fid,'%f', 1); m = fscanf (fid,'%f', [nc nf]); m = m'; coord = mayorVecinos (m); [nf,nc] = size(coord); suma = 0; for c = 1:nc suma = suma + m(coord(1,c),coord(2,c)); end disp(['La suma de los elementos es ',num2str(suma)]); end