Oppure

Loading
06/09/18 10:20
lumo
Non è un errore, è più confusione terminologica.
La matrice in matematica è una rappresentazione di una trasformazione lineare, in un programma si può rappresentare in diversi modi tra cui uno di questi è quello con un array ( e anche il più semplice secondo me).
La confusione sta nel fatto che anche in programmazione si dice matrice, ma in realtà si dovrebbe dire array multidimensionale lol
aaa
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

#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

#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 9:44
No non ho capito. Non ha senso quello che vuoi fare e non ha alcuna utilità.

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à.



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