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

前提知识: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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LRJ-jonas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值