Accueil > > > 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
Description
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
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
Sources de la même categorie
Commentaires et avis
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
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
RE : WIN APIRE : WIN API par racpp
Cliquez pour lire la suite par racpp WIN APIWIN API par omarino_007
Cliquez pour lire la suite par omarino_007
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|