|
|||||||
|
|
|
![]() |
|
|
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: 18:41.




















