pytorch中,矩阵主要分为以下几类:
密集矩阵Dense Tensor:
标准的二维张量,存储所有元素(包括零元素)
也就是常说的邻接矩阵
稀疏矩阵Sparse Tensor:
含有大量的零元素的矩阵,分为稀疏COO矩阵(COO Format)和稀疏CSR矩阵(CSR Format)
COO:通过坐标和对应的值表示非零元素。它使用三个数组来表示矩阵的数据:indices
:一个二维张量,其中包含矩阵中非零元素的坐标。values
:一个一维张量,包含这些非零元素的值。shape
:一个表示矩阵形状的元组。
CSR:通过行指针、列索引和非零值表示稀疏矩阵(PyTorch的支持较少,主要使用COO格式)。
邻接矩阵转稀疏矩阵:pytorch 邻接矩阵转稀疏矩阵 (dense matrix to coo matrix)_pytorch 邻接表转sparsecoo-优快云博客
如果我们有一个稀疏矩阵,想要转成邻接矩阵,可以使用COO,但是注意,COO只会保留非零元素
# print(adj.shape) # [2, 306400]
# 改adj形状 稀疏矩阵转邻接矩阵
indices = adj.long()
values = torch.ones(indices.shape[1], device=indices.device)
shape = (input.shape[0], input.shape[0])
# torch.sparse_coo_tensor只能返非零元素的位置和值,不能直接返回稀疏矩阵
# adj_sparse = torch.sparse_coo_tensor(indices, values, shape, dtype=torch.float32)# [512,256]
# 创建一个全零的稠密矩阵
dense_adj = torch.zeros(shape, device=indices.device)
# 将非零元素更新到稠密矩阵
for i in range(indices.shape[1]):
dense_adj[indices[0, i], indices[1, i]] = values[i]
# 转换成稀疏矩阵
adj_sparse = dense_adj.to_sparse()
# print(adj_sparse.shape) # [3064,3064]
对角矩阵Diagonal Tensor
单位矩阵Identify Matrix
-
对角矩阵(Diagonal Tensor):只有主对角线及其上下对角线有非零元素,可以使用
torch.diag
创建。 -
单位矩阵(Identity Matrix):对角线上的元素都是1,其余元素都是0,可以使用
torch.eye
创建。
待补充