php視頻網(wǎng)站怎么做百度導(dǎo)航
240626_昇思學習打卡-Day8-稀疏矩陣
稀疏矩陣
在一些應(yīng)用場景中,比如訓練二值化圖像分割時,圖像的特征是稀疏的,使用一堆0和極個別的1表示這些特征即費事又難看,此時就可以使用稀疏矩陣。通過參考大佬博文,結(jié)合個人理解,記錄如下:
CSR(Compressed Sparse Row Format)
CSR矩陣通過使用三個一維數(shù)組來存儲矩陣,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] ?1050?7206?0830?0094? ?
此時我們可以輕易地看出
value=([1,7,2,8,5,3,9,6,4]) # 里面所有的非零項,從左往右從上往下拿出來
shape=(4,4)
對于row和column來說就比較難看了,相對來說column較簡單,column就是每一個非零數(shù)對應(yīng)的列數(shù),我們對照著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])
然后讓我們來關(guān)注row的值,row的長度是原張量的行數(shù)+1,比如此處原張量為4行,所以我們row的長度就是5,row的定義為每一行的第一個非零元素在value中的位置,這也才4個數(shù),所以還要再加一個,value的總長度,說的比較抽象,以下舉例說明:
首先第一行,第一行的第一個非零元素1,在value中位于第一個,轉(zhuǎn)換成索引就是0,所以第一行在row中的值就是0。
其次第二行,第二行的第一個非零元素2,在value中位于第三個,轉(zhuǎn)換成索引就是2,所以第二行在row中的值就是2。
其次第三行,第三行的第一個非零元素5,在value中位于第五個,轉(zhuǎn)換成索引就是4,所以第三行在row中的值就是4。
其次第四行,第四行的第一個非零元素6,在value中位于第八個,轉(zhuǎn)換成索引就是7,所以第四行在row中的值就是7。
其次第五行,欸等等,第五行在哪呢。沒有的啦,row中第五個元素就是value的總長度啦,所以第五個值就是9。
所以row的值就出來咯
row=([0,2,4,7,9])
COOTensor
相對較為簡單,僅存儲非零元素及每個非零元素的坐標,可視化較強,也是通過使用三個一維數(shù)組來存儲矩陣,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] ?1050?7206?0830?0094? ?
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,所以該元素對應(yīng)的row值為0。
第二個非零元素7在第一行,行索引為0,所以該元素對應(yīng)的row值為0。
第三個非零元素2在第二行,行索引為1,所以該元素對應(yīng)的row值為1。
第四個非零元素8在第二行,行索引為1,所以該元素對應(yīng)的row值為1。
第五個非零元素5在第三行,行索引為2,所以該元素對應(yīng)的row值為2。
第六個非零元素3在第三行,行索引為2,所以該元素對應(yīng)的row值為2。
第七個非零元素9在第三行,行索引為2,所以該元素對應(yīng)的row值為2。
第八個非零元素6在第四行,行索引為3,所以該元素對應(yīng)的row值為3。
第九個非零元素4在第四行,行索引為3,所以該元素對應(yīng)的row值為3。
所以該矩陣的row為
row=([0,0,1,1,2,2,2,3,3])
參考博客:
稀疏矩陣的存儲格式 | Xiang的博客 (flyxu.github.io)
打卡圖片: