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
COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE?COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE? par Matthieu MEZIL
Avec EF, les vues doivent être mappées sur des entity types. Le problème c'est que les entity types doivent avoir une clé. Avec EF, nous avons les complex type qui n'ont pas de clé mais les vues ne peuvent pas être mappées dessus. Avec EF4, il est possibl...
Cliquez pour lire la suite de l'article par Matthieu MEZIL [WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL?[WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL? par JeremyJeanson
Certain d'entre vous on peut être vécu cette situation embarrassante après quelques temps passer avec WF4 : Au début avec mon " ActivityDesigner" , tout allait bien. Et puis un jour j'ai au des problèmes de " Binding" . Alors nous sommes allé sur le site ...
Cliquez pour lire la suite de l'article par JeremyJeanson MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ?MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ? par junarnoalg
La prochaine session de MyTIC aura lieu à Namur, le 23 mars prochain. Pendant presque une heure, nous parlerons de SharePoint 2010. Voici un aperçu du programme.
Accueil : 17h30 Début de la session : 18h00 - Les nouvelles int...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
ERREUR DE POINTEURERREUR DE POINTEUR par africanwinners
Cliquez pour lire la suite par africanwinners
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|