2013-02-26 66 views
6

在我的一個matlab代碼中,我必須處理某個給定矩陣的Cholesky因式分解。我通常調用chol(A,'lower')來生成下三角因子。Cholesky分解

現在,用profiler檢查我的代碼,很明顯功能chol是非常耗時的,特別是如果輸入矩陣的大小變大。

因此,我想知道,如果有任何有價值的替代內置chol函數。

我一直在想LAPACK函數庫,也就是spptrf函數。它是否可用於MATLAB

任何暗示或支持都是值得歡迎的。

EDIT

只是作爲一個例子,分析器檢索此信息:

enter image description here

其中Coh_u具有大小(1395*1395)。還有,要注意的是,chol被稱爲4000次,因爲我需要膽甾醇因子4000不同的配置。

+4

背後幕後Matlab通常使用高質量的數字圖書館,這些數字圖書館在準確性,精度和速度上與現成的圖書館如BLAS,LAPACK等相同(廣義上講)。事實上,在某些情況下,Matlab使用那些庫。這很可能,但我沒有檢查,他們的'chol'的實現使用這樣的代碼。比我更好的程序員(儘管可能並不比你更好)試圖實現(以某種方式)更快的Matlab數字例程實現,並失敗了。 – 2013-02-26 14:32:35

+0

此刻我正在比較我的代碼的性能與另一個,用'fortran'編寫,並使用lapack'spptrf'。feelinf是'spptrf'比'chol'快得多,儘管在比較兩種不同語言的類似代碼時總是需要小心謹慎。我懷疑'MATLAB'內部調用'LAPACK'庫,但我不太確定。 – fpe 2013-02-26 14:39:06

回答

1

我不確定你使用的是什麼版本的matlab,但是我發現了this discussion,這表明在舊版本中Cholesky因式分解在描述時非常緩慢。

其中一個答案說使用CHOLMOD package or SuiteSparse,其中chol2函數應該是更快。

+0

我正在使用Matlab的最新版本,因此'CHOLMOD'應該已經實現。或者我認爲是這樣! – fpe 2013-02-26 15:35:42

0

,你能否證實如果Coh_u正確的表達式爲下

一)Coh_u = exp(-a.*sqrt((f(ii)/Uhub).^2 + (0.12/Lc).^2)).*(df.*psd(ii,1));

B)Coh_u = exp(-a.*dist*sqrt((f(ii)/Uhub).^2 + (0.12/Lc).^2)).*(df.*psd(ii,1));

中的差異)和b)是在b)dist已被添加,這是兩個矩陣之間的距離YZ,使得

dist = pdist2([Y(:) Z(:)],[Y(:) Z(:)]); 

但是它會導致chol()函數出現「Matrix not positive definite」錯誤。