240626_昇思学习打卡-Day8-稀疏矩阵
稀疏矩阵
在一些应用场景中,比如训练二值化图像分割时,图像的特征是稀疏的,使用一堆0和极个别的1表示这些特征即费事又难看,此时就可以使用稀疏矩阵。通过参考大佬博文,结合个人理解,记录如下:
CSR(Compressed Sparse Row Format)
CSR矩阵通过使用三个一维数组来存储矩阵,row,column和value(各作者可能叫法不同,实际意义相同)
假如我们有一个稀疏矩阵
[
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
对于一个稀疏矩阵
[
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)
打卡图片: