Bonjour,
Je suis débutant en C et également nouveau sur ce forum, c'est pour cette raison que j'aurais voulu avoir des conseils pour l'amélioration de mes codes.
Mon projet consiste, à terme, à réaliser un programme d'ajustement de courbe expérimental avec équations théoriques, pour une application dans le domaine de la physique. J'ai choisis la méthode des moindres carrées pour réalisé mon projet : http://fr.wikipedia.org/wiki/M%C3%A9...es_carr%C3%A9s
et plus particulièrement la méthode matricielle.
J'ai donc redéfinie des fonctions qui opère sur des matrices, j'en ai fais trois, une qui transpose la matrice, une permettant effectuer des produits de matrices, et la dernière qui fais l'inverse de la matrice par la méthode du pivot de Gauss.
Je vais donc commencer par mettre ici mon code de transposée, pour avoir quelques conseils sur celui ci :
Mon main :
Ma fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 #include <stdio.h> #include <stdlib.h> #include <math.h> #include "fonctions.h" int main() { int nbreligneA = 0, nbrecolonneA = 0, i = 0, j = 0; //Valeurs test : nbreligneA = 3; nbrecolonneA = 2; //Matrice A et T double **A = malloc(nbreligneA * sizeof(double)); for (i = 0; i < nbreligneA; i++) { A[i] = malloc(nbrecolonneA*sizeof(double)); } double **T ; //Valeurs test(suite) : A[0][0] = 1; A[0][1] = 2; A[1][0] = 3; A[1][1] = 4; A[2][0] = 5; A[2][1] = 6; //Création des structures pour ces matrices Matrice As = {A, nbreligneA, nbrecolonneA}; Matrice Ts = {T, 0, 0}; //Creation pointeurs vers ces structures Matrice *pAs = &As; Matrice *pTs = &Ts; //Envois de ces pointeurs à la fonction Transposée Transposee(pAs, pTs); //Affichage provisoire de l'essais for (i = 0; i < As.nbreligne; i++) { printf("\n|"); for (j = 0; j < As.nbrecolonne; j++) { printf(" %f", As.matrice[i][j]); } printf(" |"); } printf("\n\n"); for (i = 0; i < Ts.nbreligne; i++) { printf("\n|"); for (j = 0; j < Ts.nbrecolonne; j++) { printf(" %f ", Ts.matrice[i][j]); } printf(" |"); } //On libère l'espace pour les matrice A et T for (i = 0; i < nbreligneA; i++) { free(A[i]); } free(A); for (i = 0; i < Ts.nbreligne; i++) { free(Ts.matrice[i]); } free(Ts.matrice); return 0; }
et les structures et prototypes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 #include <stdio.h> #include <stdlib.h> #include <math.h> #include "fonctions.h" struct Matrice *Transposee(struct Matrice *A, struct Matrice *T) { int i = 0, j = 0; //Allocation pour matrice provisoir de travail double **Ap = malloc(A->nbreligne*sizeof(double)); for (i = 0; i < A->nbreligne; i++) { Ap[i] = malloc(A->nbrecolonne*sizeof(double)); } //Structure de matrice provisoire Matrice Aps = {Ap, A->nbreligne, A->nbrecolonne}; //Copie Matrice A dans Ap for (i = 0; i < Aps.nbreligne; i++) { for (j = 0; j < Aps.nbrecolonne; j++) { Ap[i][j] = A->matrice[i][j]; } } //Allocation de T en fonction de A (ou Aps puisque copie) T->matrice = malloc(Aps.nbrecolonne*sizeof(double)); for (i = 0; i < Aps.nbrecolonne; i++) { T->matrice[i] = malloc(Aps.nbreligne*sizeof(double)); } //On remplace le nombre de lignes et de colonnes dans la structure Ts présente dans le main T->nbreligne = Aps.nbrecolonne; T->nbrecolonne = Aps.nbreligne; //Transposé à partir de la matrice provisoire for (i = 0; i < T->nbreligne; i++) { for (j = 0; j < T->nbrecolonne; j++) { T->matrice[i][j] = Aps.matrice[j][i]; } } //On libère l'espace de la matrice Ap for (i = 0; i < Aps.nbreligne; i++) { free(Aps.matrice[i]); } free(Aps.matrice); //On retourne T pointeur vers la matrice d'accueil du résultat return T; }
Voilà, je remercie d'avance ceux qui me lirons, et les remercies pour leur éventuel conseils.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #ifndef FONCTIONS_H_INCLUDED #define FONCTIONS_H_INCLUDED //Protos struct Matrice *Transposee(struct Matrice *A, struct Matrice *T); //Structures typedef struct Matrice Matrice; struct Matrice { double **matrice; int nbreligne; int nbrecolonne; }; #endif // FONCTIONS_H_INCLUDED
Partager