Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1

    [C] prodotto fra matrici.

    Salve gente,
    ho un problema con un prodotto tra matrici, non so perché, la sintassi è giusta (il compilatore non mi da nessun errore) però il risultato è errato!
    Facendo delle ricerche su internet, ho notato che gli indici utilizzati sono quelli che ho utilizzato io..
    Nel codice che posto c'è anche una funziona che calcola la trasposta poiché il programma sarebbe calcolare il prodotto tra la trasposta(A)*A.
    Ho già testato il codice riguardante il calcolo della trasposta e funziona correttamente.. Inoltre se le due matrici non sono quadrate il prodotto non funziona proprio, il programma non funziona proprio.
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    void trasposta(int **trasp, int **matrice, int righe, int colonne);
    void moltiplicazione(int **ris, int **trasp, int **matrice, int righe,
    		int colonne);
    
    
    int main(void) {
    	int righe, colonne, i, j;
    	int **matrice;
    	int **trasp;
    	int **ris;
    
    
    	printf(" Righe........: ");
    	fflush(stdout);
    	scanf("%d", &righe);
    	printf(" Colonne......: ");
    	fflush(stdout);
    	scanf("%d", &colonne);
    	puts("");
    
    
    	matrice = (int**) malloc((righe * sizeof(int*)));
    	trasp = (int**) malloc((colonne * sizeof(int*)));
    	ris = (int**) malloc((righe * sizeof(int*)));
    
    
    	for (i = 0; i < righe; i++) {
    		matrice[i] = (int*) malloc(colonne * sizeof(int));
    	}
    
    
    	for (i = 0; i < righe; i++) {
    		ris[i] = (int*) malloc(colonne * sizeof(int));
    	}
    
    
    	for (i = 0; i < colonne; i++) //poichè la matrice trasposta ha num righe e colonne invertire
    			{
    		trasp[i] = (int*) malloc(righe * sizeof(int));
    	}
    
    
    	for (i = 0; i < righe; ++i) {
    		for (j = 0; j < colonne; ++j) {
    			printf("Inserisci elemento riga %d e colonna %d: ", i, j);
    			fflush(stdout);
    			scanf("%d", &matrice[i][j]);
    			printf("\n");
    			fflush(stdout);
    		}
    	}
    
    
    	for (i = 0; i < colonne; ++i) {
    		for (j = 0; j < righe; ++j) {
    			trasp[i][j] = 0;
    		}
    	}
    
    
    	for (i = 0; i < righe; ++i) {
    		for (j = 0; j < colonne; ++j) {
    			ris[i][j] = 0;
    		}
    	}
    
    
    	trasposta(trasp, matrice, righe, colonne);
    	moltiplicazione(ris, matrice, trasp, righe, colonne);
    
    
    	for (i = 0; i < righe; ++i) {
    		for (j = 0; j < colonne; ++j) {
    			printf("matrice[%d][%d]= %d ", i, j, matrice[i][j]);
    			fflush(stdout);
    		}
    		printf("\n");
    		fflush(stdout);
    	}
    
    
    	for (i = 0; i < colonne; ++i) {
    		for (j = 0; j < righe; ++j) {
    			printf("trasp[%d][%d]= %d ", i, j, trasp[i][j]);
    			fflush(stdout);
    		}
    		printf("\n");
    		fflush(stdout);
    	}
    
    
    	for (i = 0; i < colonne; ++i) {
    		for (j = 0; j < righe; ++j) {
    			printf("ris[%d][%d]= %d ", i, j, ris[i][j]);
    			fflush(stdout);
    		}
    		printf("\n");
    		fflush(stdout);
    	}
    
    
    	return 0;
    }
    
    
    void trasposta(int **trasp, int **matrice, int righe, int colonne) {
    	int i, j; /*Dichiaro la variabile temporanea per lo scambio*/
    	for (i = 0; i < colonne; i++) {
    		for (j = 0; j < righe; j++) {
    
    
    			trasp[i][j] = matrice[j][i];
    		}
    	}
    }
    
    
    void moltiplicazione(int **ris, int **trasp, int **matrice, int righe,
    		int colonne) {
    	int i, j, k;
    	int tmp = 0;
    	for (i = 0; i < righe; i++) {
    		for (j = 0; j < colonne; j++) {
    			for (k = 0; k < righe; k++) {
    				tmp += matrice[i][k] * trasp[k][j];
    				printf("variabile temporanea %d", tmp);
    				fflush(stdout);
    				printf("\n");
    				fflush(stdout);
    			}
    			ris[i][j] = tmp;
    			//tmp=0;
    
    
    		}
    	}
    }
    Ecco il risultato stampato a video:
    Righe........: 2
    Colonne......: 2


    Inserisci elemento riga 0 e colonna 0: 1


    Inserisci elemento riga 0 e colonna 1: 2


    Inserisci elemento riga 1 e colonna 0: 1


    Inserisci elemento riga 1 e colonna 1: 2


    variabile temporanea 1
    variabile temporanea 2
    variabile temporanea 4
    variabile temporanea 6
    variabile temporanea 8
    variabile temporanea 10
    variabile temporanea 14
    variabile temporanea 18
    matrice[0][0]= 1 matrice[0][1]= 2
    matrice[1][0]= 1 matrice[1][1]= 2
    trasp[0][0]= 1 trasp[0][1]= 1
    trasp[1][0]= 2 trasp[1][1]= 2
    ris[0][0]= 2 ris[0][1]= 6
    ris[1][0]= 10 ris[1][1]= 18


    Ho provato anche a stampare il valore progressivo della variabile tmp, ma ha dei valori completamente sballati
    Maria

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Mi sa che manca un

    tmp=0;

    dopo il secondo for
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Non va lo stesso
    Se vedi nel codice avevo azzerato tmp alla fine del calcolo, ho provato in quel modo, senza (per questo è rimasto commentato) e adesso ho provato come hai detto tu, a metterlo tra il for fi j e il for di k.. Però mi da sempre risultato errato!!
    Maria

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Quale risultato ti dà adesso? Quale dovrebbe essere?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    quello che mi da:
    ris[0][0]= 2 ris[0][1]= 4
    ris[1][0]= 4 ris[1][1]= 8
    quello che dovrebbe essere:
    ris[0][0]= 5 ris[0][1]= 5
    ris[1][0]= 5 ris[1][1]= 5
    Maria

  6. #6
    quello che mi da:
    ris[0][0]= 2 ris[0][1]= 4
    ris[1][0]= 4 ris[1][1]= 8
    quello che dovrebbe essere:
    ris[0][0]= 5 ris[0][1]= 5
    ris[1][0]= 5 ris[1][1]= 5
    Maria

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Quando hai chiamato la funzione moltiplicazione hai invertito due parametri. Devono essere

    moltiplicazione(ris, trasp, matrice, righe, colonne);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Perfetto.. Il risultato adesso è giusto, solo che se le matrici non sono quadrate non funziona (invece dovrebbe funzionare correttamente)
    Maria

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Ad esempio, con quale matrice? E con quali risultati?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Mi da proprio errore, non mostra nessun risultato.. E' un errore di segmentazione (non aggiunge altri dettagli ) io penso sia un errore di indici nel triplo for innestato, ma non riesco a trovare la configurazione giusta!
    Maria

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.