最近一段時間寫的程式需要解矩陣的特徵值與特徵向量,本來以為不是特別複雜的問題,由於問題規模比較大(矩陣大約需要15000*15000那麼大,甚至更大)而且要計算的盡量快而變得異常複雜。當然用matlab是相當容易的,但要求使用C或者C++的程式......
我嘗試了幾種不同的方法,已經把自己搞的快糊塗了,在這裡分幾次總結一下:
最初的想法的使用冪法和反冪法來解,這也是因為對這樣的方法不是很熟悉,其實用冪法與反冪法只能解距離某個特定點最近和最遠的特徵值(特殊情況就是特定點是0的時候,只能求最大和最小特徵值)。在網上找了一下之後,覺得這個演算法並不如何複雜,就自己寫了一下,至於這個演算法google一下冪法和反冪法,就可以找到很多,基本按照這樣的思路就可以順利的寫下來。我把自己寫的代碼放在http://download.csdn.net/source/2836321其實裡面沒有特別的東西,而且反冪法的演算法並不難,但是不同的處理方法時間效率是不同的,因為反冪法的演算法過程中要頻繁的解線性方程組,如果這個比較慢,那反冪法基本就沒有什麼價值了(這也是我後來放棄使用自己寫的反冪法的原因之一)。我寫的這個演算法用做練習還可以,解規模小一些的矩陣也看不出什麼,但要解大規模的矩陣是不靠譜的,因此寫在這裡也只是記錄一下自己的這個工作。
後來的時候我發現自己解的問題不是求一個普通大規模矩陣的特徵值,而是解一個大規模疏鬆陣列的部分特徵值。想到這個之後我簡單查了一下資料,就覺得自己寫一個這樣的高效演算法不太靠譜,首先這個演算法就很複雜,而我也不是專門寫這個的,只是用一下而已,因為靠譜的路就是去找一個好一點兒的C或者C++的庫,使用它的高效的解特徵值與特徵向量的功能。
順便提一下MATLAB裡的解特徵值與特徵向量的功能,解全部的特徵值的函數是[v d]=eig(A),而MATLAB裡也有可以解一部分特徵值的函數,即eigs函數,而且也可以用來解廣義特徵值問題。而且MATLAB還是相當高效的,如果是疏鬆陣列的話會更快,能使用matlab的話確實能省不少的心。