Produit matriciel avec Mysql [Résolu] - SQL/NoSQL - Programmation
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 ?
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...
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++ ?
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 ? |
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
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
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 |
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+ !
Et avant, en faisant faire le calcul par un script php pure, il me fallait un peu plus de 50 mins!
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) ?
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
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