Jump to content

Matriz Original MxM reduzir para Matriz Média


Recommended Posts

Posted (edited)

Boas Pessoal,

Sei correr a matriz na horizontal e na vertical, contudo tenho que correr a matriz em "quadrados", não estou a ver como.

Agradeço ideias.

#include <stdio.h>
#define M 8
/*
19. Pretende-se reduzir uma imagem a metade do seu tamanho original. A imagem inicial
consiste num array bidimensional com M×M valores inteiros onde cada pixel (ponto na imagem)
pode tomar um valor inteiro entre 0 e 9 (tonalidades de cinza). A imagem reduzida é armazenada
num array bidimensional com M/2×M/2 valores reais onde cada elemento (pixel) corresponde á
média dos 4 elementos que substitui. Para melhor compreensão do enunciado veja o exemplo
apresentado de seguida (neste caso, para M=8):
Imagem original
0 4 9 3 6 7 2 9
9 4 7 8 3 4 7 2
5 1 2 6 3 8 6 2
7 1 4 8 7 2 0 7
4 9 3 5 2 1 5 7
5 3 4 7 8 9 1 0
2 3 5 6 7 9 2 4
2 3 4 5 6 7 8 9
 Imagem reduzida
 4.3 6.8 5.0 5.0
 3.5 5.0 5.0 3.8
 5.3 4.8 5.0 3.3
 2.5 5.0 7.3 5.8
Escreva uma função em C que efectue esta operação. A função recebe 3 argumentos: endereço do
primeiro elemento da matriz original, endereço do primeiro elemento da matriz reduzida e o valor
M
*/

void calculamedia(int *matriz, float *matrizmedia, int m)
{
for (i = 0; i < M; i++)
{
}

}

int main()
{

int matriz[M][M] =	  {{0, 4, 9, 3, 6, 7, 2, 9},
					 {9, 4, 7, 8, 3, 4, 7, 2},
					 {5, 1, 2, 6, 3, 8, 6, 2},
					 {7, 1, 4, 8, 7, 2, 0, 7},
					 {4, 9, 3, 5, 2, 1, 5, 7},
					 {5, 3, 4, 7, 8, 9, 1, 0},
					 {2, 3, 5, 6, 7, 9, 2, 4},
					 {2, 3, 4, 5, 6, 7, 8, 9}};

float matrizmedia[M/2][M/2] = {0.0};

calculamedia(matriz[0], matrizmedia[0], M);

// Falta função para impressão da matriz.
return 0;
}
Edited by thinkabout
Posted
void calculamedia(int *matriz, double *matrizmedia, int m) // <--- double
{
int i, j;
int sum;

for (i = 0; i < m; i += 2)
{
	for (j = 0; j < m; j += 2)
	{
		sum  = /* matriz[i][j] */
		sum += /* matriz[i][j+1] */
		sum += /* matriz[i+1][j] */
		sum += /* matriz[i+1][j+1] */

		/* matrizmedia[i][j] = (double)sum / 4; */
	}
}
}
IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)

😉

Se existir forma de simplificar agradeço ideias 🙂 .

void calculamedia(int *matriz, double *matrizmedia, int tamanho)
{
int i, j,z=0,y=0;
int sum;
// Imprimir a matriz original
printf("\n Matriz Original \n");
for (i = 0; i < m*8; i ++)
{
 printf(" %d" , *(matriz+i));
 z++;
 if (z==tamanho)
 {
  puts("");
  z=0;
 }
}
puts("");
// Faz a soma dos numeros depois a devisão para calcular media e insere na matrizmedia
for (i = 0; i < tamanho*tamanho; i += tamanho*2)
{
 for (j = 0; j < tamanho; j += 2)
 {
  sum  = *(matriz + i + j);			 /* matriz[i][j]	  -> 0 */
  printf("Estou a comecar no indice %d %d",i,j); // Debug
  sum += *(matriz + i+1 + j);		   /* matriz[i+1][j]	-> 4  */
  sum += *(matriz + i + j+tamanho);	 /* matriz[i][j+1]	-> 9  */
  sum += *(matriz + i+1 + j+tamanho);   /* matriz[i+1][j+1]  -> 4  */
  printf(" ---- O valor total da e soma %d \n", sum);  // Debug
  // Passar os valores para a matrizmedia
  *(matrizmedia + y) = (double)sum / 4;
  y++;  
 }  
}  
// Imprimir a matriz reduzida
printf("\n Matriz Reduzida \n");
for (i = 0; i < m*2; i++)
{
 printf(" %.1lf" , *(matrizmedia+i));
 z++;
 if (z==tamanho/2)
 {
  puts("");
  z=0;
 }
}
}
Edited by thinkabout
Posted

vi agora que tinha os índices errados na atribuição à matriz reduzida 😄 ao menos viste isso e corrigiste 😉

simplificar ? simples :

mete a impressão da matriz numa função e tira da função redução

isso não é passo para ser feito dentro da função redução

IRC : sim, é algo que ainda existe >> #p@p

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.