Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1477 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Produit matriciel avec Mysql [Résolu]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Produit matriciel avec Mysql [Résolu]

n°1920661
rufo
Pas me confondre avec Lycos!
Posté le 02-09-2009 à 16:34:35  profilanswer
 

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
mood
Publicité
Posté le 02-09-2009 à 16:34:35  profilanswer
 

n°1920725
fhr
Posté le 02-09-2009 à 20:20:57  profilanswer
 

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
n°1920737
Joel F
Real men use unique_ptr
Posté le 02-09-2009 à 22:18:01  profilanswer
 

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++ ?

n°1920838
rufo
Pas me confondre avec Lycos!
Posté le 03-09-2009 à 09:58:00  profilanswer
 

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
n°1920875
rufo
Pas me confondre avec Lycos!
Posté le 03-09-2009 à 10:59:21  profilanswer
 

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
n°1921293
rufo
Pas me confondre avec Lycos!
Posté le 04-09-2009 à 14:46:01  profilanswer
 

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
n°1921300
esox_ch
Posté le 04-09-2009 à 15:05:24  profilanswer
 

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
n°1921571
rufo
Pas me confondre avec Lycos!
Posté le 05-09-2009 à 22:49:42  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Produit matriciel avec Mysql [Résolu]

 

Sujets relatifs
[Résolu] Fuite mémoire, que libérer ?JDBC / Mysql
[RESOLU]Arrondi à partir d'une chaine de caractère[MYSQL] retirer la contrainte unique d'un champ
[résolu][Velocity & Hudson] Templates non copiés dans le classpath[mysql] Alias de nom de base ?
SDL_GetRGB (résolu)[Résolu] Génération flux RSS - Format de date
[Résolu] [BATCH] Tracer la commande deleteUtilisation de backreference avec REGEXP sous MySQL
Plus de sujets relatifs à : Produit matriciel avec Mysql [Résolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR