Prodotto matrice vettore

di il
7 risposte

Prodotto matrice vettore

Anche quì, come nel caso dell'argomento "Metodo di eliminazione di Gauss senza pivoting" ho il problema che il programma parte, ovvero non ci sono errori tecnici segnalati dal pc, ma i risultati, eccetto il primo, sono completamente sbagliati.
Algoritmo per il calcolo del prodotto tra matrice n*m e vettore di dimensione m;

Vi posto il codice della function
float gaxpy(float A[][100], float b[], float x[], int n, int m)
{
int i, j;

for(i=0;i<n;i++)
	x[i]==0;

for(i=0;i<n;i++) /*ciclo sulle righe */
	for(j=0;j<m;j++)
		x[i]=x[i]+A[i][j]*b[j];

return x[n];
}
E questo è il programma chiamante
#include<stdio.h>
float gaxpy(float A[][100], float b[], float x[], int n, int m);
main()
{int i, j, n, m;
printf("Inserire la dimensione del vettore m=");
scanf("%d", &m);
printf("La matrice ha dimensioni nxm, con m=%d e n=", m);
scanf("%d", &n);

float A[n][m], b[m], x[n];
printf("Inserire le n*m=%d componenti della matrice A per righe:\n", n*m);

for(i=0;i<n;i++)
	for(j=0;j<m;j++)
	{
	printf("A[%d][%d]=", i, j);
	scanf("%f", &A[i][j]);
	};

printf("Inserire le m=%d componenti del vettore b:\n", m);
for(i=0;i<m;i++)
	{
	printf("b[%d]=", i);
	scanf("%f", &b[i]);
	};

x[n]=gaxpy(A, b, x, n, m);
printf("Le n=%d componenti del vettore x prodotto di matrice n*m per vettore di lunghezza m sono:\n", n);
for(i=0;i<n;i++)
	printf("x[%d]=%f\n", i, x[i]);
}
Io credo di commettere lo stesso errore sia in questo algoritmo che in quello di gauss.
Spero che mi possiate aiutare.
Grazie!!

7 Risposte

  • Re: Prodotto matrice vettore

    Proviamo a capirci con un esempio, tu hai:

    matrice
    1 2 3
    4 5 6
    7 8 9

    vettore
    0
    1
    2

    matrice e vettore e vuoi un vettore prodotto che sia

    vettore risultato
    8
    17
    26

    E' corretto questo?

    Se questo è corretto allora dove scrivi:
    
    x[n]=gaxpy(A, b, x, n, m);
    
    Sostituiscilo con:
    
         for(i=0; i<m; i++)
             x[i]=gaxpy(A, b, x, n, m);
    
    E vedi se funziona.
  • Re: Prodotto matrice vettore

    Ho provato a sostituire non alla lettera ciò che hai scritto tu, perchè ho necessità di cambiare l'indice n in i, essendo n e non m la dimensione del vettore risultato.
    Niente da fare, sempre numeri a cacchio.....
  • Re: Prodotto matrice vettore

    
    #include <stdio.h>
    #include <stdlib.h>
    
    #define debug 1
    
    #define MAX 100
    
    void gaxpy(float A[][MAX], float b[], float x[], int n, int m);
    
    int main() {
        int i, j, n, m;
        printf("Inserire la dimensione del vettore m=");
        scanf("%d", &m);
        printf("La matrice ha dimensioni nxm, con m=%d e n=", m);
        scanf("%d", &n);
    
        float A[MAX][MAX], b[MAX], x[MAX];
    
        printf("Inserire le n*m=%d componenti della matrice A per righe:\n", n*m);
    
        for(i=0; i<n; i++) {
            for(j=0; j<m; j++) {
                printf("A[%d][%d]=", i, j);
                scanf("%f", &A[i][j]);
            }
        }
    
        printf("Inserire le m=%d componenti del vettore b:\n", m);
        for(i=0; i<m; i++) {
            printf("b[%d]=", i);
            scanf("%f", &b[i]);
        };
    #if debug
        for(i=0; i<n; i++)
            for(j=0; j<m; j++) {
                printf("A[%d][%d]=", i, j);
                printf("%f\n", A[i][j]);
            }
        for(i=0; i<m; i++) {
            printf("b[%d]=", i);
            printf("%f\n", b[i]);
        }
    #endif
    
        gaxpy(A, b, x, n, m);
    
        printf("Le n=%d componenti del vettore x prodotto di matrice n*m per vettore di lunghezza m sono:\n", n);
        for(i=0; i<n; i++)
            printf("x[%d]=%f\n", i, x[i]);
    
        return 0;
    }
    
    
    void gaxpy(float A[][MAX], float b[], float x[], int n, int m) {
        int i, j;
    
        for(i=0; i<n; i++)
            x[i]=0;
    
    #if debug
        for(i=0; i<n; i++) {
            for(j=0; j<m; j++) {
                printf("A[%d][%d]=", i, j);
                printf("%f\n", A[i][j]);
            }
        }
        for(i=0; i<m; i++) {
            printf("b[%d]=", i);
            printf("%f\n", b[i]);
        }
        for(i=0; i<m; i++) {
            printf("x[%d]=", i);
            printf("%f\n", x[i]);
        }
    #endif
    
    
        for(i=0; i<n; i++) /*ciclo sulle righe */
            for(j=0; j<m; j++)
                x[i] += A[i][j]*b[j];
    
        return;
    }
    
    
    Occhio... non mi ero accorto subito che hai dichiarato i vettori con dei parametri, in C ciò non è standard, non si può fare. Forse qualche compilatore per C++ te lo lascia fare ma non è corretto.

    Ti posto il programma funzionante. Ho aggiunto delle linee di debug, che puoi togliere senza probelmi dall' if debug a endif.

    Spero ti sia stato di aiuto.
  • Re: Prodotto matrice vettore

    Ho provato a creare il programma utilizzando l'allocazione dinamica, perchè è questo che viene chiesto dalla prof.
    Ti posto il codice
    #include<stdio.h>
    #include<stdlib.h>
    float gaxpy(float **A, float *b, float *x, int n, int m);
    main()
    {int i, j, n, m;
    float **A, *b, *x;
    
    A=(float **)malloc(n*sizeof(float *)); /*dichiarazione dinamica della matrice */
    for(i=0;i<n;i++)
    	A[i]=(float *)malloc(m*sizeof(float));
    
    b=(float *)malloc(m*sizeof(float)); /*dichiarazione dinamica del vettore */
    
    printf("Inserire la dimensione del vettore m=");
    scanf("%d", &m);
    printf("La matrice ha dimensioni nxm, con m=%d e n=", m);
    scanf("%d", &n);
    
    printf("Inserire le n*m=%d componenti della matrice A per righe:\n", n*m);
    
    for(i=0;i<n;i++)
    	for(j=0;j<m;j++)
    	{
    	printf("A[%d][%d]=", i, j);
    	scanf("%f", &A[i][j]);
    	};
    
    printf("Inserire le m=%d componenti del vettore b:\n", m);
    for(i=0;i<m;i++)
    	{
    	printf("b[%d]=", i);
    	scanf("%f", &b[i]);
    	};
    
    x[n]=gaxpy(A, b, x, n, m);
    
    printf("Le n=%d componenti del vettore x prodotto di matrice n*m per vettore di lunghezza m sono:\n", n);
    for(i=0;i<n;i++)
    	printf("x[%d]=%f\n", i, x[i]);
    }
    dove
    float gaxpy(float **A, float *b, float *x, int n, int m)
    {
    int i, j;
    
    for(i=0;i<n;i++)
    	x[i]=0;
    
    for(i=0;i<n;i++) /*ciclo sulle righe */
    	for(j=0;j<m;j++)
    		x[i]=x[i]+A[i][j]*b[j];
    
    return x[n];
    }
    Tuttavia, dopo aver inserito gli elementi di b vettore, mi da errore di segmentazione, che suppongo sia dovuto alla chiamata di funzione.
    Riesci a farmi capire dov'è il problema?

    Ps. Ho riprovato con il ciclo for ma non và proprio..
  • Re: Prodotto matrice vettore

    Penso che il problema stia nel fatto che prima allochi e poi chiedi all'utente di darti i valori n ed m, quindi quando chiami la malloc, allochi utilizzando valori casuali delle variabili n, m.

    Ad ogni modo quando allochi dovresti controllare se il puntatore ritornato dalla malloc è NULL, nel tuo caso questo controllo non serve a molto perchè dipende dal valore che è scritto nelle variabil n e m, solleveresti eccezioni solo se tali valori fossero 0.
  • Re: Prodotto matrice vettore

    Ho capito qual è il problema, grazie!
  • Re: Prodotto matrice vettore

    Spero abbia pure modificato il valore di ritorno della funzione.
    Non capisco perchè la funzione ritorna di nuovo un float e non è void. Quando la chiami le associ un valore a x[n], che non dovrebbe darti problemi perchè scrivi fuori dal campo, ma perchè? Non è corretto! Sporchi un campo che potrebbe contenere dati utili.

    La funzione che tu hai costruito prende come parametro, tra gli altri, pure il vettore x dove scrivi i risultati che ti servono, non hai bisogno di ritornare un valore float.

    Poi ragiona un attimo, tu ritorni un float quindi un'unico valore x[n], quanto vale x[n] prima di ritornarlo e soprattutto quanto vale n?

    Ti do un consiglio cerca di acquisire abilità nel debug, semina all'interno del codice stampe di debug, oppure di assert. All'inzio stampe di debug, oppure usa un debug e cerca di capire quali valori hanno le variabili passo dopo passo, così comprendi l'algoritmo si comporta proprio come vuoi.
Devi accedere o registrarti per scrivere nel forum
7 risposte