[C] Matrici
Ciao, il mio prof ha fatto questo programma in cui data una matrice, ad esempio ho $((1,2,3),(4,5,6),(7,8,9))$, vuole ribaltarla ed ottenere $((7,8,9), (4,5,6), (1,2,3))$
questo è il file.h
il main.c è:
questo è il file.c:
Però non capisco cosa fa nei due cicli for..
cioè questo passaggio:
a me sembra di capire che invece di ottenere la matrice dovuta si ottenga questa matrice $((3,2,1),(6,5,4),(9,8,7))$
Perchè index calcola le posizioni dove si trovano gli elementi della matrice iniziale, poi ind calcola le posizioni della nuova matrice in cui vanno a finire gli elementi. Qualcuno mi potrebbe spiegare il ragionamento che sbaglio? ho l'impressione di non riuscire a capire il significato di quelle due righe di codice
questo è il file.h
#include <stdio.h> #include <stdlib.h> struct matrix{ size_t rows, cols; double *data; }; #if !defined MATRIX_H #define MATRIX_H extern struct matrix *matrix_flip_v(const struct matrix *m); #endif
il main.c è:
#include "matrix.h" int main(void){ double data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; struct matrix m = { 3, 3, data }; struct matrix *f = matrix_flip_v(&m); return 0; }
questo è il file.c:
#include "matrix.h" struct matrix *matrix_flip_v(const struct matrix *m){ if (m == NULL){ return NULL; } struct matrix *mflip = malloc(sizeof(struct matrix)); //alloco lo spazio per la struct matrice mflip->cols = m->cols; //copio colonne mflip->rows = m->rows; //copio righe mflip->data = malloc(mflip->cols*mflip->rows*sizeof(double)); //alloco lo spazio per gli elementi della matrice for (unsigned int r = 0; r < m->rows; r++){ for (unsigned int c = 0; c < m->cols; c++){ int index = (r*m->cols) + c; int ind = (r*m->cols) + (m->cols - c - 1); mflip->data[ind] = m->data[index]; } } return mflip; }
Però non capisco cosa fa nei due cicli for..
cioè questo passaggio:
int index = (r*m->cols) + c; int ind = (r*m->cols) + (m->cols - c - 1); mflip->data[ind] = m->data[index];
a me sembra di capire che invece di ottenere la matrice dovuta si ottenga questa matrice $((3,2,1),(6,5,4),(9,8,7))$
Perchè index calcola le posizioni dove si trovano gli elementi della matrice iniziale, poi ind calcola le posizioni della nuova matrice in cui vanno a finire gli elementi. Qualcuno mi potrebbe spiegare il ragionamento che sbaglio? ho l'impressione di non riuscire a capire il significato di quelle due righe di codice
Risposte
Ad uno sguardo veloce mi sembra tu abbia ragione. Comunque puoi facilmente controllare stampando a video le varie matrici.
ho stampato facendo
è scritta bene la printf secondo te? Perchè mi vengono visualizzati su schermo gli elementi della matrice originale e non la matrice trasposta..
printf("%f ", mflip->data[ind]);
è scritta bene la printf secondo te? Perchè mi vengono visualizzati su schermo gli elementi della matrice originale e non la matrice trasposta..

Dove hai messo il printf? Se è nel ciclo allora è normale vengano gli elementi della matrice originaria. Stai infatti scorrendo gli elementi della matrice originaria in ordine mentre la scrittura nella nuova matrice segue un ordine diverso. Devi insomma fare un nuovo ciclo in cui scorri la matrice normalmente e stampi i valori.
Ho stampato la matrice dopo la funzione e, come immaginavo da una prima analisi, hai ragione: il codice produce la matrici che dici tu e non quella che dice il professore.
Prova a cambiare il codice per fare quello che dice il professore.
Prova a cambiare il codice per fare quello che dice il professore.
grazie mille a tutti
