|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Nov 2006
Messaggi: 61
|
[C] Prodotto di una matrice per un vettore
Ciao a tutti,
sto provando a fare un programma dove vengono richiesti N numeri casuali per le righe e M numeri per le colonne di una matrice. Inoltre viene generato un vettore di lunghezza M perché lo devo moltiplicare per la matrice. Ho delle difficoltà sul prodotto righe per colonne tra matrice e vettore. Devo usare i puntatori ed una funzione apposita. Spero che qualcuno mi possa aiutare! ![]() Codice:
void prodotto( int N, int M, int matrice[NMAX][MMAX], int vettore[MMAX], int* tot){ int i,j; int risultato[NMAX]; for (i=0; i<N; i++){ for (j=0; j<M; j++){ risultato[i] = matrice[i][j] * vettore[j]; printf("%d\n",risultato[i]); } } printf("\n"); //Riesco a svolgere i prodotti nel modo giusto ma non so come sommarli correttamente } |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Quote:
Codice:
void blabla(...) { *tot = 0; //... risultato[i] = matrice[i][j] * vettore[j]; *tot += risultato[i]; printf("%d\n",risultato[i]); |
|
![]() |
![]() |
![]() |
#3 | |
Member
Iscritto dal: Nov 2006
Messaggi: 61
|
Quote:
Il prodotto di una matrice per un vettore si fa in questo modo:http://it.wikipedia.org/wiki/Moltipl...per_un_vettore Io ho risolto la parte in cui bisogna moltiplicare gli elementi delle varie righe della matrice con gli elementi del vettore, poi però bisogna sommare i prodotti fra di loro, come illustrato su wikipedia per ottenere come risultato un vettore lungo quanto le righe della matrice. |
|
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: May 2011
Messaggi: 39
|
Codice:
void matXvett(double** mat, int nrighe, int ncolon, double* vett, double* vf) { int i, j; for (i=0; i<nrighe; i++) { vf[i]=0; for (j=0; j<ncolon; j++) vf[i]+= (mat[i][j]*vett[j]); } } ![]() |
![]() |
![]() |
![]() |
#5 | |
Member
Iscritto dal: Nov 2006
Messaggi: 61
|
Quote:
Ora però un problema a chiamare la funzione nel main. Ho usato il seguente codice Codice:
matXvett(N, M, &&matrice, &vettore, &vf); "passing argument 3 of matXvett incompatible pointer type". Cosa sbaglio?? |
|
![]() |
![]() |
![]() |
#6 | |
Member
Iscritto dal: May 2011
Messaggi: 39
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#7 | |
Member
Iscritto dal: Nov 2006
Messaggi: 61
|
Quote:
Ora ho ordinato mettendo per prima la matrice, è cambiato l'errore e mi da: Codice:
label 'matrice' used but not defined Codice:
int matrice[NMAX][MMAX]; |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Quote:
L'eventuale ampersand è pleonastico, ma può essere aggiunto per chiarezza. In ogni caso, sia "matrice" che "&matrice" si riferiscono all'indirizzo del primo elemento, che poi è l'indirizzo "base" del vettore. Ma &&matrice... non vuol dire niente! L'indirizzo dell'indirizzo di matrice non esiste perchè l'indirizzo di matrice (il risultato di "&matrice" non è salvato in memoria, e non ha quindi un indirizzo ottenibile tramite un ulteriore ampersand). Spero di essermi spiegato pur avendo scritto "indirizzo" ogni 3 parole! ![]() |
|
![]() |
![]() |
![]() |
#9 | |
Member
Iscritto dal: Nov 2006
Messaggi: 61
|
Quote:
Codice:
matXvett( matrice, N, M, vettore, vf); Codice:
passing argument 1 of matxvett from incompatible pointer type Codice:
void matXvett( int** matrice,int N, int M, int* vettore, int* vf); |
|
![]() |
![]() |
![]() |
#10 | |
Member
Iscritto dal: May 2011
Messaggi: 39
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Quote:
Ho risolto "fregando" così il compilatore, ma sicuramente c'è un modo più pulito per farlo. Codice:
void f1(int *base, int N, int M) { for(int i = 0; i < N; i++) for(int j = 0; j < M; j++) cout << base[i*M+j] << ' '; //giusto un esempio } int main() { int m[3][3] = {{1,2,3},{2,3,1},{3,1,2}}; f1((int*) m, 3, 3); return 0; } |
|
![]() |
![]() |
![]() |
#12 |
Member
Iscritto dal: Nov 2006
Messaggi: 61
|
Grazie a tutti.
Praticamente sbagliavo l'uso dei puntatori. Andava usato solo quello del risultato finale e non matrice e vettore che andavano solo richiamati senza essere puntati. Comunque me ne sono accorto ragionando sui vostri suggerimenti. Ciao! |
![]() |
![]() |
![]() |
#13 |
Member
Iscritto dal: May 2011
Messaggi: 39
|
Certo, la funzione la feci a suo tempo per puntatori a puntatori, ovvero matrici dichiarate come **matrice ad esempio, e poi allocate dinamicamente con la calloc.
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:55.