| C'est du C++ en effet, mais c'est vraiment pas compliquer !
je te fait des simplifications : MATRIX& MATRIX::inverse()
{
if (m!=n)
{
perror("inversion de matrices non carré non implémenter!\n");
return *this;
}
MATRIX MM(n),M1(n),Mi1(n),Minv(n);// déclaration de matrices de taille identique à celle à inverser
MM=*this;// copie de la matrice à inverser
M1=MM;
Mi1.Id();//Mi1 est maintenant une matrice identité
Minv=Mi1;
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
if (MM(i,i)==0)
{
perror("inversion pivot GAUSS impossible : division par 0\n");
return *this;
}
M1(i,j)=MM(i,j)/MM(i,i);
Mi1(i,j)=Minv(i,j)/(MM(i,i));
}
MM=M1;
Minv=Mi1;
for (int k=0;k<n;k++)// mise zéros de la colonne
if (k!=i)
for (int j=0;j<n;j++)
{
M1(k,j)=MM(k,j)-MM(i,j)*MM(k,i);
Mi1(k,j)=Minv(k,j)-Minv(i,j)*MM(k,i);
}
MM=M1;
Minv=Mi1;
}
*this=Minv;
return *this;
}Voilà. La il est difficile de faire plus simple. C'est vraiment du basique ! Dit ce que tu ne comprend pas, ça ira mieux
Salutation !
Char Snipeur Répondre à Char Snipeur | Salut ; j'ai un problème , j'ai copié ce code et je l'ai testé car j'avais besoin d'une matrice inverse , mais il ne marche pas , l'as tu vérifié ? est il correct? surtout que j'ai copié aussi le code de la matrice identité et il n'était pas bon; as tu un code me permettant de calculer la matrice inverse et le déterminant. Répondre à christiankamewe | 24 Mish, le 9 nov 2009 à 04:52:35J'ai une solution pour toi, mais il me faudrait ton adresse e-mail, parce que le fichier est une librairie javascript plutôt volumineuse pour être affichée sur le forum. Bref, c'est comme tu veux... C'est un fichier de 56Ko... Plus la documentation de 32Ko... Répondre à Mish | Merci d'avance,mon adresse email est: christiankamewe@hotmail.com; cette solution est codée en C++? Répondre à christiankamewe | Il viens de dire "javascript" je suppose donc que ce n'est pas du C++. Mais je m'avance peut être beaucoup ;-)
Salutation ! (il faut bien que vous compreniez que j'ai TOUJOURS raison)
Char Snipeur Répondre à Char Snipeur | Voici finalement le code de ma classe matrice.h ; il ya une fonction qui s'appelle inverse et c'est elle ki n'est pas ok.
#ifndef matrice_h
#define matrice_h
//#include <cstdlib>
#include <string>
#include <iostream>
#include <fstream>
//#include <limits>
#include <iomanip>
#include <string>
#include <vector>
#include <windows.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
class Matrice
{
int M;
int N;
vector<float> contenu;
public:
// initialisation de la taille de la matrice à zero
Matrice(){
M=0;
N=0;
}
// declaration d'une matrice
Matrice( int lig,int col, float val=0){
M=lig;
N=col;
contenu.resize(M*N,val);
}
// permet de retourner la talle N de la matrice
int getN(){
return N;
}
// permet de retourner la talle N de la matrice
int getM(){
return M;
}
// declaration de l operateur ()
float operator()(int i,int j)const{
return contenu[i*N+j];
}
// declaration de l operateur recuperant sa valeur
float &operator()(int i,int j){
return contenu[i*N+j];
}
// initialisation des elements d'une matrice
void initialize( int lig,int col, float val=0){
M=lig;
N=col;
contenu.clear();
contenu.resize(M*N,val);
}
// operateur d'addition d une matrice par une autre matrice
Matrice operator+( Matrice mat){
//int K=mat.N;
Matrice out=mat;
for(int i=0;i< contenu.size() ;i++)
{
out.contenu[i]=out.contenu[i]+contenu[i];
}
return out;
}
// operateur de division d une matrice par un element
Matrice operator/( float d ){
Matrice out=*this;
for(int i=0;i< contenu.size() ;i++)
{
out.contenu[i]=out.contenu[i]/d;
}
return out;
}
// operateur de multiplication d une matrice par un element
Matrice operator*( float d ){
Matrice out=*this;
for(int i=0;i< contenu.size() ;i++)
{
out.contenu[i]=out.contenu[i]*d;
}
return out;
}
// operateur d' addition d une matrice par un element
Matrice operator+( float d ){
Matrice out=*this;
for(int i=0;i< contenu.size() ;i++)
{
out.contenu[i]=out.contenu[i]+d;
}
return out;
}
// operateur de soustraction d une matrice par un element
Matrice operator-( float d ){
Matrice out=*this;
for(int i=0;i< contenu.size() ;i++)
{
out.contenu[i]=out.contenu[i]-d;
}
return out;
}
//operateur de multiplication d'une matrice par une autre matrice
Matrice operator*( Matrice mat){
int K=mat.N;
Matrice out(M,K);
for(int i=0;i<M;i++)
{
for(int j=0;j<K;j++)
{
for (int l=0;l<N;l++)
{
out(i,j)=out(i,j)+contenu[i*N+l]*mat(l,j);
}
}
}
return out;
}
// Moyenne d'une matrice
vector<float> moyenne(){
vector<float> out(N);
Matrice mat= transpose();
for(int i=0;i<N;i++)
{
for (int l=0;l<M;l++)
{
out[i]=out[i]+ mat(i,l);
}
out[i]=out[i]/M;
}
return out;
}
// affichage d'une matrice
void afficher(){
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
printf("%f\t",contenu[i*N+j]);
}
cout<<endl<<endl;
}
}
// transposer d'une matrice
Matrice transpose(){
Matrice out(N,M);
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
out(i,j)=contenu[j*N+i];
}
}
return out;
}
// Matrice identite
Matrice identite(){
Matrice out=*this;
if (M==N){
out.initialize(M,N,0.0);
for (int i=0;i<M;i++)
out.contenu[i*(M+1)]=1.0;
}
return out;
}
float trace() const
{
if (M==N){
float tr=0.0;
for (int i=0;i<N;i++)
tr=tr+contenu[i*(1+N)];
return tr;
}
else
return 0;
}
Matrice inverse(){
if (M!=N)
{
cout<<"inversion de matrices non carrées non implémentées!\n"<<endl;
return *this;
}
Matrice MM,M1,Mi1,Minv;// déclaration de matrices de taille identique à celle à inverser
MM=*this;// copie de la matrice à inverser
M1=MM;
Mi1.initialize(M,N,0) ;//Mi1 est maintenant une matrice identité
Minv=Mi1.identite();
for (int i=0;i<M;i++)
{
for (int j=0;j<M;j++)
{
if (MM.contenu[i*N+i]==0)
{
cout<<"inversion pivot GAUSS impossible : division par 0\n"<<endl;
return *this;
}
M1.contenu[i*N+j]=MM.contenu[i*N+j]/MM.contenu[i*N+i];
Mi1.contenu[i*N+j]=Minv.contenu[i*N+j]/(MM.contenu[i*N+i]);
}
MM=M1;
Minv=Mi1;
for (int k=0;k<M;k++)// mise zéros de la colonne
if (k!=i)
for (int j=0;j<M;j++)
{
M1.contenu[k*N+j]=MM.contenu[k*N+j]-MM.contenu[i*N+j]*MM.contenu[k*N+i];
Mi1.contenu[k*N+j]=Minv.contenu[k*N+j]-Minv.contenu[i*N+j]*MM.contenu[k*N+i];
}
MM=M1;
Minv=Mi1;
}
*this=Minv;
return *this;
}
// matrice de wishart d une matrice
Matrice wishart(){
Matrice out=*this;
vector<float>moy=moyenne();
for(int i=0;i<M;i++)
{
for (int j=0;j<N;j++)
{
out(i,j)=out(i,j)-moy[j];
}
}
return out.transpose()*out;
}
// renvoie la valeur d une matrice de wishart
void Towishart(){
*this = wishart();
}
//Centrer les element d une colonne d une matrice
Matrice centrer(){
Matrice out=*this;
vector<float>moy=moyenne();
for(int i=0;i<M;i++)
{
for (int j=0;j<N;j++)
{
out(i,j)=out(i,j)-moy[j];
}
}
return out;
}
// calcul la somme des elements d une matrice
float somme(){
float som=0;
int val=contenu.size();
for(int i=0;i<val;i++)
{
som=som+contenu[i];
}
return som;
}
};
#endif Répondre à christiankamewe |
|
|
|
| Je l'ai déjà utilisé, il fonctionne.
Je viens même de tester sur une matrice 2*2.
Mais une erreur n'est pas à exclure.
Donne ta matrice que je teste.
Salutation ! (il faut bien que vous compreniez que j'ai TOUJOURS raison)
Char Snipeur Répondre à Char Snipeur | Salut char snipeur , mes matrices sont longues car elle sont de taille 45 *45 ; alors peux tu me passer ton adresse e mail pour que je d'envoi le fichier? écris moi à mon adresse christiankamewe@hotmail.com pour que j'obtienne ton adresse émail ; sinon j'ai eu quelques problèmes avec ton code , tout d'abord sur la matrice identité ; as tu verifié car moi je l'ai exécuté et el n'étais pas bonne , de même je pense que mon problème se situe sur l'initialisation des matrices; si tu as crée une classe matrice alors passe la moi pour que je compare et moi je vais te passer ma classe matrice.h que j'ai crée pour que tu verifies.
merci d'avance Répondre à christiankamewe | Répondre à Char Snipeur | Effectivement , en ce qui concerne la fonction Id pour la matrice identité , je me rends compte que tu mets uniquement les éléments de la diagonale à 1.0 et qu'en est il des autres éléments qui doivent passer à 0. Répondre à christiankamewe | Oui, j'avais trouvé ce bug, et je l'ai corrigé (il faut que je mette à jour le site). Mais normalement ce n'est pas grave dans l'algorithme d'inversion car les matrice mises à l'identité sont nulles.
Salutation ! (il faut bien que vous compreniez que j'ai TOUJOURS raison)
Char Snipeur Répondre à Char Snipeur | Ok , deuxiement quand tu fais MM(i,i)==0.0 qu'es ce que cela veut dire? est ce que tu sais regarder mon code, particulierement celui de la fonction inverse et me dire où il peut y avoir problème? Répondre à christiankamewe |
| Je ne vois pas d'erreur.
Vérifie la composition de tes matrices avant d'entrer dans la première boucle.
As tu testé mon code ?
Comment vérifie tu que ta matrice est bien inversée ? (attentions aux erreurs numériques)
Salutation ! (il faut bien que vous compreniez que j'ai TOUJOURS raison)
Char Snipeur Répondre à Char Snipeur |
|
|
|
|
|
|
|