Питання:
Чи існує встановлена процедура чи теорія для генерування коду, яка ефективно застосовує множення матричного вектора, коли матриця щільна та заповнена лише нулями та одиницями? В ідеалі оптимізований код використовував би систематизовану раніше обчислену інформацію для зменшення дублювання роботи.
Іншими словами, у мене є матриця і я хочу зробити попередні обчислення на основі , які зроблять обчислення максимально ефективними, коли згодом я отримаю вектор .
являє собою прямокутну щільну двійкову матрицю, яка відома в "час компіляції", тоді як - невідомий реальний вектор, який відомий лише у "час виконання".
Приклад 1: (розсувне вікно)
Дозвольте скористатися простим невеликим прикладом, щоб проілюструвати свою думку. Розглянемо матрицю, Припустимо, ми застосуємо цю матрицю до вектора щоб отримати . Тоді записи результату:
Виконання стандартного множення матричного вектора буде обчислено саме таким чином. Однак багато цієї роботи є зайвою. Ми могли б зробити те саме обчислення матриць за меншими витратами, відстежуючи "загальну кількість" і додаючи / віднімаючи, щоб отримати наступне число:
Приклад 2: (ієрархічна структура)
У попередньому прикладі ми могли просто відслідковувати пробіг. Однак зазвичай потрібно створити і зберігати дерево проміжних результатів. Наприклад, розглянемо Можна обчислити ефективно, використовуючи дерево проміжних результатів:w=Mv
- Compute і , і додати їх , щоб отримати .w 7 w 3
- Compute і , і додати їх , щоб отримати .w 6 w 2
- Додайте і щоб отриматишw 1
Структуру в наведених вище прикладах легко зрозуміти, але для власне матриць, які мене цікавлять, структура не така проста.
Приклад 3: (низький ранг)
Щоб усунути деяку плутанину, матриці, як правило, не рідкі. Зокрема, метод вирішення цієї проблеми повинен вміти знаходити ефективні методи застосування матриць, де великі блоки заповнені ними. Наприклад, розглянемо
Цю матрицю можна розкласти як різницю двох матриць рангу-1,
тому його дію на вектор можна обчислити ефективно, w 1
Мотивація:
Я працюю над числовим методом для деякої обробки зображень, і є кілька великих щільних матриць з різними структурами, які фіксуються на весь час. Пізніше ці матриці потрібно буде застосувати до багатьох невідомих векторів які залежатимуть від введення користувача. Зараз я використовую олівцем і папером, щоб придумати ефективний код на матричній основі, але мені цікаво, чи можна процес автоматизувати.v i
Редагувати: (постскрипт)
Усі відповіді, які зараз є тут (станом на 5.05.2015), цікаві, але жодна відповідь на це питання не задоволена, як я сподівався. Напевно, виявляється, що це важке дослідницьке питання, і ніхто не знає гарної відповіді.
Оскільки час минув, я присуджую винагороду за відповідь EvilJS, оскільки вона стосується правильного питання. Однак я хочу, щоб відповідь містила більш чіткі та детальні пояснення.
Відповідь tranisstor пов'язує це запитання з проблемою Інтернет-булевої матриці-векторного множення (OMv), але з'єднання не є саме тим, що задається цим питанням. Зокрема, таке припущення не відповідає дійсності (сміливий акцент у мене),
Тепер припустимо, що для всіх і всіх матриць n × n M ми знаємо алгоритм , що для всіх векторів обчислює по-справжньому підквадратичний час, тобто за час для деяких . v M v O ( n 2 - ε ) ε > 0
Існує чи ні існують підквадратичні алгоритми для всіх матриць, ортогональне питання пошуку алгоритму для певної матриці, яка є максимально швидкою. Більшість матриць 0-1 виглядають як випадковий шум і (якщо б я здогадувався), ймовірно, не мають підквадратичних алгоритмів. Однак той факт, що там дійсно погані матриці, не заважає мені знайти швидкий алгоритм на хорошій матриці, наприклад, матриці "ковзаючого вікна".
Відповіді vzn, перша відповідь , друга відповідь цікаві (і, на мою думку, не заслуговують такої кількості голосів), але вони не стосуються питання з причин, обговорених у коментарях.