目录
第1部分 稀疏矩阵概述
1.1 概述
稀疏矩阵指矩阵中的大多数元素的值都为0,由于其中非常多的元素都是0,使用常规方法进行存储非常的浪费空间,所以采用另外的方法存储稀疏矩阵。
1.2 COO矩阵的原理
Coordinate(COO)格式是用来描述稀疏矩阵一种方法或数据结构。
Coordinate(COO)格式本身是一个矩阵,用COO矩阵,描述另一个目标稀疏矩阵,原理如下:
这是非常简单的一种方式,使用一个三元组构成的三维COO矩阵来描述任意维度的稀疏矩阵。
三元组分别表示稀疏矩阵中的元素(所在行,所在列,元素值)。
如上图目标矩阵,一共有4*4的目标矩阵,共16个元素,其中4个非零元素:
(0, 0) 位置的值是1。
(0,1) 位置的值是7
(1,1) 位置的值是2
(1,2) 位置的值是8
因此需要3 * 4的COO矩阵,来描述一个4*4的稀疏矩阵。
很显然,通过上述方法,目标稀疏矩阵的每个位置,需要通过3个数组来表示,增加了存储空间。
因此当矩阵规模比较小时,上述的表示是浪费存储空间的。
只有当矩阵的规模比较大,且是稀疏矩阵时,上述的表示才体现出优势。
第2部分 稀疏矩阵创建的代码示例
2.1 环境准备
import numpy as np import torch print("Hello World") print(torch.__version__) print(torch.cuda.is_available())
2.2 COO矩阵
indices = torch.tensor([[0, 0, 1, 1], [0, 1, 1, 2]]) values = torch.tensor([1, 7, 2, 8], dtype=torch.float32) a = torch.sparse_coo_tensor(indices=indices, values=values, size=[4, 4]) print(a) print(a.device) print(a.layout) print(a.dtype) #tensor的数据类型 print(a.type) #tensor本身的类型 print(a.type()) #tensor的数据类型 print(a.size()) print(a.shape) #tensor的维度
输出: tensor(indices=tensor([[0, 0, 1, 1], [0, 1, 1, 2]]), values=tensor([1., 7., 2., 8.]), size=(4, 4), nnz=4, layout=torch.sparse_coo) cpu torch.sparse_coo torch.float32 <built-in method type of Tensor object at 0x000002655E57B980> torch.sparse.FloatTensor torch.Size([4, 4]) torch.Size([4, 4])
2.3 目标稀疏矩阵
b = a.to_dense() #把COO矩阵转换成稀疏矩阵 print(b) print(a.device) print(a.layout) print(a.dtype) #tensor的数据类型 print(a.type) #tensor本身的类型 print(a.type()) #tensor的数据类型 print(a.size()) print(a.shape) #tensor的维度
输出: tensor([[1., 7., 0., 0.], [0., 2., 8., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]) cpu torch.sparse_coo torch.float32 <built-in method type of Tensor object at 0x000002655E57B980> torch.sparse.FloatTensor torch.Size([4, 4]) torch.Size([4, 4])