Frage:
Gibt es eine etablierte Prozedur oder Theorie zum Erzeugen von Code, die eine Matrix-Vektor-Multiplikation effizient anwendet, wenn die Matrix dicht ist und nur mit Nullen und Einsen gefüllt ist? Im Idealfall würde der optimierte Code systematisch auf zuvor berechnete Informationen zurückgreifen, um Doppelarbeit zu reduzieren.
Mit anderen Worten, ich habe eine Matrix und möchte eine Vorberechnung auf der Grundlage von , um so effizient wie möglich zu berechnen , wenn ich später den Vektor erhalte .
ist eine rechteckige dichte binäre Matrix, die zur "Kompilierzeit" bekannt ist, während ein unbekannter reeller Vektor ist, der nur zur "Laufzeit" bekannt ist.
Beispiel 1: (Schiebefenster)
Lassen Sie mich ein einfaches kleines Beispiel verwenden, um meinen Standpunkt zu veranschaulichen. Betrachten Sie die Matrix Angenommen, wir wenden diese Matrix auf einen Vektor an, um w = Mv zu erhalten . Dann lauten die Einträge des Ergebnisses \ begin {align} w_1 & = v_1 + v_2 + v_3 + v_4 + v_5 \\ w_2 & = v_2 + v_3 + v_4 + v_5 + v_6 \\ w_3 & = v_3 + v_4 + v_5 + v_6 + v_7 \\ w_4 & = v_4 + v_5 + v_6 + v_7 + v_8 \ end {align}
Wenn Sie eine Standardmatrix-Vektor-Multiplikation durchführen, wird genau dies berechnet. Ein Großteil dieser Arbeit ist jedoch überflüssig. Wir könnten die gleiche Matrixberechnung zu geringeren Kosten durchführen, indem wir eine "laufende Summe" verfolgen und addieren / subtrahieren, um die nächste Zahl zu erhalten:
Beispiel 2: (hierarchische Struktur)
Im vorherigen Beispiel konnten wir nur eine laufende Summe verfolgen. Normalerweise müsste jedoch ein Baum mit Zwischenergebnissen erstellt und gespeichert werden. Angenommen,
- Berechnen Sie und und addieren Sie sie, um w_3 zu erhalten .
- Berechnen Sie und und addieren Sie sie, um w_2 zu erhalten .
- Addiere und , um zu erhaltenw 3 w 1
Die Struktur in den obigen Beispielen ist leicht zu sehen, aber für die tatsächlichen Matrizen, die mich interessieren, ist die Struktur nicht so einfach.
Beispiel 3: (niedriger Rang)
Um einige Verwirrungen zu beseitigen, sind die Matrizen im Allgemeinen nicht spärlich. Insbesondere muss eine Methode, die dieses Problem löst, in der Lage sein, effiziente Methoden zum Anwenden von Matrizen zu finden, bei denen große Blöcke mit Einsen gefüllt sind. Zum Beispiel betrachten
Diese Matrix kann als Differenz zweier Rang-1-Matrizen zerlegt werden,
so seine Wirkung auf einem Vektor berechnet werden kann effizient durch, w 1
Motivation:
Ich arbeite an einer numerischen Methode für einige Bildverarbeitungen, und es gibt mehrere große dichte Matrizen mit unterschiedlichen Strukturen, die für alle Zeiten festgelegt sind. Später müssen diese Matrizen auf viele unbekannte Vektoren angewendet werden , die von der Eingabe des Benutzers abhängen. Im Moment benutze ich Bleistift und Papier, um einen effizienten Code pro Matrix zu erstellen, aber ich frage mich, ob der Prozess automatisiert werden kann.v i
Bearbeiten: (Nachschrift)
Alle Antworten hier (Stand 05.09.15) sind interessant, aber keine beantwortet die Frage so zufriedenstellend, wie ich es mir erhofft hatte. Wahrscheinlich stellt sich heraus, dass dies eine schwierige Forschungsfrage ist und niemand eine gute Antwort kennt.
Da die Zeit abgelaufen ist, gewähre ich der Antwort von EvilJS das Kopfgeld, da es die richtige Frage anspricht. Ich wünsche mir jedoch, dass die Antwort klarere und detailliertere Erklärungen enthält.
Die Antwort von tranisstor stellt eine Verbindung zwischen dieser Frage und dem Online Boolean Matrix-Vector Multiplication (OMv) -Problem her, aber die Verbindung ist nicht genau das, was diese Frage stellt. Insbesondere passt die folgende Annahme nicht wirklich (fett hervorgehoben meine),
Nehmen wir nun an, dass wir für alle und alle Matrizen n × n einen Algorithmus , der für alle Vektoren in wirklich subquadratischer Zeit berechnet , dh in Zeit für einige .
Ob für alle Matrizen subquadratische Algorithmen existieren oder nicht, ist orthogonal zur Frage, ob ein Algorithmus für eine bestimmte Matrix gefunden werden soll, der so schnell wie möglich ist. Die meisten 0-1-Matrizen sehen aus wie zufälliges Rauschen und haben (wenn ich raten würde) wahrscheinlich keine subquadratischen Algorithmen. Die Tatsache, dass es wirklich schlechte Matrizen gibt, hindert mich jedoch nicht daran, einen schnellen Algorithmus für eine gute Matrix zu finden, beispielsweise eine "Schiebefenster" -Matrix.
Die Antworten von vzn, die erste Antwort und die zweite Antwort sind interessant (und meiner Meinung nach verdienen sie nicht so viele Abwertungen), gelten jedoch aus den in den Kommentaren genannten Gründen nicht für die Frage.