2010-04-06 7 views
3

Je suis à la recherche d'autres façons de faire une multiplication matricielle. Au lieu de stocker ma matrice comme un tableau à deux dimensions, j'utilise un vecteur tel queMultiplication de matrices utilisant des paires

vector<pair<pair<int,int >,int > > 

pour stocker ma matrice. La paire dans ma paire (paire) stocke mes indices (i, j) et l'autre int stocke la valeur pour la paire donnée (i, j). Je pensais que j'aurais peut-être de la chance en implémentant ma matrice éparpillée de cette façon.

Le problème est lorsque j'essaie de multiplier cette matrice avec elle-même.

Si cela était une mise en œuvre du tableau 2-d, aurait multiplié la matrice comme suit:

for(i=0; i<row1; i++) 
    { 
     for(j=0; j<col1; j++) 
     { 
      C[i][j] = 0; 
     for(k=0; k<col2; k++) 
      C[i][j] += A[i][j] * A[j][k]; 
     } 
    } 

Quelqu'un peut-il indiquer un moyen d'obtenir le même résultat en utilisant mon vecteur de « paire de paires » ?

Merci

+0

Une façon est d'utiliser le même algorithme, mais les opérations d'indexation sur la matrice clairsemée. Ceci est inefficace cependant, à moins que vous ne réussissiez à obtenir des opérations d'indexation rapides (les hashtables viennent à l'esprit). Mais je suis sûr qu'il y a de meilleurs algorithmes là-bas (Google n'a pas été utile :() –

Répondre

1

Jusqu'à présent, vous pouvez stocker une valeur à un emplacement. Si vous voulez stocker plusieurs entrées non nulles dans la matrice, vous aurez besoin de plusieurs paires de paires dans une structure plus grande.

map<pair<int, int>, int> serait la prochaine étape logique. Vous pouvez maintenant itérer sur les lignes car la coordonnée first est plus significative dans l'ordre de tri map.

pour itérer sur les colonnes, inverser cette priorité:

typedef pair<int, int> mx_coord; 
struct reverse_compare { 
    bool operator() (mx_coord const &l, mx_coord const &r) const 
     { return l.second < r.second? true : 
       r.second < l.second? false : l.first < r.first; } 
}; 

typedef map< mx_coord, int > matrix; 
typedef map< mx_coord, int, reverse_compare > matrix_transpose; 

Pour multiplier A par B, transposer B et itérer sur A et B, en multipliant les éléments dont le jeu de coordonnées moins importantes, comme la commande permet naturellement vous allez ligne par ligne et colonne par colonne.

Pour transposent B:

matrix_transpose b_t(b.begin(), b.end()); // complexity: n log n 
+0

Hmm, peut-être qu'un itérateur transformant est un meilleur moyen d'y aller.Bien, cela devrait fonctionner assez bien pour prouver le concept – Potatoswatter

+0

Merci Potatocorn - Votre suggestion est d'utiliser une carte de 'paires' à la place d'un vecteur Qu'est-ce que nous gagnons en utilisant la carte dans ce contexte J'ai aussi quelques difficultés à comprendre le reverse_compare Pouvez-vous s'il vous plait éclaircir cela Merci –

+0

@sc_ray: Le 'map' vous permet d'avoir plus d'un élément différent de zéro.Avec une paire de coordonnées, vous recherchez la valeur.' reverse_compare' est utilisé pour transposer la matrice, vous permettant de parcourir d'abord les colonnes, ce qui est important à la multiplication – Potatoswatter

Questions connexes