2012-07-05 58 views
4

我已經編寫了一個程序,生成一些我想計算它們的行列式的N x N矩陣。與此相關,我有兩個問題計算C數組的行列式

  • 什麼庫是最好的做法?因爲我有數百萬這樣的矩陣,所以我希望儘可能快的庫。

  • 將結果轉換爲整數時,我應該注意哪些細節?我將生成的所有矩陣都有整數行列式,我想確保沒有舍入誤差會歪曲行列式的正確值。

編輯。如果可能,請提供計算推薦庫的決定因素的示例。

+3

那麼你的意思是「數以百萬計」?涼。 – unwind 2012-07-05 13:34:31

回答

4

至於矩陣庫,它看起來像這個問題,在這裏回答:

Recommendations for a small c-based vector and matrix library

至於鑄造到一個整數:如果決定不整數,那麼你不應該將其轉換爲整數,您應該使用roundfloorceil以可接受的方式對其進行轉換。這些可能會給你不可或缺的價值,但你仍然需要施展它們;但是,您現在可以這樣做,而不用擔心丟失任何信息。

+1

實際上'floor'不返回一個整數;至於'圓':http://stackoverflow.com/questions/485525/round-for-float-in-c(這是C++,但也適用於C) – anatolyg 2012-07-05 13:41:57

+0

@anatolyg:謝謝,更新我的答案 – Dancrumb 2012-07-05 13:56:45

3

你可以用blas和lapack製作奇蹟。它們實際上是用fortran編寫的,從「c」中使用它們是一種調整。但總的來說,他們可以以驚人的速度收縮數字。

http://www.netlib.org/lapack/lug/node11.html

+0

你是肯定他們含有rutines來計算行列式? LAPACK常見問題(http://www.netlib.org/lapack/faq.html#_are_there_routines_in_lapack_to_compute_determinants)指出沒有這樣的例程。 – Jernej 2012-07-05 14:30:35

+0

該常見問題解答還表示LAPACK可以解決特徵問題(http://www.netlib.org/lapack/faq.html#_what_and_where_is_lapack)。矩陣的行列式是其特徵值的乘積。 – andand 2012-07-05 14:45:07

+1

對。但是,特徵值可能是令人討厭的實數,其中一個混亂的產品會使計算不穩定 – Jernej 2012-07-05 16:48:54

2

你有GSL,但選擇真的取決於你的矩陣。矩陣密集還是稀疏? N大還是小?對於小型N,您可能會發現使用Cramer規則或Gauss消除自己編碼行列式的速度更快,因爲大多數高性能函數庫專注於大矩陣,並且其優化可能會在簡單問題上引入開銷。