【Pytorch】稀疏矩阵的表示与加减运算

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

前提知识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也就是说坐标00处的值实际上为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)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6