[C] Matrici

jarrod
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
#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
vict85
Ad uno sguardo veloce mi sembra tu abbia ragione. Comunque puoi facilmente controllare stampando a video le varie matrici.

jarrod
ho stampato facendo
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.. :roll:

apatriarca
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.

vict85
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.

jarrod
grazie mille a tutti :)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.