06/09/18 20:15
Non ha senso non usare la semantica del linguaggio. Gli array a due dimensioni sono usati per le matrici, quindi usali, ad esempio
poi potrai ottimizzare tutto quello che vorrai ...
#include <stdio.h> #include <stdlib.h> #include <time.h> int **row_allocation(int **mat1, int **mat2, int row1, int row2, int col1, int col2) { int i, j, z; int **mat3 = (int**)calloc(row1, sizeof(int)); for (i = 0; i < row1; i++) { mat3[i] = (int*)calloc(col2, sizeof(int)); for (j = 0; j < col2; j++) { for (z = 0; z < row2; z++) { mat3[i][j] += mat1[i][z] * mat2[z][j]; } } } return mat3; } int main(int argc, char *argv[]) { int row1 = atoi(argv[1]), col1 = atoi(argv[2]), row2 = atoi(argv[3]), col2 = atoi(argv[4]); int i, j; srand((unsigned int)time(NULL)); printf("\nPrima matrice:\n"); int **mat1 = (int**)malloc(row1 * sizeof(int)); for (i = 0; i < row1; i++) { mat1[i] = (int*)malloc(col1 * sizeof(int)); for (j = 0; j < col1; j++) { mat1[i][j] = ((int)rand()) / ((int)RAND_MAX / 50); printf("%d\t", mat1[i][j]); } printf("\n"); } printf("\nSeconda matrice:\n"); int **mat2 = (int**)malloc(row2 * sizeof(int)); for (i = 0; i < row2; i++) { mat2[i] = (int*)malloc(col2 * sizeof(int)); for (j = 0; j < col2; j++) { mat2[i][j] = ((int)rand()) / ((int)RAND_MAX / 50); printf("%d\t", mat2[i][j]); } printf("\n"); } printf("\nMatrice prodotta per righe:\n"); int **mt3 = row_allocation(mat1, mat2, row1, row2, col1, col2); for (i = 0; i < row1; i++) { for (j = 0; j < col2; j++) { printf("%d\t", mt3[i][j]); } printf("\n"); } for (i = 0; i < row1; i++) free(mt3[i]); free(mt3); for (i = 0; i < row2; i++) free(mat2[i]); free(mat2); for (i = 0; i < row1; i++) free(mat1[i]); free(mat1); }
poi potrai ottimizzare tutto quello che vorrai ...
07/09/18 16:00
comtel
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
poi potrai ottimizzare tutto quello che vorrai ...
Non ha senso non usare la semantica del linguaggio. Gli array a due dimensioni sono usati per le matrici, quindi usali, ad esempio
#include <stdio.h> #include <stdlib.h> #include <time.h> int **row_allocation(int **mat1, int **mat2, int row1, int row2, int col1, int col2) { int i, j, z; int **mat3 = (int**)calloc(row1, sizeof(int)); for (i = 0; i < row1; i++) { mat3[i] = (int*)calloc(col2, sizeof(int)); for (j = 0; j < col2; j++) { for (z = 0; z < row2; z++) { mat3[i][j] += mat1[i][z] * mat2[z][j]; } } } return mat3; } int main(int argc, char *argv[]) { int row1 = atoi(argv[1]), col1 = atoi(argv[2]), row2 = atoi(argv[3]), col2 = atoi(argv[4]); int i, j; srand((unsigned int)time(NULL)); printf("\nPrima matrice:\n"); int **mat1 = (int**)malloc(row1 * sizeof(int)); for (i = 0; i < row1; i++) { mat1[i] = (int*)malloc(col1 * sizeof(int)); for (j = 0; j < col1; j++) { mat1[i][j] = ((int)rand()) / ((int)RAND_MAX / 50); printf("%d\t", mat1[i][j]); } printf("\n"); } printf("\nSeconda matrice:\n"); int **mat2 = (int**)malloc(row2 * sizeof(int)); for (i = 0; i < row2; i++) { mat2[i] = (int*)malloc(col2 * sizeof(int)); for (j = 0; j < col2; j++) { mat2[i][j] = ((int)rand()) / ((int)RAND_MAX / 50); printf("%d\t", mat2[i][j]); } printf("\n"); } printf("\nMatrice prodotta per righe:\n"); int **mt3 = row_allocation(mat1, mat2, row1, row2, col1, col2); for (i = 0; i < row1; i++) { for (j = 0; j < col2; j++) { printf("%d\t", mt3[i][j]); } printf("\n"); } for (i = 0; i < row1; i++) free(mt3[i]); free(mt3); for (i = 0; i < row2; i++) free(mat2[i]); free(mat2); for (i = 0; i < row1; i++) free(mat1[i]); free(mat1); }
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.
aaa
09/09/18 11:59
comtel
Postato originariamente da nessuno:
No non ho capito. Non ha senso quello che vuoi fare e non ha alcuna utilità.
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 09/09/18 11:59
aaa