Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Prodotto riga per colonna tra due matrice
Forum - C/C++ - Prodotto riga per colonna tra due matrice - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:15
Giovedì, 06/09/2018
Non ha senso non usare la semantica del linguaggio. Gli array a due dimensioni sono usati per le matrici, quindi usali, ad esempio

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int **row_allocation(int **mat1, int **mat2, int row1, int row2, int col1, int col2) {
  6.         int i, j, z;
  7.  
  8.         int **mat3 = (int**)calloc(row1, sizeof(int));
  9.         for (i = 0; i < row1; i++) {
  10.                 mat3[i] = (int*)calloc(col2, sizeof(int));
  11.                 for (j = 0; j < col2; j++) {
  12.                         for (z = 0; z < row2; z++) {
  13.                                 mat3[i][j] += mat1[i][z] * mat2[z][j];
  14.                         }
  15.                 }
  16.         }
  17.  
  18.         return mat3;
  19. }
  20.  
  21. int main(int argc, char *argv[]) {
  22.         int row1 = atoi(argv[1]), col1 = atoi(argv[2]), row2 = atoi(argv[3]), col2 = atoi(argv[4]);
  23.         int i, j;
  24.        
  25.         srand((unsigned int)time(NULL));
  26.  
  27.         printf("\nPrima matrice:\n");
  28.         int **mat1 = (int**)malloc(row1 * sizeof(int));
  29.         for (i = 0; i < row1; i++) {
  30.                 mat1[i] = (int*)malloc(col1 * sizeof(int));
  31.                 for (j = 0; j < col1; j++) {
  32.                         mat1[i][j] = ((int)rand()) / ((int)RAND_MAX / 50);
  33.                         printf("%d\t", mat1[i][j]);
  34.                 } printf("\n");
  35.         }
  36.  
  37.         printf("\nSeconda matrice:\n");
  38.         int **mat2 = (int**)malloc(row2 * sizeof(int));
  39.         for (i = 0; i < row2; i++) {
  40.                 mat2[i] = (int*)malloc(col2 * sizeof(int));
  41.                 for (j = 0; j < col2; j++) {
  42.                         mat2[i][j] = ((int)rand()) / ((int)RAND_MAX / 50);
  43.                         printf("%d\t", mat2[i][j]);
  44.                 } printf("\n");
  45.         }
  46.  
  47.         printf("\nMatrice prodotta per righe:\n");
  48.         int **mt3 = row_allocation(mat1, mat2, row1, row2, col1, col2);
  49.         for (i = 0; i < row1; i++) {
  50.                 for (j = 0; j < col2; j++) {
  51.                         printf("%d\t", mt3[i][j]);
  52.                 } printf("\n");
  53.         }
  54.  
  55.         for (i = 0; i < row1; i++)
  56.                 free(mt3[i]);
  57.         free(mt3);
  58.  
  59.         for (i = 0; i < row2; i++)
  60.                 free(mat2[i]);
  61.         free(mat2);
  62.  
  63.         for (i = 0; i < row1; i++)
  64.                 free(mat1[i]);
  65.         free(mat1);
  66. }



poi potrai ottimizzare tutto quello che vorrai ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
comtel (Member)
Pro


Messaggi: 145
Iscritto: 08/04/2011

Segnala al moderatore
Postato alle 18:00
Venerdì, 07/09/2018
Testo quotato

Postato originariamente da nessuno:

Non ha senso non usare la semantica del linguaggio. Gli array a due dimensioni sono usati per le matrici, quindi usali, ad esempio

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int **row_allocation(int **mat1, int **mat2, int row1, int row2, int col1, int col2) {
  6.         int i, j, z;
  7.  
  8.         int **mat3 = (int**)calloc(row1, sizeof(int));
  9.         for (i = 0; i < row1; i++) {
  10.                 mat3[i] = (int*)calloc(col2, sizeof(int));
  11.                 for (j = 0; j < col2; j++) {
  12.                         for (z = 0; z < row2; z++) {
  13.                                 mat3[i][j] += mat1[i][z] * mat2[z][j];
  14.                         }
  15.                 }
  16.         }
  17.  
  18.         return mat3;
  19. }
  20.  
  21. int main(int argc, char *argv[]) {
  22.         int row1 = atoi(argv[1]), col1 = atoi(argv[2]), row2 = atoi(argv[3]), col2 = atoi(argv[4]);
  23.         int i, j;
  24.        
  25.         srand((unsigned int)time(NULL));
  26.  
  27.         printf("\nPrima matrice:\n");
  28.         int **mat1 = (int**)malloc(row1 * sizeof(int));
  29.         for (i = 0; i < row1; i++) {
  30.                 mat1[i] = (int*)malloc(col1 * sizeof(int));
  31.                 for (j = 0; j < col1; j++) {
  32.                         mat1[i][j] = ((int)rand()) / ((int)RAND_MAX / 50);
  33.                         printf("%d\t", mat1[i][j]);
  34.                 } printf("\n");
  35.         }
  36.  
  37.         printf("\nSeconda matrice:\n");
  38.         int **mat2 = (int**)malloc(row2 * sizeof(int));
  39.         for (i = 0; i < row2; i++) {
  40.                 mat2[i] = (int*)malloc(col2 * sizeof(int));
  41.                 for (j = 0; j < col2; j++) {
  42.                         mat2[i][j] = ((int)rand()) / ((int)RAND_MAX / 50);
  43.                         printf("%d\t", mat2[i][j]);
  44.                 } printf("\n");
  45.         }
  46.  
  47.         printf("\nMatrice prodotta per righe:\n");
  48.         int **mt3 = row_allocation(mat1, mat2, row1, row2, col1, col2);
  49.         for (i = 0; i < row1; i++) {
  50.                 for (j = 0; j < col2; j++) {
  51.                         printf("%d\t", mt3[i][j]);
  52.                 } printf("\n");
  53.         }
  54.  
  55.         for (i = 0; i < row1; i++)
  56.                 free(mt3[i]);
  57.         free(mt3);
  58.  
  59.         for (i = 0; i < row2; i++)
  60.                 free(mat2[i]);
  61.         free(mat2);
  62.  
  63.         for (i = 0; i < row1; i++)
  64.                 free(mat1[i]);
  65.         free(mat1);
  66. }



poi potrai ottimizzare tutto quello che vorrai ...



Ho studiato il tuo codice, l'ho capito ed è ottimo, quello che vorrei chiederti è in pratica questo: Questo tipo di allocazione per default è per righe della matrice, ma se volessi allocare per colonne il prodotto righe per vettori, nel caso proposto da me dove la matrice viene salvata come un array di elementi, cambierebbe dato che gli indici di accesso sono diversi. Non so se ho lasciato intendere bene quello che voglio dire.  

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:44
Domenica, 09/09/2018
No non ho capito. Non ha senso quello che vuoi fare e non ha alcuna utilità.



Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
comtel (Member)
Pro


Messaggi: 145
Iscritto: 08/04/2011

Segnala al moderatore
Postato alle 13:59
Domenica, 09/09/2018
Testo quotato

Postato originariamente da nessuno:

No non ho capito. Non ha senso quello che vuoi fare e non ha alcuna utilità.




Questo è il testo dell'esercizio:
Ripetere l’esercizio precedente sul prodotto righexcolonne di matrici [esercizio già fatto], una prima volta, allocando tutte
le matrici in memoria per colonne ed, una seconda volta, per righe. Per ciascun tipo di allocazione in memoria,
scrivere due function C per il prodotto righexcolonne: una che acceda a tutte le matrici per colonne e l’altra per
righe. Confrontare i tempi d’esecuzione delle due modalità di accesso alle matrici rispetto alla loro allocazione
in memoria, deducendo quindi il tipo di accesso più efficiente rispetto al criterio di memorizzazione.

Spero che da quest'ultimo si capisca meglio.

Ultima modifica effettuata da comtel il 09/09/2018 alle 13:59
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo