Produit matriciel avec Mysql [Résolu]

Produit matriciel avec Mysql [Résolu] - SQL/NoSQL - Programmation

Marsh Posté le 02-09-2009 à 16:34:35    

Bonjour,
Auriez-vous une astuce pour faire calculer efficacement le produit matriciel de 2 matrices stockées en base de donnée sous la forme :
Nom de la table = mat
Structure :

ligne : entier
colonne : entier
valeur : float


 
Point important : je veux faire le produit matriciel d'une matrice par sa transposée.
 
ex : une matrice 2*2 avec comme valeurs [1   5][3    8], on va avloir les lignes dans la table :
1, 1, 1
1, 2, 5
2, 1, 3
2, 2, 8
 
Je me disais que peut-être en faisant le produit cartésien + des sum ou autre, ça marcherait


SELECT m1.valeur, m2.valeur FROM mat m1, mat m2


Une idée, svp?
 
Merci :)


Message édité par rufo le 04-09-2009 à 14:47:32

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 02-09-2009 à 16:34:35   

Reply

Marsh Posté le 02-09-2009 à 20:20:57    

Une matrice 2x2 multipliée par une autre matrice 2x2 ça te fait une matrice 4x3 ?  [:oh shi-]
 
En tout cas j'espère que tes matrices sont pas grosses, parce qu'un produit matrice-matrice fait à la main ça pue déjà fortement, mais en plus en bidouillant des opérations sur des bases de données, je n'ose imaginer le truc...

Message cité 1 fois
Message édité par fhr le 02-09-2009 à 20:23:42
Reply

Marsh Posté le 02-09-2009 à 22:18:01    

je touche pas a la dope mais, y a pas moyen d'avoir des hook externe stockée dans la BD et genre appelée un truc en C/C++ ?

Reply

Marsh Posté le 03-09-2009 à 09:58:00    

fhr a écrit :

Une matrice 2x2 multipliée par une autre matrice 2x2 ça te fait une matrice 4x3 ?  [:oh shi-]
 
En tout cas j'espère que tes matrices sont pas grosses, parce qu'un produit matrice-matrice fait à la main ça pue déjà fortement, mais en plus en bidouillant des opérations sur des bases de données, je n'ose imaginer le truc...


 
ben non, mais je voulais montrer que ma matrice 2x2  = [1   5][3   8] était représentée en base par la table "mat"
1, 1, 1   (ligne = 1, colonne = 1, valeur = 1)
1, 2, 5   (ligne = 1, colonne = 2, valeur = 5)
2, 1, 3
2, 2, 8  
 
En plus, comme je veux calculer le produit d'une matrice par sa transposée, ça implique que la matrice résultat est symétrique et j'ai déjà trouvé comme calculer les termes Cij de la diagonale (i = j donc) :
Cii = SELECT SUM(m1.valeur * m2.valeur) AS Cii FROM mat m1 NATURAL JOIN mat m2 WHERE m1.ligne = i AND m2.ligne = i


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 03-09-2009 à 10:59:21    

En fait, ma requête peut avantageusement se transformée en :
Cii = SELECT SUM(valeur * valeur) AS Cii FROM mat WHERE ligne = i
 
Reste plus qu'à trouver d'autre requête pour calculer le reste de ma matrice :)


Message édité par rufo le 03-09-2009 à 10:59:52

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 04-09-2009 à 14:46:01    

C'est bon j'ai réussi à faire calculer à MySql via un script php le produit Mt * M ou M est une matrice et Mt est sa transposée :)
En gros, je fais :  

// Pour avoir les dimensions de la transposée de Mat
SELECT MAX(colonne) AS NbRows, MAX(ligne) AS NbCols FROM Mat
 
// Pour calculer les Cii (diagonale)
INSERT INTO ProduitMat SELECT colonne, colonne, SUM(valeur * valeur)  FROM Mat GROUP BY colonne
 
// Pour calculer des autres Cij de la partie supérieure de la matrice résultat de Mt * M puisque le résultat est une matrice symétrique
INSERT INTO ProduitMat SELECT m1.colonne, m2.colonne, SUM(m1.valeur * m2.valeur)  FROM Mat m1, Mat m2 WHERE m2.colonne > m1.colonne AND m1.ligne = m2.ligne GROUP BY m1.colonne, m2.colonne


 
Précision importante : faut définir sur la table Mat le couple de champs (ligne, colonne) comme clé primaire. Pour une matrice de 1412 lignes par 190 colonnes, ça m'a fait passer le temps de calcul de 16 mins à 2 mins sur un Athlon XP 2800+ ! :D
 
Et avant, en faisant faire le calcul par un script php pure, il me fallait un peu plus de 50 mins!


Message édité par rufo le 04-09-2009 à 14:54:15

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 04-09-2009 à 15:05:24    

T'es sûr que c'est plus lent de la sortir de la BDD et l'injecter dans quelque chose écrit en C/C++ (genre un handler Matlab) ?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 05-09-2009 à 22:49:42    

Ce produit matriciel rentre dans le cadre de l'implémentation de l'algo LSA (http://fr.wikipedia.org/wiki/Analyse_s%C3%A9mantique_latente ) pour un outil web. Avec du C/C++, faufra faire attentoin à faire du ANSI et si on change de plate-forme, faudra à chaque fois recompiler :/ Là, avec du php et du mysql, pas de pb :) Mais c'est sûr que le C/C++ serait probablement plus rapide. Pendnat un temps, je me disais que CUDA serait très utile (voir le topic qui lui est consacré sur ce forum en page 1). Joël F m'avait dit alors qu'une simple lib genre Boost ou LapackC++ ferait largement l'affaire. Donc si j'ai besoin de monter en perfs, j'aurai une marge de manoeuvre et sortirai "l'artillerie lourde" C/C++... Pour l'instant, j'en suis au stade du prototype et mise au point de l'algo + du lexique :D


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed