Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213

    [c] Prodotto righe per colonne

    Ho una function che dovrebbe calcolarmi il prodotto righe per colonne ma effettivamente i risultati dell'ultima riga quando le due matrici hanno dimensioni diverse non sono quelli giusti...
    Dove potrebbe essere l'errore? Sono sicuro che si trovi nella function...

    codice:
    void righe_x_colonne (int *a, int *b, int *c, short int m, short int n, short int p)
    {
        int i, j, k;
    
        for(i=0;i<m;i++)
        {
            printf("\t");
            for(j=0;j<n; j++)
            {
                for(k=0;k<p;k++)
                {
                    *(c + i*n + j) += *(a + i*n + k) * (*(b + m*k + j));
                }
                printf("%d ", *(c + i*n + j));
            }
            printf("\n");
        }
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Puoi inserire anche il main con cui chiami quella funzione e i dati in input/output ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    void righe_x_colonne (int *a, int *b, int *c, short int m, short int n, short int p);
    void matrice (int *a, short int m, short int n);
    
    int main()
    {
        short m, n, p1, p2;
        int *a, *b, *c;
        printf("Programmazione II - Esercizio 29\n");
    
        do
        {
            printf("\nInserisci le dimensioni delle matrici A e B (ricorda le colonne di A uguali alle righe di B)\n\n");
            printf("Inserisci il numero di righe della matrice A\n");
            scanf("%hd", &m);
            printf("Inserisci il numero di colonne della matrice A\n");
            scanf("%hd", &p1);
            printf("Inserisci il numero di righe della matrice B\n");
            scanf("%hd", &p2);
            printf("Inserisci il numero di colonne della matrice B\n");
            scanf("%hd", &n);
        } while (p1 != p2);
    
        a = calloc(m*p1, sizeof(int));
        b = calloc(p2*n, sizeof(int));
        c = calloc(m*n, sizeof(int));
    
        printf("\nInserisci gli elementi della matrice A[%hd][%hd]\n", m, p1);
        matrice(a, m, p1);
        printf("\nInserisci gli elementi della matrice B[%hd][%hd]\n", p2, n);
        matrice(b, p2, n);
    
        printf("\nMatrice C[%hd][%hd] prodotto di AxB\n", m, n);
        righe_x_colonne(a, b, c, m, n, p1);
    
        free(a);
        free(b);
        free(c);
    
        return 0;
    }
    void matrice (int *a, short int m, short int n)
    {
        short int i, j;
        int num;
    
        for(i=0;i<m;i++)
        {
            for(j=0;j<n;j++)
            {
                printf("Inserisci elemento [%hd][%hd] = ", i+1, j+1);
                scanf("%d", &num);
                *(a + i*n + j) = num;
            }
        }
    }
    void righe_x_colonne (int *a, int *b, int *c, short int m, short int n, short int p)
    {
        int i, j, k;
    
        for(i=0;i<m;i++)
        {
            printf("\t");
            for(j=0;j<n; j++)
            {
                for(k=0;k<p;k++)
                {
                    *(c + i*n + j) = *(c + i*n + j) + *(a + i*n + k) * *(b + m*k + j);
                }
                printf("%d ", *(c + i*n + j));
            }
            printf("\n");
        }
    }
    Ecco a te, ti ringrazio per l'interesse

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ho scritto così il tuo main

    codice:
        int i, j, k;
    	int z1, z2, z3;
    
        for(i=0;i<m;i++)
        {
            //printf("\t");
            for(j=0;j<n; j++)
            {
                for(k=0;k<p;k++)
                {
    				z1 = i*n+j; 
    				z2 = i*n+k;
    				z3 = m*k+j;
    				printf("%d + %d x %d\n", z1, z2, z3);
                    *(c + z1) = *(c + z1) + *(a + z2) * *(b + z3);
                }
                //printf("%d ", *(c + z1));
            }
            printf("\n");
        }
    per controllare gli indici che utilizzi nelle operazioni di somma/prodotto

    Come puoi controllare nel caso di matrici 3x2 e 2x3 gli indici vanno oltre il consentito ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213
    Se ho capito bene il tuo codice mi riporta gli indici delle componenti per l'operazione del prodotto scalare proprio come sono rappresentate in memoria (cioè in un vettore scalare) e giustamente se metto due matrici 3x2 e 2x3 non capisco perchè mi escono 7 e 8 quando dovrebbero arrivare sino a 6 giusto? Ma poi perchè su alcune funziona e altre no? Proprio non ci riesco...

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Evidentemente l'algoritmo che hai usato per implementare la regola della moltiplicazione degli elementi della matrice non è corretto.

    Rivedi la teoria, con carta e matita, della moltiplicazione di una matrice 3x2 per una 2x3 e segna quali dovrebbero essere gli indici sulla carta. Poi rivedi il codice.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213
    Grazie per la pazienza e i consigli che mi stai dando.
    Ripetendo l'algoritmo a carta e penna e i risultati che dovrei ottenere mi accorgo che è la seconda colonna dell'operazione ad essere sbagliata ed è quindi la matrice A a non essere selezionata per bene...

    Purtroppo non riesco a capire proprio come sia la formula della seconda colonna...

    edit: finalmente sono riuscito a risolvere. Le tre formule credo siano queste

    z1 = i*n+j;
    z2 = i*p+k;
    z3 = m*k+j;

    Solo che in fase di run crasha il programma >.<

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Scusa, puoi scrivere qui cosa hai scoperto con carta e matita ... ? Spiegalo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213
    Scusa se ti sto rompendo!
    Ora sono riuscito addirittura a farlo funzionare, tutto apposto.
    Comunque avevo scoperto che in pratica le cifre nella seconda colonna delle operazioni (che poi erano le cifre delle righe di A) dovevano ripetersi per tante volte quante le componenti delle colonne di B, per esempio nel caso delle matrici 3x2 e 2x3 erano sempre 2 che si ripetevano per 3 volte. Ciò che non consideravo io era comunque il fatto che non consideravo il numero delle colonne di A e delle righe di B (la variabile p) che deve essere uguale affinchè sia possibile il prodotto righe x colonne ma che nello stesso tempo era un valore delle due matrici.

    Finalmente sono riuscito a risolverlo, ti devo davvero molto, stavo impazzendo e invece tu mi hai fatto ragionare grazie.

    So forse che nella spiegazione non sono stato chiaro come te, ma fidati qualcosa ci ho capito dove ho sbagliato e ti chiedo ancora scusa per il disturbo.

    Grazie e alla prossima (XD)!

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.