Вопрос:
Существует ли установленная процедура или теория для генерации кода, который эффективно применяет умножение матрицы на вектор, когда матрица плотна и заполнена только нулями и единицами? В идеале оптимизированный код должен систематически использовать ранее вычисленную информацию для сокращения дублируемой работы.
Другими словами, у меня есть матрица и я хочу выполнить некоторые предварительные вычисления на основе , которые сделают вычисление максимально эффективным, когда я позже получу вектор .
является прямоугольной плотной двоичной матрицей, которая известна во время компиляции, тогда как является неизвестным вещественным вектором, который известен только во время выполнения.
Пример 1: (раздвижное окно)
Позвольте мне использовать простой небольшой пример, чтобы проиллюстрировать мою точку зрения. Рассмотрим матрицу
Выполнение стандартного умножения матрицы на вектор будет вычислено именно таким образом. Однако большая часть этой работы является излишней. Мы могли бы сделать то же матричное вычисление с меньшими затратами, отслеживая «промежуточный итог» и добавляя / вычитая, чтобы получить следующее число:
Пример 2: (иерархическая структура)
В предыдущем примере мы могли просто отслеживать итоговую сумму. Однако обычно нужно создать и сохранить дерево промежуточных результатов. Например, рассмотрим Можно эффективно вычислитьw=Mv,используя дерево промежуточных результатов:
- Вычислите и w 7 и сложите их, чтобы получить w 3 .
- Вычислите и w 6 и сложите их, чтобы получить w 2 .
- Добавьте и w 3, чтобы получить w 1
Структуру в приведенных выше примерах легко увидеть, но для интересующих меня матриц структура не так проста.
Пример 3: (низкий ранг)
Чтобы устранить некоторую путаницу, матрицы, как правило, не разрежены. В частности, метод, решающий эту проблему, должен быть в состоянии найти эффективные методы для применения матриц, где большие блоки заполнены единицами. Например, рассмотрим
Эта матрица может быть разложена как разность двух матриц ранга 1,
поэтому его действие на вектор может быть эффективно вычислено с помощью w 1
Мотивация:
Я работаю над численным методом для некоторой обработки изображений, и есть несколько больших плотных матриц с различными структурами, которые зафиксированы на все времена. Позже эти матрицы нужно будет применить ко многим неизвестным векторам v i, которые будут зависеть от ввода пользователя. Сейчас я использую карандаш и бумагу, чтобы придумать эффективный код для каждой матрицы, но мне интересно, можно ли автоматизировать этот процесс.
Изменить: (постскриптум)
Все ответы здесь (по состоянию на 05.09.15) интересны, но ни один из них не отвечает на вопрос так же удовлетворительно, как я надеялся. Вероятно, получается, что это сложный исследовательский вопрос, и никто не знает хорошего ответа.
Поскольку время истекло, я присуждаю награду за ответ EvilJS, поскольку он отвечает на правильный вопрос. Однако я хотел бы, чтобы ответ содержал более четкие и подробные объяснения.
Ответ tranisstor устанавливает связь между этим вопросом и проблемой онлайнового булево-матричного умножения (OMv), но эта связь не совсем то, что задает этот вопрос. В частности, следующее предположение не совсем подходит (жирный акцент мой),
Теперь предположим, что для всех и всех n × n матриц M мы знаем алгоритм , который для всех векторов v вычисляет M v за действительно субквадратичное время, т.е. за время O ( n 2 - ε ) для некоторого ε > 0 .
Существуют или нет субквадратичные алгоритмы для всех матриц, ортогонально вопросу о поиске алгоритма для конкретной матрицы, который будет максимально быстрым. Большинство матриц 0-1 выглядят как случайный шум и (если я угадал), вероятно, не имеют субквадратичных алгоритмов. Однако тот факт, что существуют действительно плохие матрицы, не мешает мне найти быстрый алгоритм на хорошей матрице, например, матрице «скользящего окна».
Ответы vzn, первый ответ , второй ответ интересны (и, по моему мнению, не заслуживают такого большого количества отрицательных голосов), но они не относятся к вопросу по причинам, обсуждаемым в комментариях.