Я пытаюсь придумать быстрый алгоритм, чтобы найти результат операций, гдеОсобого случай разреженных матриц умножения
- L - симметричен
n x n
матрицы с вещественными числами. - A - редкий
n x m
матрица,m < n
. Каждая строка имеет один и только один ненулевой элемент и равна 1. Также гарантируется, что каждый столбец имеет не более двух ненулевых элементов.
Я придумал один алгоритм, но чувствую, что должно быть что-то быстрее, чем это.
Представим каждый столбец A как пару номеров строк с ненулевыми элементами. Если столбец имеет только один ненулевой элемент, его номер строки указан дважды. Например. для следующей матрицы
Такое представление было бы
column 0: [0, 2]; column 1: [1, 3]; column 2: [4, 4]
Или мы можем перечислить его как единый массив: A = [0, 2, 1, 3, 4, 4];
Теперь может быть вычислена как:
for (i = 0; i < A.length; i += 2):
if A[i] != A[i + 1]:
# sum of two column vectors, i/2-th column of L'
L'[i/2] = L[A[i]] + L[A[i + 1]]
else:
L'[i/2] = L[A[i]]
Чтобы рассчитать , мы делаем это еще раз:
for (i = 0; i < A.length; i += 2):
if A[i] != A[i + 1]:
# sum of two row vectors, i/2-th row of L''
L''[i/2] = L'[A[i]] + L'[A[i + 1]]
else:
L''[i/2] = L'[A[i]]
Временная сложность такого подхода является О (м п + т п), и пространство сложность (чтобы получить окончательный результат ) представляет собой О (п п). Мне интересно, можно ли улучшить его до O (m м) с точки зрения пространства и/или производительности?