如何将稀疏邻接矩阵转换为密集邻接矩阵?

How to convert sparse to dense adjacency matrix?

我正在尝试将仅包含非零元素([[行],[列]])的索引的稀疏邻接 matrix/list 转换为在索引处包含 1 的密集矩阵否则为0。我使用 Pytorch geometric (Documentation) 中的 to_dense_adj 找到了一个解决方案。但这并不完全是我想要的,因为密集矩阵的形状与预期不符。这是一个例子:

sparse_adj = torch.tensor([[0, 1, 2, 1, 0], [0, 1, 2, 3, 4]])

因此密集矩阵的大小应为 5x3(第二个数组“存储”列;非零元素位于 (0,0)、(1,1)、(2,2)、(1 ,3) 和 (0,4)) 因为第一个数组中的元素小于或等于 2.

然而,

dense_adj = to_dense(sparse_adj)[0]

输出一个稠密矩阵,但形状为 (5,5)。是否可以定义输出形状或是否有不同的解决方案来获得我想要的?

编辑:我有一个解决方案可以将其转换回稀疏表示,现在可以使用了

dense_adj = torch.sparse.FloatTensor(sparse_adj, torch.ones(5), torch.Size([3,5])).to_dense()
ind = dense_adj.nonzero(as_tuple=False).t().contiguous()
sparse_adj = torch.stack((ind[1], ind[0]), dim=0)

或者有更好的替代方法吗?

您可以通过先使用 torch.sparse 构建稀疏矩阵然后将其转换为稠密矩阵来实现此目的。为此,您需要提供 torch.sparse.FloatTensor 一个 2D 索引张量、一个值张量以及输出大小:

sparse_adj = torch.tensor([[0, 1, 2, 1, 0], [0, 1, 2, 3, 4]])
torch.sparse.FloatTensor(sparse_adj, torch.ones(5), torch.Size([3,5])).to_dense()

您可以使用

动态获取输出矩阵的大小
sparse_adj.max(axis=1).values + 1

所以变成:

torch.sparse.FloatTensor(
    sparse_adj, 
    torch.ones(sparse_adj.shape[1]), 
    (sparse_adj.max(axis=1).values + 1).tolist())