封存 Archive
封存 Archive
計算數學入門系列 - 矩陣的儲存(二)
- 取得連結
- X
- 電子郵件
- 其他應用程式
上面這個例子,我們就設定了一個中等大小的矩陣,在一些問題裏面已經非常有用。可是有一點要特別小心,如果這個變量n 是更大,就比如說30000 ,上面這個方法就已經對電腦的儲存空間造成很大的負擔。主要的問題是,定義一個30000×30000 的矩陣,電腦就必須儲存9 千萬個數字。在MATLAB 內,就需要差不多1.8GB 的內存空格。
要解決這個問題,我們可以看見這9 千萬個數字裏面大部份都是0,而且這些數字在運算過程內我們可能根本沒有機會用到。所以雖然說1.8GB 的儲存空間,可是大部份根本沒有機會用到而浪費掉了。當我們要處理這些非常大的稀疏矩陣,我們可以使用MATLAB 另一個矩陣儲存方式,我們只需要把矩陣內不是0的地方標示出來就可以了。 以上面一個10×10的三對角矩陣為例,我們知道這個矩陣一共有10+9+9=28 個不是0的元素,所以我們可以先設定
>> D=zeros(28,3);
D 是一個28×3的矩陣,每一橫行代表着一個不是等於0元素。我們會用前兩個數字 去代表位置,最後一個代表他的數值。
>> D(1:10,1)=1:10;
>> D(1:10,2)=1:10;
>> D(1:10,3)=-2;
這樣,我們就把矩陣的對角線上的元素定義好。再把
>> D(11:19,1)=1:9;
>> D(11:19,2)=2:10;
>> D(11:19,3)=1;
>> D(20:28,1)=2:10;
>> D(20:28,2)=1:9;
>> D(20:28,3)=1;
矩陣內所有不是零的元素都已經定義後,我們再用
>> D=spconvert(D);
這個稀疏矩陣就完成了。這個方法的問題,是如果矩陣的大小有所改變,我們就必須要把不是零元素的數目重新設定,然後很小心的把位置計算清楚。但是,如果我們所需要定義的矩陣並沒有一些特別的特徵,我們很可能還是要用這個方法把元素一個一個的設定出來。
比較方便改變的方法,可以使用MATLAB內置函數speyes 或spdiags
>> n=30000;
>> tmp = ones(n,1);
>> E = spdiags([tmp -2*tmp tmp], -1:1, n, n);
>> whos
Name Size Bytes Class Attributes
E 30000x30000 1679976 double sparse
n 1x1 8 double
tmp 30000x1 240000 double
我們可以看見,雖然E是一個30000×30000矩陣,但是他只需要1.7MB的內存空間。
你會問,為什麼我們只關心稀疏矩陣的定義呢?簡單的來說,是由於很多在應用數學的問題,都只涉及局部資訊(Local Information)而很少需要整體(Global)的訊息。而這些局部資訊的關聯性,就顯示在矩陣的係數裏面。在社會隔離的數學模型,又或者是生命遊戲的程式編寫內,我們都只考慮在鄰近地區對每一方格的影響。所以,當我們把整個數學模型寫出來,就可以看見一個稀疏的矩陣。 在圖像修復的討論裏面,我們也只考慮每一像素旁邊的顏色,所以得出的矩陣也會是稀疏的。當然,在一些紋理圖像修復的數學模型,我們就需要考慮圖像整體的結構,所得出的矩陣就很可能是一個全矩陣。
- 取得連結
- X
- 電子郵件
- 其他應用程式
留言
發佈留言