240626_昇思学习打卡-Day8-稀疏矩阵

240626_昇思学习打卡-Day8-稀疏矩阵

稀疏矩阵

在一些应用场景中,比如训练二值化图像分割时,图像的特征是稀疏的,使用一堆0和极个别的1表示这些特征即费事又难看,此时就可以使用稀疏矩阵。通过参考大佬博文,结合个人理解,记录如下:

CSR(Compressed Sparse Row Format)

CSR矩阵通过使用三个一维数组来存储矩阵,row,column和value(各作者可能叫法不同,实际意义相同)

img

假如我们有一个稀疏矩阵
[ 1 7 0 0 0 2 8 0 5 0 3 9 0 6 0 4 ] \left[ \begin{matrix} 1 & 7 & 0 & 0 \\ 0 & 2 & 8 & 0 \\ 5 & 0 & 3 & 9 \\ 0 & 6 & 0 & 4 \\ \end{matrix} \right] 1050720608300094
此时我们可以轻易地看出

value=([1,7,2,8,5,3,9,6,4])  # 里面所有的非零项,从左往右从上往下拿出来
shape=(4,4)

对于row和column来说就比较难看了,相对来说column较简单,column就是每一个非零数对应的列数,我们对照着value来看:

对value的第一个值1,他在稀疏矩阵中第一行第一列,换成索引就是0行0列,此时他在column中的值就是0(列)

对value的第二个值7,他在稀疏矩阵中第一行第二列,换成索引就是0行1列,此时他在column中的值就是1(列)

对value的第三个值2,他在稀疏矩阵中第二行第二列,换成索引就是1行1列,此时他在column中的值就是1(列)

对value的第四个值8,他在稀疏矩阵中第二行第三列,换成索引就是1行2列,此时他在column中的值就是2(列)

对value的第五个值5,他在稀疏矩阵中第三行第一列,换成索引就是2行0列,此时他在column中的值就是0(列)

对value的第六个值3,他在稀疏矩阵中第三行第三列,换成索引就是2行2列,此时他在column中的值就是2(列)

对value的第七个值9,他在稀疏矩阵中第三行第四列,换成索引就是2行3列,此时他在column中的值就是3(列)

对value的第八个值6,他在稀疏矩阵中第四行第二列,换成索引就是3行1列,此时他在column中的值就是1(列)

对value的第九个值4,他在稀疏矩阵中第四行第四列,换成索引就是3行3列,此时他在column中的值就是3(列)

所以得到column的值为

column=([0,1,1,2,0,2,3,1,3])

然后让我们来关注row的值,row的长度是原张量的行数+1,比如此处原张量为4行,所以我们row的长度就是5,row的定义为每一行第一个非零元素在value中的位置,这也才4个数,所以还要再加一个,value的总长度,说的比较抽象,以下举例说明:

首先第一行,第一行的第一个非零元素1,在value中位于第一个,转换成索引就是0,所以第一行在row中的值就是0。

其次第二行,第二行的第一个非零元素2,在value中位于第三个,转换成索引就是2,所以第二行在row中的值就是2。

其次第三行,第三行的第一个非零元素5,在value中位于第五个,转换成索引就是4,所以第三行在row中的值就是4。

其次第四行,第四行的第一个非零元素6,在value中位于第八个,转换成索引就是7,所以第四行在row中的值就是7。

其次第五行,欸等等,第五行在哪呢。没有的啦,row中第五个元素就是value的总长度啦,所以第五个值就是9。

所以row的值就出来咯

row=([0,2,4,7,9])

COOTensor

相对较为简单,仅存储非零元素及每个非零元素的坐标,可视化较强,也是通过使用三个一维数组来存储矩阵,row,column和value

img

对于一个稀疏矩阵
[ 1 7 0 0 0 2 8 0 5 0 3 9 0 6 0 4 ] \left[ \begin{matrix} 1 & 7 & 0 & 0 \\ 0 & 2 & 8 & 0 \\ 5 & 0 & 3 & 9 \\ 0 & 6 & 0 & 4 \\ \end{matrix} \right] 1050720608300094
value、shape、column值都和CSR矩阵相同:

value=([1,7,2,8,5,3,9,6,4])  # 里面所有的非零项,从左往右从上往下拿出来
shape=(4,4)
column=([0,1,1,2,0,2,3,1,3])

row有所不同,此时的row代表的是每一个非零元素在第几行,比如:

第一个非零元素1在第一行,行索引为0,所以该元素对应的row值为0。

第二个非零元素7在第一行,行索引为0,所以该元素对应的row值为0。

第三个非零元素2在第二行,行索引为1,所以该元素对应的row值为1。

第四个非零元素8在第二行,行索引为1,所以该元素对应的row值为1。

第五个非零元素5在第三行,行索引为2,所以该元素对应的row值为2。

第六个非零元素3在第三行,行索引为2,所以该元素对应的row值为2。

第七个非零元素9在第三行,行索引为2,所以该元素对应的row值为2。

第八个非零元素6在第四行,行索引为3,所以该元素对应的row值为3。

第九个非零元素4在第四行,行索引为3,所以该元素对应的row值为3。

所以该矩阵的row为

row=([0,0,1,1,2,2,2,3,3])

参考博客:

稀疏矩阵的存储格式 | Xiang的博客 (flyxu.github.io)
打卡图片:

image-20240626204852433

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值