Question:
Existe-t-il une procédure ou une théorie établie pour générer du code qui applique efficacement une multiplication matrice-vecteur, lorsque la matrice est dense et remplie uniquement de zéros et de uns? Idéalement, le code optimisé utiliserait systématiquement les informations précédemment calculées pour réduire le travail en double.
En d'autres termes, j'ai une matrice et je veux faire un pré-calcul basé sur , qui rendra le calcul de aussi efficace que possible lorsque je recevrai plus tard le vecteur .
v est une matrice binaire dense rectangulaire qui est connue au "moment de la compilation", alors que est un vecteur réel inconnu qui n'est connu qu'au "temps d'exécution".
Exemple 1: (fenêtre coulissante)
Permettez-moi d'utiliser un petit exemple simple pour illustrer mon propos. Considérons la matrice, Supposons que nous appliquons cette matrice à un vecteur pour obtenir . Les entrées du résultat sont alors,
Faire une multiplication matrice-vecteur standard calculera exactement de cette façon. Cependant, une grande partie de ce travail est redondante. Nous pourrions faire le même calcul matriciel à moindre coût en gardant une trace d'un "total cumulé" et en ajoutant / soustrayant pour obtenir le nombre suivant:
Exemple 2: (structure hiérarchique)
Dans l'exemple précédent, nous pourrions simplement garder une trace d'un total cumulé. Cependant, il faudrait généralement créer et stocker un arbre de résultats intermédiaires. Par exemple, considérons On pourrait calculer w = Mv efficacement en utilisant un arbre de résultats intermédiaires:w=Mv
- Calculez et et ajoutez-les pour obtenir .
- Calculez et et ajoutez-les pour obtenir .
- Ajoutez et pour obtenirw 3 w 1
La structure dans les exemples ci-dessus est facile à voir, mais pour les matrices réelles qui m'intéressent, la structure n'est pas si simple.
Exemple 3: (bas rang)
Pour dissiper une certaine confusion, les matrices ne sont généralement pas clairsemées. Plus précisément, une méthode résolvant ce problème doit être en mesure de trouver des méthodes efficaces pour appliquer des matrices lorsque de grands blocs en sont remplis. Par exemple, considérez
Cette matrice peut être décomposée en une différence de deux matrices de rang 1,
donc son action sur un vecteur peut être calculée efficacement par, w 1
Motivation:
Je travaille sur une méthode numérique pour certains traitements d'image, et il existe plusieurs grandes matrices denses avec des structures différentes qui sont fixes pour toujours. Plus tard, ces matrices devront être appliquées à de nombreux vecteurs inconnus qui dépendront de l'entrée de l'utilisateur. À l'heure actuelle, j'utilise du papier et du crayon pour trouver du code efficace sur une base matricielle, mais je me demande si le processus peut être automatisé.v i
Modifier: (postscript)
Jusqu'à présent, toutes les réponses (au 9/5/15) sont intéressantes, mais aucune ne répond à la question de manière aussi satisfaisante que je l'espérais. Il s'avère probablement que c'est une question de recherche difficile, et personne ne connaît une bonne réponse.
Depuis que le temps est écoulé, j'accorde la prime à la réponse d' EvilJS car elle répond à la bonne question. Cependant, je souhaite que la réponse contienne des explications plus claires et détaillées.
La réponse de tranisstor établit un lien entre cette question et le problème de multiplication matricielle-vectorielle en ligne (OMv), mais la connexion n'est pas exactement ce que cette question pose. En particulier, l'hypothèse suivante ne correspond pas vraiment (je souligne en gras),
Supposons maintenant que pour tout et toutes matrices n × n M nous savons un algorithme , que pour tous les vecteurs calcule dans le temps vraiment subquadratic, soit en temps pour certains . v M v O ( n 2 - ε ) ε > 0
Qu'il existe ou non des algorithmes sous-quadratiques pour toutes les matrices est orthogonal à la question de trouver un algorithme pour une matrice spécifique aussi rapide que possible. La plupart des matrices 0-1 ressemblent à du bruit aléatoire et (si je devais deviner) n'ont probablement pas d'algorithmes sous-quadratiques. Cependant, le fait qu'il y ait vraiment de mauvaises matrices là-bas ne m'empêche pas de trouver un algorithme rapide sur une bonne matrice, par exemple, une matrice de "fenêtre coulissante".
Les réponses de vzn, première réponse , deuxième réponse sont intéressantes (et à mon avis ne méritent pas autant de downvotes), mais elles ne s'appliquent pas à la question pour les raisons évoquées dans les commentaires.
la source
Réponses:
Si cela est possible, essayez d'exploiter la nature tridiagonale en bande de la matrice.
Sinon, si la matrice ne contient qu'un nombre constant de valeurs distinctes (ce qui est sûrement binaire), vous devriez essayer l'algorithme Mailman (par Edo Liberty, Steven W. Zucker dans le rapport technique de l'université de Yale # 1402): optimisé sur un dictionnaire fini
L'élimination de la sous-expression commune est connue depuis un certain temps comme la multiplication de constantes multiples, mais descendre au niveau de la porte est une option - les modèles utilisés ici peuvent être utilisés séparément comme solution ou fusionnés avec d'autres méthodes, le document pour cette "Amélioration de l'élimination de la sous-expression commune" Algorithm with A New Gate-Level Delay Computing Method "par Ning Wu, Xiaoqiang Zhang, Yunfei Ye et Lidong Lan publié dans" Actes du Congrès mondial d'ingénierie et d'informatique 2013 Vol II WCECS 2013, 23-25 octobre 2013, San Francisco, États-Unis " CSE au niveau de la porte
Il existe également une méthode brute mais fonctionnelle, pour générer une matrice symbolique avec des constantes, un vecteur avec des variables et le connecter à Static Single Assingment (SSA) à partir de compilateurs, qui automatise le processus d'écriture des matrices à la main.
nouveau prototype d'algorithme
Ce que vous avez fait avec l'exécution de la somme: Donne 10 opérations , et avec mon idée initiale d'utiliser Thomas, c'est équivalent. Pour l'instant, j'écris et teste toujours un nouvel algorithme, les temps d'exécution sont également méchants , mais le premier résultat du test m'a donné une réponse surprenante:
Ce qui donne 9 opérations , en les définissant comme + ou - est 1, et = est 0.
Cela donne 7 opérations , mon résultat d'algorithme a donné: Ce qui donne 6 opérations Pour l'instant je peux dire que j'utilise la distance de Hamming, & et | opérations au niveau du bit, comptage des utilisations et création de quelque chose comme Cocke – Younger – Kasami (CYK) - "un algorithme d'analyse pour les grammaires sans contexte, du nom de ses inventeurs, John Cocke, Daniel Younger et Tadao Kasami. Il utilise l'analyse ascendante et la dynamique programmation." - de Wikipedia C'est la même technique que j'utilise pour construire des blocs de variables.
la source
Ceci est lié à une question de recherche ouverte, connue sous le nom de «problème de multiplication matricielle booléenne en ligne (OMv)». Ce problème se lit comme suit (voir [1]): Étant donné une matrice binaire et vecteurs de colonnes binaires , nous devons calculer avant l'arrivée de .M n v 1 , … , v n M v i v i + 1n×n M n v1,…,vn Mvi vi+1
Notez que le problème de la question est un peu plus général: il autorise matrices et vecteurs à valeur réelle. Observez que le problème avec matrices et vecteurs booléens est "plus facile", car il présente un cas particulier.m×n n×n
De toute évidence, l'algorithme naïf pour le problème de multiplication booléenne matricielle-vectorielle (qui utilise uniquement la multiplication matricielle-vecteur standard) prend le temps . Il y a une conjecture (voir par exemple [1]) que cela ne peut pas être fait vraiment plus rapidement que O ( n 3 ) . (Plus en détail, cette conjecture est la suivante: il n'existe pas d'algorithme vraiment sous-cubique, qui résout le problème de multiplication matricielle-booléenne en ligne, c'est-à-dire qu'il n'y a pas d'algorithme avec le temps d'exécution O ( n 3 - ε ) pour ε > 0 ).O(n3) O(n3) O(n3−ε) ε>0
Ce serait une percée dans le domaine des limites inférieures conditionnelles, si l'on pouvait prouver ou infirmer la conjecture ci-dessus.
[1] Unification et renforcement de la dureté pour les problèmes dynamiques via une conjecture de multiplication matrice-vecteur en ligne. par Henzinger, Krinninger, Nanongkai et Saranurak
[ http://eprints.cs.univie.ac.at/4351/1/OMv_conjecture.pdf ]
[2] Multiplication matrice-vecteur en temps sub-quadratique: (certains prétraitements sont nécessaires). par Williams
[ http://dl.acm.org/citation.cfm?id=1283383.1283490 ]
Mise à jour
L'idée de preuve est simple: supposons que nous pourrions donner des algorithmes rapides pour toutes les matrices jusqu'à une certaine taille (par exemple en distinguant tous les cas possibles). Après cette certaine taille, nous utilisons la division et la conquête.
Conclusion: Si vous pouviez utiliser des distinctions de casse sur les matrices d'entrée pour dériver des algorithmes rapides, alors vous pourriez améliorer la conjecture OMv.
la source
il s'agit essentiellement d'un CS de niveau recherche, le problème est étudié sous au moins deux aspects, l'un de la multiplication de matrices clairsemées (document d'exemple qui vient d'être cité), et le cas particulier des "matrices binaires clairsemées" est également étudié. le 2 ème cas est connu pour être lié à l'optimisation des programmes en ligne droite. les programmes minimaux peuvent également être comme des DAG avec deux types de «portes», l'addition et la multiplication, de sorte que certains documents de minimisation des circuits peuvent s'y connecter, et éventuellement un logiciel «standard» pourrait être adapté à cet effet. voici une référence spécifique sur le 2 e cas et aussi la même question sur la théorie avec une étude empirique initiale de base.
Représentation de matrices binaires clairsemées en tant que programmes linéaires pour une multiplication matricielle-vectorielle rapide / Neves, Araujo
Produit / chaîne de matrice booléenne à composition clairsemée rapide
la source
Je ne sais pas si ce problème a été étudié exactement, mais cette recherche est liée et semble une piste / un début raisonnable. il examine la décomposition hypergraphe pour la multiplication matricielle clairsemée. les matrices binaires sont un cas particulier de cette approche. cette approche trouvera des stratégies plus optimales que la méthode de multiplication "droite". d'autres optimisations (dans ce cadre) pourraient être possibles sur la base de la propriété de matrice binaire.
la source