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
[WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|