extraer submatrices

Iniciado por xabi100, 27 Diciembre 2020, 18:23 PM

0 Miembros y 1 Visitante están viendo este tema.

xabi100

Hola, necesito hacer un programa en c que extraiga submatrices cuadradas (k*k) de una matriz dada (m*n), calculando la suma de los elementos de cada submatriz y devuelva la submatriz con la suma mayor.

he hecho un codigo pero no me da lo que esperaba. en este caso k=2.

#include<stdio.h>
#include<stdlib.h>
int suma(int m[2][2]);

void main(void){
 int matriz[5][4]={{1,2,2,4},{3,9,4,5},{6,7,2,1},{4,4,3,1},{0,0,3,8}};
 int submatriz[2][2];
 int i,j,fila,columna,mayorsuma;

 fila=0;columna=0;

 

 
 
 mayorsuma=15;
 for(i=0;i<5;i++){
   for(j=0;j<4;j++){
     
     for(int k=i;k<i+2;k++){
       for(int p=j;p<j+2;p++){
         
         submatriz[k][p]= matriz[k][p];
         
         if(suma(submatriz)> mayorsuma){
           mayorsuma=suma(submatriz);
           fila=k;
           columna=p;}
       }
     }
   }
 }
 
printf ("mayorsuma   = %d \n",mayorsuma  );
printf ("fila   = %d \n",fila  );
printf ("columna   = %d \n",columna  );        
         




}
int suma(int m[2][2]){
  int i,j;
  int sum=0;

  for(i=0;i<2;i++){
    for(j=0;j<2;j++){
      sum=sum+m[i][j];
    }
  }
return (sum);
}

K-YreX

Tienes varios errores:
  • Líneas 17 y 18 -> La i y la j marcan el punto de inicio. A cada valor de i y de j le vas a sumar hasta 2 por lo que en las últimas iteraciones de cada bucle se te saldrá fuera de la matriz.
  • Línea 23 -> No es la misma la posición que vas leyendo de la matriz original que la posición en la que tienes que escribir de la submatriz. Aunque hagas la submatriz que empieza por ejemplo en [2][3] tienes que empezar a escribir en
  • , no en [2][3].
  • Líneas 25 - 28 -> No tienes que calcular la suma cada vez que cambias un valor sino cada vez que copias una submatriz completa. Tal y como lo haces ahora mismo estás calculando sumas de submatrices que no existen.

    Aparte de los errores, ese programa está muy limitado pues no permite cambiar fácilmente ni el tamaño ni los valores de las matrices. Sería mejor usar constantes para permitir esto más fácilmente.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;