2010-12-10 16 views
-1

我正在尋找一個C/C++接口,用於在Linux中高效計算巨大稀疏矩陣。該矩陣可能是數百萬/千。我已經檢查了一些現有的庫,但它們似乎沒有一個滿足我所有的要求,我需要通過向它動態添加元素來創建一個稀疏矩陣。 (不適用於SparseLib ++)尋找一個C/C++接口,用於Linux中巨大稀疏矩陣的高效計算

2,我還需要能夠創建一個稀疏對角矩陣,以便我可以用不同的標量縮放另一個稀疏矩陣的列。 (沒有爲此找到一個庫,也許還有另一種按列縮放稀疏矩陣的方法)

3,它需要支持矩陣乘以矩陣/向量的操作(許多庫支持這些基本操作)

4,它需要支持兩個稀疏矩陣或向量之間的條目乘法或除法,例如MATLAB中的。*或./(沒有爲此找到一個庫,我需要這個操作來篩選出一個稀疏矩陣與另一個稀疏矩陣的條目)

5,矩陣求逆或線性求解器。 (大多數庫提供線性系統的解算器)

我最初使用Python中的scipy來實現我的算法。 Python消耗太多內存,速度很慢,這就是爲什麼我想將我的程序轉換爲C的原因。

謝謝。

+0

要求1和4是最難滿足。 – 2010-12-12 13:11:42

回答

2

我會推薦蒂姆戴維斯CSparse。

+0

感謝您的快速回復。閱讀源代碼讓我意識到,也許我可以添加現有庫中缺少的功能。 – Xatan 2010-12-10 22:48:12

1

我很高興使用英特爾的MKL

1

唉,大多數稀疏矩陣庫使用的格式非常難以動態設置元素(谷歌壓縮稀疏行,這是最常見的格式)。

正如你所說,大多數圖書館爲您提供除#1以外的所有要求。對於#2,一旦理解了存儲格式,通常很容易。

英特爾MKL提供PARDISO求解器,它不強制執行格式,只需要您可以執行矩陣/向量產品:您可以在循環中調用解算器,從中獲取返回碼,並執行它要求你做(乘以A,檢查終止條件,預處理,...)。這樣,您可以使用任何您需要的存儲方案。例如,如果您不想存儲矩陣,或者存在時髦的存儲格式,這很有用。

您的要求(特別是#1)是quadtree based sparse matrices的理想選擇。但是,我不知道這個有什麼好的實現。如果你設法編碼/找到它的實現,我會很感激。

+0

謝謝。但它看起來不是免費的,即使在學術上也是如此。 – Xatan 2010-12-14 02:32:01

+0

不,不是。但如果你有Intel硬件,它提供了優化的BLAS和LAPACK例程,你可能有興趣在 – 2010-12-14 09:25:14

+0

注意,如果只有求解的利益,你,你可以實現自己stablilzed GMRES算法。這不是很難實現,你只需要能夠做矩陣矢量產品。 – 2010-12-14 10:52:51

1

你看過LinBox嗎?它支持多種稀疏矩陣存儲格式,其中一些讓你在基質被創建後設置項:

// set m[i,j] to a 
m.refEntry(i, j) = a; 

我不知道您的要求4.是否滿足外的開箱,但它當然可以使用refEntry方法進行編碼。

+0

謝謝。我很高興能有一種方法來實施入門級操作。 – Xatan 2010-12-14 02:20:58

0

嘗試TAUCSMUMPS

我親自試過TAUCS的項目中使用它,這樣會給你可以處理大小的指示解決的萬人X百萬量級的稀疏矩陣圖像處理。

我與亞歷山大同意這些軟件包中包含有自己的「格式」對於如何在稀疏矩陣編碼但那是不可避免的,因爲你得告訴非零元素的解算器。但在光明的一面,他們並不難學。 TAUCS順便說一下,使用壓縮列存儲(CCS)格式。亞歷山大所指的可能是壓縮行存儲(CRS)。有我認爲其中明確編碼具有第(i,j)的矩陣中的元素的「位置」的元素值,但也差不多了1種流行的格式。

有關這些軟件包的詳細信息,請參閱www.matrixprogramming.com