begin process at 2010 03 20 10:44:53
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > CALCULER LA DÉTERMINANTE D'UNE MATRICE ALÉATOIRE DE GRANDEUR DÉFINIE

CALCULER LA DÉTERMINANTE D'UNE MATRICE ALÉATOIRE DE GRANDEUR DÉFINIE


 Information sur la source

Note :
1 / 10 - par 1 personne
1,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Classé sous :matrice, determinante, math, recursive, console Niveau :Initié Date de création :17/04/2006 Date de mise à jour :18/04/2006 19:34:22 Vu / téléchargé :6 308 / 252

Auteur : dPompei2

Ecrire un message privé
Site perso
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
flashback

Driiiing, le cours de math est terminé et nous venons d'apprendre comment calculer la déterminante d'une matrice de n'importe quelle grandeur.
Avec des potes, j'ai eu la brillante idée de faire le pari que j'arriverai à écrire un programme calculant une déterminante encore le jour même.

Driiiing, fin des cours, je rentre à la maison, je mange qqch et je m'y mets. J'utilise comme d'hab mes fonctions MyMalloc, MyFree etc. pour ne pas m'emmerder avec ces trucs. Et voila le défi: pour calculer une déterminante im faut calculer le mineur et pour calculer un mineur il faut calculer une déterminante. c'était bien fun :P

Bon venons en au programme, que fait-il ?
Simple: il lit la grandeur de la matrice dans le fichier conf.txt et la remplit avec des valeurs aléatoires pour ensuite calculer sa déterminante et me dire combien de déterminantes/mineurs il a du calculer et combien il aurait du calculer au maximum.

CE PROGRAMME NE SERT STRICTEMENT A RIEN juste a m'occuper un apres midi :p

En plus, il choisit chaque fois la ligne avec le plus de 0 pour etre le plus rapide possible.

Ah oui, le programme original était uniquement allemand, alors si j'ai oublié de traduire certains messages d'erreur, dsl ^^

Source

  • /* Juste la partie principale du code source. */
  • int choose_line( MATRIX *pMatrix )
  • {
  • int curr = 0;
  • int max = 0;
  • int line = 0;
  • int i, j;
  • for( i = 0 ; i < pMatrix->iSize ; i++ ) {
  • for( j = 0 ; j < pMatrix->iSize ; j++ ) {
  • if( pMatrix->pData[XY( j, i, pMatrix->iSize)] == 0 )
  • curr++;
  • }
  • if( curr > max ) {
  • max = curr;
  • line = i;
  • }
  • curr = 0;
  • }
  • return line + 1;
  • }
  • int calc_minor( MATRIX *pMatrix, int Line, int Column )
  • {
  • MATRIX *pTemp = NULL;
  • int i = 0,
  • j = 0;
  • g_nbr_minors++;
  • /* (-1) ^ (i+j) */
  • i = pow( -1, (long)(Line + Column) );
  • /* La determinante de la matrice kon a si on supprimme la ligne et
  • * la colonne de l'element dont on doit calculer le mineur.
  • */
  • pTemp = matrix_delete_line_column( pMatrix, Line, Column );
  • j = calc_determinante( pTemp );
  • SAFE_FREE( pTemp->pData );
  • SAFE_FREE( pTemp );
  • return i * j;
  • }
  • int iLastPercent = -1;
  • int iLastPerthousand = 0;
  • int calc_determinante( MATRIX *pMatrix )
  • {
  • int iChoosenLine = 1,
  • iChoosenLineIsLine = 1,
  • iResult = 0,
  • a = 0,
  • b = 0,
  • i = 0,
  • k = 0;
  • float fPercent = 0.0f;
  • g_real_nbr_determs++, g_virt_nbr_determs++;
  • fPercent = (((float)g_virt_nbr_determs / (float)g_needed_determinants) * 100.0f);
  • /* Actualiser la barre des % a chak fois kon est 1 % plus loin. */
  • if( iLastPercent < (int)fPercent ) {
  • iLastPercent = (int)fPercent;
  • for( a = 0 ; a < 100 ; a++ )
  • printf( "\b" );
  • printf( "Prog: |" );
  • for( i = 0 ; i < (int)(fPercent / 2.0f) ; i++ )
  • printf( "=" );
  • for( i = (int)(fPercent / 2.0f) ; i < 50 ; i++ )
  • printf( " " );
  • if( fPercent < 10.0f )
  • printf( "| ", fPercent );
  • else
  • printf( "| ", fPercent );
  • fflush( stdout );
  • }
  • /* Actualiser l'affiche des % et du temps restant a chak fois kon est 0.1 % plus loin. */
  • if( iLastPerthousand < (int)(fPercent * 10.0f) ) {
  • iLastPerthousand = (int)(fPercent * 10.0f);
  • /* Et afficher sa :p */
  • if( fPercent < 10.0f )
  • printf( "\b\b\b\b\b%3.1f %%", fPercent );
  • else
  • printf( "\b\b\b\b\b\b%3.1f %%", fPercent );
  • fflush( stdout );
  • }
  • /* Si la matrice n'est plus ke de 2x2, alors c gagner ^^ */
  • if( pMatrix->iSize == 2 )
  • return pMatrix->pData[0] * pMatrix->pData[3] - pMatrix->pData[2] * pMatrix->pData[1];
  • /* Autment bin tampi :p */
  • /* On le fait comme jviens de lapprendre en maths :p */
  • /* c "la somme des produits des elements d'une rangee et leur mineur" */
  • /* demerdez vous :D:D */
  • /* On choisit la ligne/colonne qui contient le plus de 0. */
  • iChoosenLine = choose_line( pMatrix );
  • /* Sa c pour faire sa sur une ligne. */
  • if( iChoosenLineIsLine ) {
  • for( i = 1 ; i <= pMatrix->iSize ; i++ ) {
  • k = XY( i-1, iChoosenLine-1, pMatrix->iSize );
  • /* La valeur de l'element de la rangee choisie. */
  • a = pMatrix->pData[k];
  • /* Le mineur de l'element de la rangee choisie.
  • * Si a est dja 0, plus bsoin de calculer le mineur, puiske 0*x = 0
  • */
  • if( a != 0 ) {
  • b = calc_minor( pMatrix, iChoosenLine, i );
  • } else {
  • g_virt_nbr_determs += calc_nbr_determinants( pMatrix->iSize - 1 );
  • }
  • iResult += a * b;
  • }
  • /* Et sa c pour faire sa sur une colonne. */
  • } else {
  • for( i = 1 ; i <= pMatrix->iSize ; i++ ) {
  • k = XY( iChoosenLine-1, i-1, pMatrix->iSize );
  • /* La valeur de l'element de la rangee choisie. */
  • a = pMatrix->pData[k];
  • /* Le mineur de l'element de la rangee choisie.
  • * Si a est dja 0, plus bsoin de calculer le mineur, puiske 0*x = 0
  • */
  • if( a != 0 )
  • b = calc_minor( pMatrix, i, iChoosenLine );
  • iResult += a * b;
  • }
  • }
  • return iResult;
  • }
/* Juste la partie principale du code source. */

int choose_line( MATRIX *pMatrix )
{
        int curr = 0;
        int max  = 0;
        int line = 0;
        int i, j;

        for( i = 0 ; i < pMatrix->iSize ; i++ ) {
                for( j = 0 ; j < pMatrix->iSize ; j++ ) {
                        if( pMatrix->pData[XY( j, i, pMatrix->iSize)] == 0 )
                                curr++;
                }
                if( curr > max ) {
                        max = curr;
                        line = i;
                }
                curr = 0;
        }

        return line + 1;
}

int calc_minor( MATRIX *pMatrix, int Line, int Column )
{
        MATRIX *pTemp = NULL;
        int i = 0,
            j = 0;

        g_nbr_minors++;

        /* (-1) ^ (i+j) */
        i     = pow( -1, (long)(Line + Column) );
        /* La determinante de la matrice kon a si on supprimme la ligne et
         * la colonne de l'element dont on doit calculer le mineur.
         */
        pTemp = matrix_delete_line_column( pMatrix, Line, Column );
        j     = calc_determinante( pTemp );

        SAFE_FREE( pTemp->pData );
        SAFE_FREE( pTemp );

        return i * j;
}

int iLastPercent = -1;
int iLastPerthousand = 0;
int calc_determinante( MATRIX *pMatrix )
{
        int iChoosenLine = 1,
            iChoosenLineIsLine = 1,
            iResult = 0,
            a = 0,
            b = 0,
            i = 0,
            k = 0;
        float fPercent = 0.0f;

        g_real_nbr_determs++, g_virt_nbr_determs++;
        fPercent = (((float)g_virt_nbr_determs / (float)g_needed_determinants) * 100.0f);

        /* Actualiser la barre des % a chak fois kon est 1 % plus loin. */
        if( iLastPercent < (int)fPercent ) {
                iLastPercent = (int)fPercent;
                for( a = 0 ; a < 100 ; a++ )
                        printf( "\b" );
                printf( "Prog: |" );
                for( i = 0 ; i < (int)(fPercent / 2.0f) ; i++ )
                        printf( "=" );
                for( i = (int)(fPercent / 2.0f) ; i < 50 ; i++ )
                        printf( " " );
                if( fPercent < 10.0f )
                        printf( "|      ", fPercent );
                else
                        printf( "|       ", fPercent );
                fflush( stdout );
        }

        /* Actualiser l'affiche des % et du temps restant a chak fois kon est 0.1 % plus loin. */
        if( iLastPerthousand < (int)(fPercent * 10.0f) ) {
                iLastPerthousand = (int)(fPercent * 10.0f);

                /* Et afficher sa :p */
                if( fPercent < 10.0f )
                        printf( "\b\b\b\b\b%3.1f %%", fPercent );
                else
                        printf( "\b\b\b\b\b\b%3.1f %%", fPercent );
                fflush( stdout );
        }

        /* Si la matrice n'est plus ke de 2x2, alors c gagner ^^ */
        if( pMatrix->iSize == 2 )
                return pMatrix->pData[0] * pMatrix->pData[3] - pMatrix->pData[2] * pMatrix->pData[1];

        /* Autment bin tampi :p */
        /* On le fait comme jviens de lapprendre en maths :p */
        /* c "la somme des produits des elements d'une rangee et leur mineur" */
        /* demerdez vous :D:D */

        /* On choisit la ligne/colonne qui contient le plus de 0. */
        iChoosenLine = choose_line( pMatrix );

        /* Sa c pour faire sa sur une ligne. */
        if( iChoosenLineIsLine ) {
                for( i = 1 ; i <= pMatrix->iSize ; i++ ) {
                        k = XY( i-1, iChoosenLine-1, pMatrix->iSize );
                        /* La valeur de l'element de la rangee choisie. */
                        a = pMatrix->pData[k];
                        /* Le mineur de l'element de la rangee choisie.
                         * Si a est dja 0, plus bsoin de calculer le mineur, puiske 0*x = 0
                         */
                        if( a != 0 ) {
                                b = calc_minor( pMatrix, iChoosenLine, i );
                        } else {
                                g_virt_nbr_determs += calc_nbr_determinants( pMatrix->iSize - 1 );
                        }
                        iResult += a * b;
                }
        /* Et sa c pour faire sa sur une colonne. */
        } else {
                for( i = 1 ; i <= pMatrix->iSize ; i++ ) {
                        k = XY( iChoosenLine-1, i-1, pMatrix->iSize );
                        /* La valeur de l'element de la rangee choisie. */
                        a = pMatrix->pData[k];
                        /* Le mineur de l'element de la rangee choisie.
                         * Si a est dja 0, plus bsoin de calculer le mineur, puiske 0*x = 0
                         */
                        if( a != 0 )
                                b = calc_minor( pMatrix, i, iChoosenLine );
                        iResult += a * b;
                }
        }

        return iResult;
}

 Conclusion

J'ai deja fait tourner le programme avec une matrice de 15x15, je suis allé voir un film et en revenant, le prog avait crashé, je pense que c'est du à la limite de fonctions récursives pouvant être appelées. (Donc une limite windows ... sous linux je n'ai encore jamais rencontré un problème pareil)

PS: renommez le fichier "matrix.ex_" en "matrix.exe" ...
il y a aussi un executable linux: "matrix"

PPS: .wpj = Watcom ProJect pour l'IDE Open Watcom

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

17 avril 2006 19:58:27 :
Ajouté un peu de code: les 3 fonctions principales.
17 avril 2006 19:59:52 :
essaye de rendre les commentaires plus beaux ?
18 avril 2006 19:34:22 :
j'ai vu que j'avais écrit Galéatoire au lieu de aléatoire dans le titre -.-"

 Sources du même auteur

Source avec Zip LIRE/ECRIRE DES FICHIERS .CONF

 Sources de la même categorie

Source avec Zip TRANSFORMER UN ENTIER EN DEUX NOMBRES COMPOSÉ DES MEMES CHIF... par thebroyeur
CALCULE LOG(X) par tagtog
Source avec Zip Source avec une capture ALGORITHME DE TRI D'UN TABLEAU PAR ORDRE CROISSANT OU DÉCROI... par Thuzhen
Source avec une capture CALCUL DE VARIANCE par Minilogus
Source avec une capture GÉNÉRATEUR DE CLÉS SUR 26 DIGITS AU FORMAT HEXADÉCIMAL par besilent

 Sources en rapport avec celle ci

CALCULER LE PRODUIT DE DEUX MATRICES DE TAILLE DIFFERENT par aymenet1
[C/C++] DÉTERMINER LES DIVISEURS D'UN NOMBRE AVEC DES INFORM... par soso62fr
ALIGNER TEXTE CONSOLE par CptPingu
RÉSOLUTION AUTOMATIQUE DES TRINOMES DU SECOND DÉGRÉ. par MisterFelx
MANIPULATION DE MATRICES par newvoho

Commentaires et avis

Commentaire de JCDjcd le 18/04/2006 18:42:56

Matrice 15x15 avec algo. en n! [bof bof ... :)] => il faut passer  avec un algo. en n^3 avec le pivot de Gauss.

Pour ce qui est du "demerden Sie sich", cela s'appelle une developpement suivant une ligne (ou une colonne).

Je n'ai pas tres bien compris l'histoire de rangee qui a le plus de zeros, tu ne perts pas plus de temps a les chercher que d'effectuer betement le calcul ?

Commentaire de dPompei2 le 18/04/2006 19:27:16

bon a vrai dire, je ne vois pas ce qu'est un "algo. en n^3 avec le pivot de Gauss."

bon avec les 0, faut que je me rapelle bien ....
Je crois qu'il fallait choisir une rangée et y faire la somme de chaque élément*son mineur. son mineur est la déterminante de la matrice en enlevant la ligne et colonne de cet élément à la matrice de base.
Donc pour une matrice 12x12 il faudrait calculer encore 12 déterminants de matrices 11x11 et pour ces 12 encore 11 déterminants de matrices 10x10 etc. je ne sais pas si je suis clair ?
donc si on a un 0 dans une rangée, plus besoin de calculer tellement (n! ou n est le "niveau") mais c'est deja 0 (puisque 0*n'importe combien est 0). donc si on a une rangée avec 5 zéros dedans, on doit calculer beaucoup moins non ?

Je ne sais vraiment pas si j'étais clair assez ? sa fait quand même il y a un an je crois :)

Commentaire de Chewbi666 le 03/05/2006 08:42:03

très clair, mais ton algo reste en n!, car tu lances dans le pire cas (ie: très peu de zéros) n calculs qui chacun lance n-1 calcul, qui chacun... ;-)

Le pivot de Gauss revient simplement à faire des opérations sur les lignes et colonnes, car le déterminant ne change pas si tu remplace une ligne par une combinaison linéaire de lignes de la matrice, de même pour les colonnes. Tu choisis donc une ligne avec un truc non nul à gauche (si c pas possible det(A)=0, plié), tu l'échange avec la première ligne de ta matrice puis tu effectue pour toutes les lignes ayant un truc non nul à gauche: Li <-- Li-L1*(ai1/a11) ou ai1 est le coeff de gauche de Li.
Tu recommences avec une ligne qui aurait un truc non nul en 2eme position ...etc

Bien sûr c'est plus chiant à programmer ;-)

Commentaire de dPompei2 le 03/05/2006 14:16:47

comme tu dis: c'est plus chiant à programmer ... et moi je voulais le faire en un jour :p

Commentaire de JCDjcd le 05/05/2006 20:07:22

Le faire en un jour ... j'ai fait les DEUX algorithmes en un meme jour, c'est pas la fin du monde non plus !!

Commentaire de dPompei2 le 05/05/2006 21:11:48

wai mais moi je venais d'apprendre celui que j'ai fait le jours meme :p l'autre, je connais tjrs pas, mais c'est pas grave, jai pas envie de l'apprendre mnt :)

Commentaire de fener3475 le 28/03/2008 12:19:52

jai un devoir a faire c dire ke D n+1 > 0 avec le calcul des mineurs c une demonstration pleaseeee aider moi

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

effacer l'ecran de la console dos en C [ par gollum ] Comment effecer l'ecran de la console DOS en C ? [VC++] Taille du text dans une application console [ par Cybmat ] SalutVoila je voudrai savoir comment on change la taille du text ecrit dans uneapplication console avec printf() .Merci d'avance BCBv3. Utilisation de AnsiString en mode console [ par jm14d ] Pour utiliser la classe AnsiString sous Borland v3, en mode graphique c'est OK : j'inclus VCL.h et ça fonctionne. Par contre en mode console je ne m'e Problème pour dériver une classe [ par arc59 ] J'ai créé une classe Matrice comportant des fonctions get_ele, set_ele (toutes les 2 sont "virtual") et la redéfinition de l'opérateur +.Dans ma class fichier.h [ par bidules ] Bonjour,j'aimerais savoir s'il est possible de mettre des structures dans un fichier d'entete.Car j'ai fais l'essai mais lors de la compilation pour c comment utilise t on les couleurs sous la console [ par psycho ] j aimerais savoir quels sont les instructions qui permettent d incorporer de la couleur sous la console(j utilise visual studio), ainsi que les fichie Propriété de la fenetre de console [ par Orkblutt ] Salut,j'aimerai fixer les parametres de la fenetre de console: largeur, hauteur, tampon...Quelle est la classe à utiliser pour configurer ces parametr Du son sous console dos (devcpp) ? [ par dionysos ] Bonjour,Quelles fonctions et quelles bibliotheques utiliser pour emettre des sons (de differentes tonalites ou de differentes frequences), en C, conso Du son sous console dos...? [ par dionysos ] Bonjour,Quelles fonctions et quelles bibliotheques utiliser pour emettre des sons (de differentes tonalites ou de differentes frequences), en C, conso Du son sous console dos???? [ par dionysos ] bonjour,avec devcpp quelles fonctions et quelles bibliotheques utiliser pour générer du son en console dos, et en C.Merci


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,608 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales