Pytanie:
Czy istnieje ustalona procedura lub teoria generowania kodu, która skutecznie stosuje mnożenie macierzy-wektora, gdy matryca jest gęsta i wypełniona tylko zerami i zerami? Najlepiej byłoby, gdyby zoptymalizowany kod systematycznie wykorzystywał wcześniej obliczone informacje w celu ograniczenia powielania pracy.
Innymi słowy, mam macierz i chcę wykonać pewne wstępne obliczenia na podstawie , które sprawią, że obliczenie będzie możliwie najbardziej wydajne, gdy później otrzymam wektor .
przeciwko jest prostokątną gęstą macierzą binarną znaną w „czasie kompilacji”, natomiast jest nieznanym wektorem rzeczywistym znanym tylko w „czasie wykonywania”.
Przykład 1: (okno przesuwne)
Pozwól, że użyję łatwego, małego przykładu, aby zilustrować mój punkt widzenia. Rozważmy macierz, Załóżmy, że zastosujemy tę macierz do wektora aby uzyskać . Następnie wpisy wyniku to:
Wykonanie standardowego mnożenia macierzy i wektora spowoduje obliczenie dokładnie w ten sposób. Jednak wiele z tych prac jest zbędnych. Możemy wykonać to samo obliczenie macierzy przy mniejszym koszcie, śledząc „sumę bieżącą” i dodając / odejmując, aby uzyskać następną liczbę:
Przykład 2: (struktura hierarchiczna)
W poprzednim przykładzie możemy po prostu śledzić bieżącą sumę. Jednak zwykle trzeba stworzyć i przechowywać drzewo wyników pośrednich. Na przykład rozważmy Można efektywnie obliczyć przy użyciu drzewa wyników pośrednich:
- Oblicz i i dodaj je, aby uzyskać .
- Oblicz i i dodaj je, aby otrzymać .
- Dodaj i aby uzyskaćw 3 w 1
Struktura w powyższych przykładach jest łatwa do zauważenia, ale w przypadku rzeczywistych macierzy, którymi jestem zainteresowany, struktura nie jest taka prosta.
Przykład 3: (niska ranga)
Aby wyjaśnić pewne zamieszanie, matryce na ogół nie są rzadkie. W szczególności metoda rozwiązująca ten problem musi być w stanie znaleźć wydajne metody stosowania macierzy, w których duże bloki są wypełnione jednymi. Rozważmy na przykład
Macierz ta może być rozłożona jako różnica dwóch macierzy rangi 1,
więc jego działanie na wektorze można efektywnie obliczyć, w 1
Motywacja:
Pracuję nad metodą numeryczną do przetwarzania obrazów i istnieje kilka dużych gęstych matryc o różnych strukturach, które są ustalone na zawsze. Później te macierze będą musiały zostać zastosowane do wielu nieznanych wektorów które będą zależeć od danych wejściowych użytkownika. W tej chwili używam ołówka i papieru, aby wymyślić skuteczny kod dla każdej matrycy, ale zastanawiam się, czy proces można zautomatyzować.v i
Edycja: (postscript)
Wszystkie dotychczasowe odpowiedzi (z 15 września 2015 r.) Są interesujące, ale żadna z nich nie odpowiada tak zadowalająco, jak się spodziewałem. Prawdopodobnie okazuje się, że jest to trudne pytanie badawcze i nikt nie zna dobrej odpowiedzi.
Od upływu czasu nagradzam nagrodę za odpowiedź EvilJS, ponieważ odpowiada ona na właściwe pytanie. Chciałbym jednak, aby odpowiedź zawierała bardziej jasne i szczegółowe wyjaśnienia.
Odpowiedź tranisstora tworzy związek między tym pytaniem a problemem Online Moolean Matrix-Vector Multiplication (OMv), ale związek nie jest dokładnie tym, o co pyta to pytanie. W szczególności poniższe założenie nie pasuje (moje śmiałe podkreślenie),
Załóżmy teraz, że dla wszystkich i wszystkich macierzy n × n M A n , M v M v O ( n 2 - ε ) ε > 0 znamy algorytm , że dla wszystkich wektorów oblicza w czasie naprawdę subkwadratowym, tj. W czasie dla niektórych .
To, czy istnieją algorytmy subkwadratowe dla wszystkich macierzy, jest ortogonalne wobec pytania o znalezienie algorytmu dla konkretnej macierzy, który jest tak szybki, jak to możliwe. Większość matryc 0-1 wygląda jak losowy szum i (jeśli miałbym zgadywać) prawdopodobnie nie ma algorytmów subkwadratowych. Jednak fakt, że istnieją naprawdę złe matryce, nie przeszkadza mi w znalezieniu szybkiego algorytmu na dobrej matrycy, na przykład macierzy „przesuwanego okna”.
Odpowiedzi vzn, pierwsza odpowiedź , druga odpowiedź są interesujące (i moim zdaniem nie zasługują na tak wiele ocen), ale nie odnoszą się do pytania z powodów omówionych w komentarzach tam.