Matrice creuse

Fermé
amiraenrique Messages postés 1 Date d'inscription jeudi 29 décembre 2011 Statut Membre Dernière intervention 30 décembre 2011 - 30 déc. 2011 à 00:55
doctormad Messages postés 430 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 2 avril 2015 - 30 déc. 2011 à 00:59
Bonjour,



<config>Windows 7 / Safari 535.7</config>
s'ils vous plait quelquin m'aider à calculer cette matrice
j'ai un exo qui dit:
voila 2 matrices creuses A et B tq A=(0 12 0 0) et B=(0 0 0 21)
34 0 0 54 0 4 0 13
0 0 31 0 0 0 0 13
0 142 0 0 1 24 11 67
et soit 2 vecteurs suivant:
a=(12 34 54 31 142) b=(21 4 13 1 24 11 67)
1-trouver la relation entre les elements non nuls de chaque matrice
2-donner l'algo qui transforme les 2 mat A et B en vecteurs a,b
3-generaliser pour la taille n*n
4-donner l'algo inverse qui fait le passage de a et b vers A et B
5-generaliser pour n
6-quelle est la relation entre la taille des matrices et des vecteurs
7- si la taille de vecteur ne satisfait pas la relation prescedent, que proposez vous comme solution pour ameliorer l'algo
8-utiliser C++ pour programmer les algorithmes trouve
j'ai essayer de reponder mais je suis débutante avec ce program c++ et j'ai pas étudier les mat creuses en math. voilà mes reponces....
1-pour la mat A on a les valeurs non nuls(12 34 54 31 142)
leurs indices (12 21 24 33 42)
pour B les val non nuls (21 4 13 13 1 24 11 67)
leurs indices (14 22 24 34 41 42 43 44)

on remarque que les indices de chaque mat sont inversé comme 41 et 14 ou bien répeté,
c la seule relation que j'ai trouvé.
2-l'algo
A,B: matrice[4][4]
casenulle1,casenulle2:entier
coeff1,coeff2: double
casenulle1=0, casenulle2=0
pour i de 0 à 4 faire
pour j de 0 à 4 faire
lire(A[i][j],B[i][j])
finsi
fin pour
fin pour
pour i de 0 à 4 faire
pour j de 0 à 4 faire
si(A[i][j]=0) alors
casenulle1=casenulle1+1
finsi
fin pour
fin pour
pour i de 0 à 4 faire
pour j de 0 à 4 faire
si (B[i][j]=0) alors
casenulle2=casenulle2+1
finsi
fin pour
fin pour
coeff1=casenulle1/(i+j)
si(coeff1>0.5) alors
matriceReduite(A)
finsi
coeff2=casenulle2/(i+j)
si (coeff2>0.5) alors
matriceReduite2(B)
finsi


mais je ne sais comment aller de matReduite vers vecteurs a ou b
3- generalisation:
A,B: matrice[n][n]

casenulle1,casenulle2:entier
coeff1,coeff2: double
casenulle1=0, casenulle2=0
pour i de 0 à n faire
pour j de 0 à n faire
lire(A[i][j],B[i][j])
finsi
fin pour
fin pour
pour i de 0 à n faire
pour j de 0 à n faire
si(A[i][j]=0) alors
casenulle1=casenulle1+1
finsi
fin pour
fin pour
pour i de 0 à n faire
pour j de 0 à n faire
si (B[i][j]=0) alors
casenulle2=casenulle2+1
finsi
fin pour
fin pour
coeff1=casenulle1/(i+j)
si(coeff1>0.5) alors
matriceReduite(A)
finsi
coeff2=casenulle2/(i+j)
si (coeff2>0.5) alors
matriceReduite2(B)
finsi
4- l'algo inverse je ne sais rien pour le calculer
5-aussi
6- la relation c la taille de vecteurs est superieure ou egale au nbr de lignes ou de colonnes, j'ai seulement trouvé ça
7-?????
8-le program

#include <iostream>

using namespace std;
int main(int){
int MatrCreuse[4][4];
int MatrReduite[4][4];
int compteur;
compteur = 0;
{for (int i=0 ; i< 4; i++){
for (int j=0; j< 4; j++){
cout << "Entrer la veurleur en mm ";
cin >> MatrCreuse[i][j];
}
}}// boucle d'afectation de donnée
cout << endl;
{for (int i=0 ; i< 4; i++){
for (int j=0; j< 4; j++){
cout << MatrCreuse[i][j] <<" ";
}
}}// boucle 2 affichage de la matrice
for (int i=0 ; i< 4; i++){
for (int j=0; j< 4; j++){
if (MatrCreuse[i][j] !=0){
compteur++;
}//condition I
}
}// boucle de comptage
if (compteur > MatrCreuse[4][4]/2){
cout << " Creation de Matrice non efficace"<< endl;
}// condition II
else {
cout << endl;
for (int i=0; i< 3 ; i++){
for (int j=0; j< compteur; j++){
cout << MatrReduite[compteur][3];
}
} // fin d'affichage Matrice Réduite
}// fin du else

}// in
*fin de main
vraiment je ne sais pas cmt faire un program
s'il vous plait aidez moi

1 réponse

doctormad Messages postés 430 Date d'inscription mercredi 28 novembre 2007 Statut Membre Dernière intervention 2 avril 2015 99
30 déc. 2011 à 00:59
Le résultat est 42.
0