Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Matriz con punteros

Estas en el tema de Matriz con punteros en el foro de C/C++ en Foros del Web. Hola, estoy haciendo una funcion que multiplica dos matrices de orden n; como he leido, para enviar como parametro una matriz es necesario indicar el ...
  #1 (permalink)  
Antiguo 20/04/2014, 18:35
 
Fecha de Ingreso: enero-2013
Mensajes: 10
Antigüedad: 11 años, 2 meses
Puntos: 0
Pregunta Matriz con punteros

Hola, estoy haciendo una funcion que multiplica dos matrices de orden n;
como he leido, para enviar como parametro una matriz es necesario indicar
el indice de la columna.
Ejemplo:
Código C:
Ver original
  1. void multiplicacion(float M1[][2], float M2[][2],float M3[][2],int n){
  2.    //cosas
  3. }

Sin embargo, la idea es que este valor sea variable, por lo que no sabria el valor que deberia ir ahi. Al parecer la solucion seria utilizar punteros ._____. La verdad es que no se mucho de punteros, o en realidad no se manejarlos .-.
Mi programa ,sin los punteros es este:

Código C:
Ver original
  1. void multiplicacion(float M1[][2], float M2[][2],float M3[][2],int n){
  2.      int i,j,k;
  3.     float a,b;
  4.     for (i=0;i < n; i++){
  5.         for (j=0; j < n; j++){
  6.              M3[i][j] = 0.0;
  7.             for(k=0; k < n; k++){  
  8.                  a= M1[i][k];
  9.                 b= M2[k][j];
  10.                 M3[i][j] +=( a*b);
  11.              }
  12.                  printf("%f  ", M3[i][j]);
  13.          }
  14.          printf("\n");
  15.      } 
  16. }
  17. int main(){
  18.      int i,j;
  19.      float M1[2][2]= { {2.0,3.0},
  20.                      {2.0,3.0} };
  21.     float M2[2][2]= { {3.0,2.0},
  22.                      {3.0,2.0} };
  23.     float M3[2][2];
  24.         multiplicacion(M1,M2,M3,2);
  25.     for (i=0 ; i < 2 ; i++){
  26.         for (j=0; j< 2 ; j++){
  27.             printf("%f  ", M3[i][j]);
  28.         }
  29.         printf("\n");
  30.     }
  31.     return 0;
  32. }

Por favor, alguien que me diga como deberia quedar con punteros.
Se que la funcion deberia recibir los parametros asi:
Código C:
Ver original
  1. void multiplicacion(float **M1, float **M2,float **M3,int n){
  2.      // cosas
  3. }

Pero no se como trabajar con ellos en el main, ni dentro de la funcion, please ayuda.
  #2 (permalink)  
Antiguo 22/04/2014, 03:20
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 meses
Puntos: 49
Respuesta: Matriz con punteros

Es más fácil que lo veas a explicarlo.

El código es totalmente modular: se introducen las dimensiones, se asigna memoria dinámicamente , se rellenan, se multiplican y por último se libera la memoria:

Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. void leer_dimen_coeficientes( const char* msg, int* pnum );
  4. int** asig_memoria( int fil, int col );
  5. void ver_matriz( int **mat, int fil, int col );
  6. void introducir_matriz( const char* msg, const char* nombre, int** mat, int fil, int col );
  7. void crear_matriz_producto( int **c,int **a,int **b,int fil, int col,int co1);
  8. void liberar_mem_vector( int** mat, int fil );
  9.  
  10. int main( void )
  11. {
  12.     int **A;
  13.     int fil_1, col_1;
  14.     int **B;
  15.     int fil_2, col_2;
  16.     int **C;
  17.     leer_dimen_coeficientes( "Introduce el numero de filas de A: ", &fil_1 );
  18.     leer_dimen_coeficientes( "Introduce el numero de columnas de A: ", &col_1 );
  19.     A = asig_memoria( fil_1, col_1 );
  20.     introducir_matriz( "Introduce los valores de los elementos de A:\n","A", A, fil_1, col_1 );
  21.     puts("A:");
  22.     ver_matriz( A, fil_1, col_1 );
  23.  
  24.     /*leer_dimen_coeficientes( "Introduce el numero de filas de B = columnas de A: ", &fil_2 );*/
  25.     fil_2 = col_1; /** <== condicion para que se puedan multiplicar **/
  26.     leer_dimen_coeficientes( "Introduce el numero de columnas de B : ", &col_2 );
  27.     B = asig_memoria( fil_2, col_2 );
  28.     introducir_matriz( "Introduce los valores de los elementos de B:\n","B", B, fil_2, col_2 );
  29.     puts("B:");
  30.     ver_matriz( B, fil_2, col_2 );
  31.  
  32.     C= asig_memoria( fil_1, col_2 );
  33.     crear_matriz_producto(  C,A,B, fil_1,col_2, col_1 );
  34.     puts("AxB:");
  35.     ver_matriz( C, fil_1, col_2 );
  36.  
  37.     liberar_mem_vector( A, fil_1 );
  38.     liberar_mem_vector( B, fil_2 );
  39.     liberar_mem_vector( C, fil_1 );
  40.  
  41.     return 0;
  42. }
  43. void leer_dimen_coeficientes( const char* msg, int* pnum )
  44. {
  45.    int c;
  46.    printf( "%s", msg );
  47.    fflush( stdout );
  48.    scanf( "%d", pnum );
  49.    while( (c = getchar()) != '\n' && c != EOF );
  50. }
  51. int** asig_memoria( int fil, int col )
  52. {
  53.     int i;
  54.     int** mat;
  55.     mat = malloc( fil * sizeof *mat );
  56.       for( i = 0; i < fil; ++i )
  57.          mat[i] = malloc( col * sizeof **mat );
  58.     return mat;
  59. }
  60. void introducir_matriz( const char* msg, const char* nombre, int** mat, int fil, int col )
  61. {
  62.    int c, i, j;
  63.    printf( "%s", msg );
  64.    fflush( stdout );
  65.    for( i = 0; i < fil; ++i )
  66.       for( j = 0; j < col; ++j )
  67.       {
  68.          printf( "%s[%d][%d] = ", nombre, i, j );
  69.          fflush( stdout );
  70.          scanf( "%d", &mat[i][j] );
  71.       }
  72.    while( (c = getchar()) != '\n' && c != EOF );
  73. }
  74. void ver_matriz( int **mat, int fil, int col )
  75. {
  76.    int i,j;
  77.    for( i = 0; i < fil; ++i )
  78.    {
  79.       for( j = 0; j < col; ++j )
  80.          printf( "%4d ",  mat[i][j]);
  81.       putchar('\n');
  82.    }
  83. }
  84. void crear_matriz_producto( int **c,int **a,int **b,int fil1, int col2 ,int co1)
  85. {
  86.     int i,j,k;
  87.     for( i = 0; i < fil1; ++i )
  88.         for( j = 0; j < col2; ++j )
  89.             {
  90.                 c[i][j] = 0;
  91.                     for ( k = 0; k <co1; k++)
  92.                         c[i][j] += a[i][k]*b[k][j];
  93.             }
  94.  
  95. }
  96. void liberar_mem_vector( int** mat, int fil )
  97. {
  98.    int i;
  99.    for( i = 0; i < fil; ++i )
  100.       free( mat[i] );
  101.    free( mat );
  102. }

¡¡¡Saluditos!!!

  #3 (permalink)  
Antiguo 22/04/2014, 07:11
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 5 meses
Puntos: 38
Respuesta: Matriz con punteros

Hasta yo voy a mirarlo ^^
  #4 (permalink)  
Antiguo 22/04/2014, 07:32
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Matriz con punteros

Cita:
he leido, para enviar como parametro una matriz es necesario indicar
el indice de la columna.
Cita:
Sin embargo, la idea es que este valor sea variable, por lo que no sabria el valor que deberia ir ahi. Al parecer la solucion seria utilizar punteros...
No sé si esto es lo que quieres saber, pero si el prototipo de la función es como pones:
Código C++:
Ver original
  1. void multiplicacion(float M1[][2], float M2[][2],float M3[][2],int n);

Es decir, que los arrays que quieres multiplicar son de NX2, siempre puedes averiguar el valor de "n" mediante sizeof();
Así, tu llamada a la función será:
Código C++:
Ver original
  1. multiplicacion(M1,M2,M3,sizeof(M1)/sizeof(M1[0]));
Esto quiere decir que el tamaño de un array/el tamaño de uno de sus elementos es = al nº de elementos.

No sé si esto resuelve tus dudas. Si no es así, el código de leosansan te resuelve perfectamente el problema para arrays de cualquier dimensión.
  #5 (permalink)  
Antiguo 22/04/2014, 08:00
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 5 meses
Puntos: 38
Respuesta: Matriz con punteros

me hago un lio de pitote, jajaj os referis a columnas y filas pero es lo mismo creo que todo el raleo viene de eso XDDD
En realidad no existe columnas ni filas yo por ejemplo lo llamo asi que es como veo mejor[col, fil]

cuando paso la lonjitud de algo prefiero que sea por ejemplo la lonjitud del string imagine que tenemos un texto:
|---------fila---------------->
aaaaaaaaaaaaaaaaaaaa C
bbbbbbbbbbbbbbbbbbbb O
ccccccccccccccccccccccccccc L


¿tu que le pasas? la linea o la cantidad de palabras guardadas en cada linea? jajaj
Me tenéis un raleo mental jajaj y eso que ya había hasta entendio el tema XDDD

Ya se que no hay nombre pero uso la forma a la que realmente se organiza en memoria o eso creo.
O puede que ya no sepa nada de matrices jajaj vaya raleo mental

en la memoria es así no ?
aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbcccccccccc ccccccccccccccccc

https://www.youtube.com/watch?v=TEyLHaTFGEU

de echo cuando paso a una función debo indicar la lonjitud que tiene la primera linea: aaaaaaaaaaaaaaaaaaaa

o sea le tengo que decir el valor que tiene la X abajo


si declaro

int columna 2;
int fila 5;
int matriz [columna][fila];


Seria así como la veríamos:

[0,0][0,1][0,2][0,3][0,4]
[1,0][1,1][1,2][1,3][1,4]

realmente en memoria va así:

[0,0][0,1][0,2][0,3][0,4][1,0][1,1][1,2][1,3][1,4]

realmente todo es una fila: consecutiva en memoria.

claro esta que si llamo a columna de fila y fila de columna los nombres invierten pero en memoria seguirá siendo igual o sea que cuando la paso la matriz a una funcion le indico la lonjitud que tiene

[0,0][0,1][0,2][0,3][0,4] <-------0.4 ya que la linea de abajo es lo mismo le paso cuantas lineas tiene aparte y todo listo XD
[1,0][1,1][1,2][1,3][1,4]

corrígeme si me equivoco XD

Última edición por vangodp; 22/04/2014 a las 08:11

Etiquetas: funcion, int, matriz, programa, punteros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:43.