Bonjour,

J'ai besoin de résoudre un problème utilisant les moindres carrés.
J'ai utilisé la bibliothèque GSL avec la décomposition QR et ça donne un faux résultat. Je me suis penché sur les moindres carrés récursifs mais la méthode que je connais implique pourvoir faire au moins un produit de matrices.

J'ai pensé recréer une classe matrice et vecteur afin de le faire facilement.
Tout se passe bien mais lorsque je fais le produit, un message d'erreur de windows : "Optimisation.exe a cessé de fonctionner".

je sais que le produit se fait bien jusqu'au bout (en y allant à cout de stp::cout) mais c'est la sortie de la fonction qui gène.

Voici les sources.
Fichier Optimisation.cpp :

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
#include <iostream>
#include "Matrice.h"
#include "Vecteur.h"
#include "Optimisation.h"
 
using namespace std;
 
 
Matrice prod_mat(Matrice m1, Matrice m2)
{
    Matrice m3 ;
    int i,j,k ;
    float temp ;
 
    int dim1 = m1.nligne() , dim2 = m1.ncol();
    int dim3 = m2.ncol() , dim4 = m2.ncol();
    m2.creat_mat(dim1,dim4);
    cout << "(ligne1,col1) = ("<< dim1<<","<<dim2<<") et (ligne2,col2)= ("<< dim3<<","<<dim4<<")"<<endl ;
 
    if(!(dim2 == dim3))
    {cout <<"produit mat impossible, dimension non corresp"<<endl;
    }
    else
    { cout << " dim2 = dim3 " <<endl ;
        for(i = 0; i < dim1; i++)
        {    for(j = 0; j < dim4; j++)
            {
            temp = 0;
            for(k=0; k < dim2 ; k++) 
            {
                temp += m1.access(i,k)*m2.access(k,j);
            }
            m3.modify(i,j,temp);
            }
        }
    }
    //m3.print();
    return m3;
}
Voici le contenu de la classe Matrice :

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
#ifndef MATRICE_H_
#define MATRICE_H_
 
class Matrice
{
public:
    Matrice();
    ~Matrice();
    void creat_mat(int n,int m);    // fait une allocation mémoire de toutes les cases
    void init_mat(int n,int m, float val);
    void print(); 
    int nligne(); // Renvoie le nombre de lignes.
    int ncol(); // Renvoie le nombre de colonnes    
//    void resize(int ligne, int col);     // Reinitialise en supprimant le contenu
//    void assign(int ligne, int col, const int val); // Reinitialise et assigne val a chaque case
    float access(int , int ); // acceder a un element mat(i,j)
    void modify(int , int , float ); // modifier un élément mat(i,j)    
private:
    float * *tab ;
    int dim_l ;
    int dim_c ;
    //bool prod_ok ;
};
 
#endif /*MATRICE_H_*/
La fonction de creation d'une matrice (qui alloue la place mémoire et rajoute les dimensions) :

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
void Matrice::creat_mat(int n,int m)
{
int i;    
if (n == 0 || m == 0) 
    {
    cout <<"taille impossible, nligne ="<<n<<"et ncol = "<<m<< endl;
    }
else 
    {    dim_l = n;
        dim_c = m ;
        tab = NULL;
        tab = new float *[n];
        if (tab == NULL) cout <<"erreur d'allocation matrice "<< endl;
        for (i=0; i<n ; i++) 
        {
            tab[i] = new float [m];
            if (tab[i]==NULL) {cout <<"erreur d'allocation ligne "<< endl;}
        }    
    }    
}
Merci pour votre aide !