剛剛完成了一個大作業
累到爆 但很爽
因為在這當中 不僅對我的研究對象有了更深刻的了解
此外發現 我寫程式的功力沒有因為大學畢業而減弱太多
最重要的是 做完工作後的食物真的特別好吃 (XD)

今天的收穫
1. 我真的把老師給我的程式仔細的 trace 過一遍
終於了解 薛丁格方程式 特徵多項式 Jacobin-Davidson
各自是用一種怎樣的方式存在在這個程式當中
理論的數學推導跟實務的程式寫作 終於聯結在一起

2. 我忘了這個程式要做的事情 就是避免去計算大矩陣 利用其他的方式來逼近大矩陣的結果
但之前幾天我竟然呆呆的在程式海裡尋找這個大矩陣是在哪裡被造出來的
要是他真的可以被造出來 就不需要還繞一圈來解這個問題了!!
笨蛋 ><

3. Matlab 中有可以直接處理稀疏矩陣 (sparse matrix) 的 function 還蠻好用的
(要是早一點知道 就可以不用花 3, 4 個小時 自己寫一個資料結構來儲存稀疏矩陣)

所謂的稀疏矩陣是指 一個矩陣當中 大部分的元素都是 0 只有少部分的元素不是 0 的矩陣
而在矩陣計算當中 這些大量的 0 非常的討厭 暨站空間 又不能從中得到些什麼好東西
所以在儲存這樣的矩陣時 我們會希望只儲存這些非 0 的元素就好
Matlab 中 用一個 m-by-3 的矩陣來儲存稀疏矩陣
第一列儲存的是這個非 0 元素所在位置的 row index
第二列儲存的是這個非 0 元素所在位置的 column index
第三列儲存的是這個非 0 元素的值

雖然一個元素用了 3 個數字空間來儲存他
但如果原本的矩陣元素是 0 的個數與非 0 元素的個數差距太懸殊
這樣的儲存方式 反而是解省記憶體空間的

用 Matlab 所提供的格式來儲存稀疏矩陣 最大的好處是
在 Matlab 上 你可以對他做任何一般矩陣所可以做的事
例如 兩個矩陣相加 就只要寫 S + A 不需要做任何的轉換
甚至轉置 也是一樣寫成 S' 即可 這省下了我很多的時間

此外 Matlab 也提供了不少好用的 function 下面這些是我有用到的
(1) S = sparse ( A );
把一般的矩陣 A 用稀疏矩陣的儲存方式來儲存他

(2) S = sparse ( [1 3 2] , [1 2 4] , [2 4 1] , 3 , 4 );
引述的地方總共需要 5 個東西
前三個是向量 分別就是稀疏矩陣儲存的格式
第一個是 row index, 第二個是 column index, 第三個是該元素的值
(我試過 你在值的地方填 0 也是 OK 的 它會很聰明的不去儲存他)
後面兩個是數字 代表這個稀疏矩陣原本的大小
像這個例子 它是一個 3-by-4 的稀疏矩陣 裡面只有 3 個非 0 元素
(後面那兩個數字可以不填 Matlab 會以最大的 row index 與最大的 col index 當作該矩陣的大小)

(3) S = spconvert ( A );
若 A 是向上面所提到的 m-by-3 矩陣 則可以利用這個 function 宣告成稀疏矩陣
(一般的 m-by-3 矩陣和稀疏矩陣 雖然儲存方式相同 但功能確是大不相同
所以還是得經過宣告這個動作)
其實也就是 S = sparse ( A ( : , 1 ) , A ( : , 2 ) , A ( : , 3 ) ); 的簡化版

(4) A = full ( S );
把稀疏矩陣還原成原本的矩陣

(5) nnz ( S );
稀疏矩陣 S 中 非 0 元素的個數

(6) v = nonzeros ( S );
將稀疏矩陣中的非 0 元素拿出來 組成一個新的向量
說穿了 其實就是 S ( : , 3 ); 但是這樣下指令 Matlab 不會理你

(7) spy ( S );
這是最重要的一個 function 就是他會把非 0 元素的位置給表示出來
也就是說 如果我想要看這個矩陣中 非 0 元素在矩陣裡分佈的情形 就是使用這個指令
它可以配合我們在畫圖時所用的 顏色-線條-點形狀 的指令
此外 如果要調整點的大小 則在後面加上數字即可 如 spy ( S , 10 );

昌小澤 發表在 痞客邦 PIXNET 留言(0) 人氣()