優化
b即為a的crs表示,值(values)陣列儲存矩陣中非零元素的值。列索引(columnindex)陣列和行指標(rowptr)陣列對非零元素的位置資訊進行編碼。(我看了一下rowptr意思是在第幾個元素處換行是吧)
對稀疏性沒有要求。
#include
"spmv.h"
void
spmv
(int rowptr[num_rows+1]
,int columnindex[nnz]
, dtype values[nnz]
, dtype y[size]
, dtype x[size]
) y[i]
= y0;
}}
其標頭檔案為
#ifndef __spmv_h__
#define __spmv_h__
const
static
int size =4;
// size of square matrix
const
static
int nnz =9;
//number of non-zero elements
const
static
int num_rows =4;
// size;
typedef
float dtype;
void
spmv
(int rowptr[num_rows+1]
,int columnindex[nnz]
, dtype values[nnz]
, dtype y[size]
, dtype x[size]);
#endif
// __matrixmul_h__ not defined
函式spmv函式有5個引數,分別是rowptr、columnindex ,以及 values 對應矩陣 m 的 crs 格式中包含的3個引數。引數 y 用於儲存輸出的結果,引數x表示輸入的被乘向量x。變數num_rows表示矩陣m中行號。變數nnz表示矩陣中非0元素的個數。最後,變數size表示陣列x和陣列y中元素的個數。
外層for迴圈標籤為l1,對矩陣的行進行遍歷。將矩陣當前的行與向量x相乘,得到輸出的結果y。內層迴圈標籤為l2,實現對矩陣m中每列元素的遍歷。l2迴圈迭代計算rowptr[i + 1] − rowptr[i]計算每一行非0元素的個數。每次迴圈計算,能從value陣列中讀取矩陣m的非0元素然後對應的從x陣列中取得被乘向量x的值,對應相乘。cloumnindex[k] 中的值儲存了對應的列號k。
#include
"spmv.h"
#include
void
matrixvector
(dtype a[size]
[size]
, dtype *y, dtype *x)
}int
main()
,,,}
; dtype x[size]=;
dtype y_sw[size]
; dtype values=
;int columnindex=
;int rowptr=
; dtype y[size]
;spmv
(rowptr, columnindex, values, y, x)
;matrixvector
(m, y_sw, x)
;for
(int i =
0; i < size; i++)if
(y_sw[i]
!= y[i]
) fail =1;
if(fail ==1)
printf
("failed\n");
else
printf
("pass\n");
return fail;
}
連同之前的原始檔標頭檔案一同建立工程
稀疏矩陣向量乘法可優化的方式
廣告時間
fpga入門
fpga實戰訓練精粹
xilinx fpga權威設計指南:基於vivado 2018整合開發環境
xilinx zynq7020
fpga設計技巧與案例開發詳解(第2版)
稀疏矩陣 稠密矩陣 稀疏表示 字典學習概念
稀疏矩陣 矩陣中0元素的個數遠大於非零,且0元素分布無規律。稠密矩陣 稀疏矩陣反之。稀疏表示 尋找乙個係數矩陣a k n 以及乙個字典矩陣b m k 使得b a盡可能的還原x,且a盡可能的稀疏。a便是x的稀疏表示。書上原文為 將乙個大矩陣變成兩個小矩陣,而達到壓縮 字典學習 為普通稠密表達的樣本找到...
機器學習 稀疏矩陣的處理
一 稀疏矩陣的定義 對於那些零元素數目遠遠多於非零元素數目,並且非零元素的分布沒有規律的矩陣稱為稀疏矩陣 sparse 人們無法給出稀疏矩陣的確切定義,一般都只是憑個人的直覺來理解這個概念,即矩陣中非零元素的個數遠遠小於矩陣元素的總數,並且非零元素沒有分布規律。二 稀疏矩陣的壓縮儲存 由於稀疏矩陣中...
五 1 1 稀疏矩陣乘法的快速運算
有矩陣m和n,都是用三元組壓縮儲存,設計高效率演算法求矩陣m n得到的矩陣q 也用三元組壓縮儲存 假設矩陣m n q 如下 那麼得到的矩陣q有三行三列,第一行中的元素有這樣的關係 所以我們可以這樣,在遍歷到m11時,由於n11,n12,n13是在順序表中連續排列的,所以我們可以建立乙個3個累加器 i...