前提知识:LongTensor()是64位整数型向量,FloatTensor()是32位浮点数向量。
有大量0元素的时候,我们可以使用坐标形式存储稀疏矩阵。
一个3*3的矩阵,但是只有坐标(0,0)处有值(值为1),其他地方全为0:
i = torch.LongTensor([[0],
[0]])
v = torch.FloatTensor([1])
a=torch.sparse.FloatTensor(i, v, torch.Size([3,3]))
a
未合并的稀疏矩阵向量:
i = torch.LongTensor([[0,0],
[0,0]])
v = torch.FloatTensor([1,5])
a=torch.sparse.FloatTensor(i, v, torch.Size([3,3]))
a
坐标(0,0)处值为1,又为5,非常反直觉。其实这只是未合并而已,合并的意思就是会加起来,从而变成6,也就是说坐标0,0处的值实际上为6。
a.coalesce()#进行合并操作
默认情况上,如果按照上述方法来构造稀疏矩阵,就是未合并状态uncoalesced=True
,而不管是否有重复的坐标。
属性计算
a.indices()#查看坐标
a.values()#查看非零值
#注意,这个针对的是coalesced的稀疏矩阵才可以。
a._indices()#前面加一个_,这个不需要合并的稀疏矩阵,其会原样返回构造时候的索引。
稀疏矩阵转换为稠密矩阵
a.to_dense() #将稀疏tensor转化为稠密tensor
两个稀疏矩阵相减(两个未合并的稀疏矩阵相减)
i = torch.LongTensor([[0,0],
[0,1]])
v = torch.FloatTensor([1,5])
a=torch.sparse.FloatTensor(i, v, torch.Size([3,3]))
i = torch.LongTensor([[0,0],
[0,2]])
v = torch.FloatTensor([1,4])
b=torch.sparse.FloatTensor(i, v, torch.Size([3,3]))
a-b
结果:
tensor(indices=tensor([[0, 0, 0],
[0, 1, 2]]),
values=tensor([ 0., 5., -4.]),
size=(3, 3), nnz=3, layout=torch.sparse_coo)