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.