Я фактически написал оригинальный код в Matlab для A * B, как A, так и B разреженный. Предварительное выделение места для результата было действительно интересной частью. Мы наблюдали, на что указывает Годрик - что знание числа ненулевых в AB столь же затратно, как и вычисление AB.
Первоначальную реализацию разреженного Matlab мы выполнили примерно в 1990 году, до публикации статьи Эдит Коэн, в которой был дан первый практичный и быстрый способ точной оценки размера AB. Мы собрали оценку меньшего размера, и если нам не хватило места в середине вычисления, удвоили распределение и скопировали частично вычисленный результат.
Я не знаю, что сейчас в Matlab.
Другая возможность - вычислять AB по одному столбцу за раз. Каждый столбец может быть временно сохранен в разреженном аккумуляторе (см. Разреженную статью Matlab для их объяснения), и место, выделенное для хранения точно известного размера столбца результата. Результат будет представлен в виде разбросанных сжатых разреженных столбцов - каждый столбец в CSC, но без смежности между столбцами - с использованием 2 векторов длинных чисел (начало столбца, длина столбца), а не один, в качестве метаданных. Это форма хранения, которая может стоить посмотреть; у него есть другая сила - вы можете увеличить столбец, не перераспределяя всю матрицу.