Каковы наиболее практически эффективные алгоритмы умножения двух очень разреженных логических матриц (скажем, N = 200 и всего 100-200 ненулевых элементов)?
На самом деле, у меня есть преимущество в том, что когда я умножаю A на B, B заранее определены, и я могу выполнять произвольную сложную предварительную обработку на них. Я также знаю, что результаты продуктов всегда так же скудны, как и исходные матрицы.
«Довольно наивный» алгоритм (сканирование A по строкам; для каждого 1 бита A-строки, ИЛИ результата с соответствующей строкой B) оказывается очень эффективным и требует только нескольких тысяч инструкций ЦП для вычисления одного продукта. поэтому его будет непросто превзойти, и его можно превзойти только по постоянному коэффициенту (потому что в результате сотни битов). Но я не теряю надежды и прошу сообщество помочь :)
Ответы:
Я не хотел на это отвечать, потому что единственный теоретический результат, о котором я знаю в этом духе, - это мое имя на бумаге ...
(Примечание: этот алгоритм действительно полезен только для случая, когда одна матрица является плотной, а другая - разреженной. Этот случай часто встречается, хотя, например, при вычислении транзитивного замыкания разреженного графа матрица транзитивного замыкания в конечном итоге становится плотной по сравнению с исходной матрицей смежности.)
Бумага
Мы использовали эту структуру данных, чтобы дать более быстрые теоретические алгоритмы для APSP в разреженных невзвешенных графах.
источник
Я думаю, что вы называете «гиперразделенной» матрицей (nnz <n). Несколько лет назад я написал статью о том, как их умножить. По сути, это соединение внешнего продукта с умным многофакторным объединением, чтобы исключить реализацию промежуточных троек.
Булук и Гилберт, IPDPS 2008: http://gauss.cs.ucsb.edu/publication/hypersparse-ipdps08.pdf
источник