[ Foro de Pascal ]

reducir tamaño de una matriz

20-Mar-2014 19:52
oscar gomez
6 Respuestas

hola profesor nacho.
queria pedir tu ayuda me orientes por favor con una parte de un programa que necesito terminar.

como hago para reducir una matriz de N*N >2  eliminando simultaneamente fila y columna ,porejemplo una de dimension 4 sin usar recursividad, sino a traves de un bucle while o repeat en una matriz de 2*2,
porejemplo

A= 1    2     3    4
     5    6    7    8
     9   10  11  12
   13   14  15  16

primera pasada:
A=   6    7     8
      10  11  12
      14  15  16

segunda pasada:, Y TERMINA PUES SE ALCANZA LA DIMENSION 2*2:

A=  11  12
       15  16

es decir esta ultima matriz seria el resultado.

gracias por toda la ayuda que puedas prestarme.


21-Mar-2014 16:05
Invitado (Anom)

El problema consiste en eliminar en cada iteración la primera fila y la primera columna de una matriz hasta obtener una matriz de dimensión 2x2, lo que quiere decir que el número de iteraciones o pasadas deberá ser igual a: Pasadas= Dimensión(matriz) - 2.
En la primera pasada, debemos copiar en cada posición de elemento de la matriz, el siguiente elemento, de la siguiente manera:
en la posición 1,1 se copiará el elemento de la posición 2,2
en la posicion 1,2 se copiará el elemento de la posición 2,3
en la posición 1,3 se copiará el elemento de la posición 2,4

en la posición 2,1 se copiará el elemento de la posición 3,2
en la posicion 2,2 se copiará el elemento de la posición 3,3
en la posición 2,3 se copiará el elemento de la posición 3,4

en la posición 3,1 se copiará el elemento de la posición 4,2
en la posicion 3,2 se copiará el elemento de la posición 4,3
en la posición 3,3 se copiará el elemento de la posición 4,4

Lo que significa que el patrón a seguir será que el elemento i,j deberá albergar al elemento i+1,j+1 después de cada iteración. Algo que hay que tener en cuenta es que para la primera pasada se tomarán las filas y columnas desde la primera hasta la última menos 1; en la segunda pasada desde la primera hasta la última menos dos, y así hasta obtener la matriz 2x2.

Aquí te dejo el código:

 
program matriz;
 
uses CRT;
 
var
 N: integer;
 Mt: array[1..15,1..15] of integer;
 Pasadas: integer;
 i,j,k: integer;
 
procedure mostrarmatriz(n: integer);
var
 i,j: integer;
Begin
  for i:=1 to n do
  Begin
    for j:=1 to n do
	  write(Mt[i,j]:4);
    writeln; 
  End;
 
End; 
 
procedure llenarmatriz(n: integer);
var
  i,j: integer;
Begin
  for i:=1 to N do
   for j:=1 to N do
   Begin
     write('Deme el valor ',i,'-',j,': ');
	 readln(Mt[i,j]);
   End;
End;
 
 
Begin
 write('Deme la dimension de la matriz: ');
 readln(N);
 llenarmatriz(N);
 ClrScr;
 writeln('La matriz es la siguiente: ');
 mostrarmatriz(N);
 Pasadas:= N-2; { Asi obtengo el numero de iteraciones que necesito }
 for k:=1 to Pasadas do
 Begin
   for i:=1 to (N - k) do
     for j:=1 to (N - k) do
	           Mt[i,j]:= Mt[i+1,j+1];  
 End;
 writeln;
 writeln('La matriz resultante es: ');
 mostrarmatriz(Pasadas);
 readln;
End.
 

21-Mar-2014 20:47
oscar gomez

EXCELENTE AMIGO ANOM, GRACIAS POR TU AYUDA Y POR TU CODIGO ERA EXACTAMANETE ESO , GRACIAS.


21-Mar-2014 23:02
Invitado (rocioJ)

hola compañeros y profesor nacho.
disculpa oscar pero el codigo no esta del todo bien, funciona para matrices de dimension par pero creo  que no has probado con otros ejemplos especificamente para matrices de dimension impar y en ese caso el resultado no esta dando como  se espera, he intentado de mi parte modificarlo para que funcione pero no lo logro, por eso acudo al profesor nacho que nos indique el porque no esta resultando para el caso en que la matriz ingresada sea de dimension impar ,por favor probarlo para una matriz de dimension 3  y porejemplo de dimension 5 , asi  observara que el resultado no es el que se espera, porejemplo:

si A=  1    2     3
         4    5     6
         7   8      9

segun el codigo de anom esta dando como resultado la matriz    5,

cuando deberia ser:

5   6
8   9

agradezco la intervencion del profesor nacho para que por favor nos ayude a terminarlo y funcione como debe ser  y ademas si hay otra forma no estaria mal nos la brindara sus sugerencias, mil gracias a todos


22-Mar-2014 00:12
Invitado (Anom)

El programa está bien hecho en cuanto a la generación de la matriz. El error que hay es cuando se manda a imprimir en pantalla la matriz resultante. En las últimas sentencias del programa, específicamente en

 
mostrarmatriz(Pasadas)
 


la cual debería ser:

 
mostrarmatriz(2)
 


porque siempre se va a imprimir una matriz de dos dimensiones, al final.
Pido disculpas por este error.

A continuación les dejo el programa corregido. No sé si habrá otro error como ese:

 
program matriz;
uses CRT;
var
 N: integer;
 Mt: array[1..15,1..15] of integer;
 Pasadas: integer;
 i,j,k: integer;
 
procedure mostrarmatriz(n: integer);
var
 i,j: integer;
Begin
  for i:=1 to n do
  Begin
    for j:=1 to n do
	  write(Mt[i,j]:4);
    writeln; 
  End; 
End; 
 
procedure llenarmatriz(n: integer);
var
  i,j: integer;
Begin
  for i:=1 to N do
   for j:=1 to N do
   Begin
     write('Deme el valor ',i,'-',j,': ');
	 readln(Mt[i,j]);
   End;
End;
 
Begin
 write('Deme la dimension de la matriz: ');
 readln(N);
 llenarmatriz(N);
 ClrScr;
 writeln('La matriz es la siguiente: ');
 mostrarmatriz(N);
 Pasadas:= N-2; { Asi obtengo el numero de iteraciones que necesito }
 for k:=1 to Pasadas do
 Begin
   for i:=1 to (N - k) do
     for j:=1 to (N - k) do
	           Mt[i,j]:= Mt[i+1,j+1];  
 End;
 writeln;
 writeln('La matriz resultante es: ');
 mostrarmatriz(2);                                     { AQUÍ ESTABA EL ERROR }
 readln;
End.
 
 



Saludos.


23-Mar-2014 13:31
Invitado (rocioJ)

excelente Anom, gracias.
lastima que el profesor nacho ademas de tu buena solucion no nos hubiera dado su aporte y quiza mirar la solucion desde otra perspectiva, pero bueno quiza estara ocupado.


24-Mar-2014 01:14
Nacho Cabanes (+31)

Os he leído, pero no he intervenido porque la explicación de Anom me ha parecido muy detallada. Incluso aunque tuviera un problema menor, era suficiente como para guiarte hasta una solución (tuya) perfecta.

Ya sabes mi opinión: prefiero ayudar a orientar un problema antes que resolverlo por completo, para que seas tú (o el usuario que corresponda) quien deba terminarlo y aprenda cosas nuevas mientras lo hace. Y la respuesta de Anom estaba sobradamente bien para eso.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)