Domanda:
Esiste una procedura o teoria consolidata per la generazione di codice che applica efficacemente una moltiplicazione matrice-vettore, quando la matrice è densa e piena solo di zeri e di quelli? Idealmente, il codice ottimizzato farebbe un uso sistematico delle informazioni precedentemente calcolate per ridurre il lavoro duplicato.
In altre parole, ho una matrice e voglio fare un pre-calcolo basato su , che renderà il calcolo più efficiente possibile quando in seguito riceverò il vettore .
è una matrice binaria densa rettangolare conosciuta al "tempo di compilazione", mentre è un vettore reale sconosciuto che è noto solo al "tempo di esecuzione".
Esempio 1: (finestra scorrevole)
Consentitemi di usare un semplice esempio per illustrare il mio punto. Considera la matrice, Supponendo di applicare questa matrice a un vettore per ottenere . Quindi le voci del risultato sono, w 1
Fare una moltiplicazione matrice-vettore standard calcolerà esattamente in questo modo. Tuttavia, molto di questo lavoro è ridondante. Potremmo fare lo stesso calcolo di matrice a costi inferiori tenendo traccia di un "totale parziale" e aggiungendo / sottraendo per ottenere il numero successivo:
Esempio 2: (struttura gerarchica)
Nell'esempio precedente, potremmo semplicemente tenere traccia di un totale parziale. Tuttavia, in genere è necessario creare e memorizzare un albero di risultati intermedi. Ad esempio, considera Si potrebbe calcolarew=Mv in modoefficiente usando un albero di risultati intermedi:
- Calcola e w 7 e aggiungili per ottenere w 3 .
- Calcola e w 6 e aggiungili per ottenere w 2 .
- Aggiungi e w 3 per ottenere w 1
La struttura negli esempi sopra è facile da vedere, ma per le matrici attuali a cui sono interessato, la struttura non è così semplice.
Esempio 3: (livello basso)
Per chiarire un po 'di confusione, le matrici non sono generalmente sparse. In particolare, un metodo per risolvere questo problema deve essere in grado di trovare metodi efficienti per applicare matrici in cui blocchi di grandi dimensioni sono riempiti con quelli. Ad esempio, considera
Questa matrice può essere scomposta come differenza di due matrici di rango 1,
quindi la sua azione su un vettore può essere calcolata in modo efficiente da, w 1
Motivazione:
Sto lavorando a un metodo numerico per l'elaborazione di alcune immagini e ci sono diverse matrici dense di grandi dimensioni con strutture diverse che sono fisse per sempre. Successivamente dovranno queste matrici essere applicato a molti vettori sconosciuti v i che dipenderà input dell'utente. In questo momento sto usando carta e penna per elaborare un codice efficiente su una base per matrice, ma mi chiedo se il processo possa essere automatizzato.
Modifica: (poscritto)
Tutte le risposte qui finora (al 9/5/15) sono interessanti, ma nessuna risponde alla domanda in modo soddisfacente come avevo sperato. Probabilmente si scopre che questa è una domanda di ricerca difficile e nessuno conosce una buona risposta.
Da quando il tempo è scaduto, sto assegnando la generosità alla risposta di EvilJS poiché si rivolge alla domanda giusta. Tuttavia, vorrei che la risposta contenesse spiegazioni più chiare e dettagliate.
La risposta di tranisstor stabilisce una connessione tra questa domanda e il problema della moltiplicazione della matrice vettoriale booleana in linea (OMv), ma la connessione non è esattamente ciò che questa domanda sta ponendo. In particolare, il seguente presupposto non si adatta davvero (mio accento enfatizzato),
Supponiamo ora che per tutti gli e tutti i n × n matrici M sappiamo un algoritmo , che per tutti i vettori v calcola M v nel tempo veramente subquadratic, cioè in tempo O ( n 2 - ε ) per un po ' ε > 0 .
L'esistenza o meno di algoritmi subquadratici per tutte le matrici è ortogonale alla questione di trovare un algoritmo per una matrice specifica che sia il più veloce possibile. La maggior parte delle matrici 0-1 sembrano rumore casuale e (se dovessi indovinare) probabilmente non hanno algoritmi subquadratici. Tuttavia, il fatto che ci siano matrici davvero cattive là fuori non mi impedisce di trovare un algoritmo veloce su una matrice buona, ad esempio una matrice "finestra scorrevole".
Le risposte di vzn, la prima risposta , la seconda risposta sono interessanti (e secondo me non meritano così tanti voti negativi), ma non si applicano alla domanda per i motivi discussi nei commenti lì.