Na verdade, eu escrevi o código original no Matlab para A * B, A e B esparsos. A pré-alocação de espaço para o resultado foi realmente a parte interessante. Observamos o que Godric aponta - que conhecer o número de não-zeros na AB é tão caro quanto a computação da AB.
Fizemos a implementação inicial do escasso Matlab por volta de 1990, antes do artigo de Edith Cohen que dava a primeira maneira prática e rápida de estimar com precisão o tamanho da AB. Reunimos um estimador de tamanho inferior e, se ficarmos sem espaço no meio da computação, dobramos a alocação e copiamos o resultado parcialmente calculado.
Não sei o que há no Matlab agora.
Outra possibilidade seria calcular AB uma coluna por vez. Cada coluna pode ser armazenada temporariamente em um acumulador esparso (consulte o artigo esparso do Matlab para obter uma explicação sobre isso) e espaço alocado para armazenar o tamanho exatamente conhecido da coluna de resultados. O resultado seria na forma de coluna dispersa e compactada dispersa - cada coluna no CSC, mas sem contiguidade entre colunas - usando 2 vetores de numcols de comprimento (início da coluna, comprimento da coluna), em vez de um, como metadados. É uma forma de armazenamento que pode valer uma olhada; tem outra força - você pode aumentar uma coluna sem realocar toda a matriz.