2013-09-05 42 views
1

我有一個稀疏矩陣D,我想乘以D_transpose和D來獲得L,如下所示:我如何乘以C中的兩個稀疏矩陣?

L = D'* D;

我正在使用sparseBLAS來處理稀疏矩陣,但documentation說沒有什麼可以乘以兩個稀疏矩陣。

我完全卡住了,不知道如何繼續。

D的尺寸通常約爲500,000乘以250,000。我根本無法分配那麼多的內存,所以只需要使用稀疏矩陣來完成。

我用MATLAB做了這個,我不明白MATLAB如何在它的界面下面使用sparseBLAS - 或者它是這樣做的嗎?如果不是,它使用什麼?我也可以使用它。

謝謝您的閱讀!

編輯:解決。我需要L矩陣與矢量相乘。因此,不是首先計算L,而是簡單地執行D'*(D * x),從而避免了兩個稀疏矩陣相乘的需要。我現在只做sparseBLAS支持的稀疏矩陣和密集矢量乘法。

+0

您也可以從C應用程序調用Matlab函數。搜索「Matlab編譯器運行時」。 – Nemo

回答

0

據我所知,你的問題主要是在存儲器中存儲巨大的矩陣。您可以將這些值存儲在(行,列)對中。例如,

1 0 0 
0 0 2 
0 4 0 

這個矩陣可被存儲在一個std::map<pair<int, int>, int>爲:

map[make_pair(1, 1)] = 1 
map[make_pair(2, 3)] = 2 
map[make_pair(3, 2)] = 4 

現在運算部。假設第一矩陣存儲在map1,第二矩陣存儲在map2和答案存儲在mapAns

for each element x in map1: 
    for each element y in map2: 
     if x.column == y.row: 
      mapAns[x.row, y.column] += x.value * y.value 

您需要使用地圖,如自定義的數據結構,如果你想要做相同的C.

+0

他並不是在問如何實現稀疏矩陣,因爲他已經在使用支持它的庫。 – RedX

+0

對於大矩陣,COO格式通常效率不高。 (取決於非零值的數量) – Michael

1

它實際上是在發佈的文檔中陳述。

頁11

5.2使用稀疏BLAS矩陣

一旦稀疏BLAS矩陣手柄已經完全構造(某物 可以通過檢查屬性blas_valid_handle進行測試),也可以到 使用矩陣句柄來執行操作。 此時支持表3.2和3.3中顯示的 四個操作。 除了使用稀疏BLAS矩陣執行操作外,還有可能通過 通過句柄查詢其屬性。表5.5列出了通過調用get properties例程可獲得的屬性 。

表3。3第4頁

USMM稀疏矩陣,矩陣乘法

所以支持似乎是在那裏。我只是找不到BLAS_usmm函數的簽名。也許你可以檢查標題。

編輯:如果您從NIST獲得了sparseBLas,則可以檢查blas_sparse_proto.h文件中BLAS_*usmm函數的簽名和參數。

/* Level 3 Computational Routines */ 

int BLAS_susmm(enum blas_order_type order, enum blas_trans_type transa, 
    int nrhs, float alpha, blas_sparse_matrix A, const float *b, int ldb, 
     float *c, int ldc); 
int BLAS_dusmm(enum blas_order_type order, enum blas_trans_type transa, 
     int nrhs, double alpha, blas_sparse_matrix A, const double *b, 
     int ldb, double *c, int ldc); 
int BLAS_cusmm(enum blas_order_type order, enum blas_trans_type transa, 
     int nrhs, const void *alpha, blas_sparse_matrix A, const void *b, 
    int ldb, void *c, int ldc); 
int BLAS_zusmm(enum blas_order_type order, enum blas_trans_type transa, 
     int nrhs, const void *alpha, blas_sparse_matrix A, const void *b, 
    int ldb, void *c, int ldc); 
+0

謝謝。其實我正在尋找乘兩個稀疏矩陣,而不是一個密集矩陣的稀疏矩陣。你描述的功能是針對後者的情況。不過,我發現了一種避開這個問題的方法。感謝您的輸入! – user1096863